Home Blog Page 135

Python: Sự khác nhau giữa List và Tuple?

Python: Sự khác nhau giữa List và Tuple?

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

Bạn vừa tìm hiểu về lists và tuples và bạn đang tự hỏi làm thế nào chúng khác nhau?

Đây là một câu hỏi phổ biến đáng ngạc nhiên.

Cả 2 cũng khá giống nhau.

Cả lists và tuples là các kiểu dữ liệu chuỗi có thể lưu trữ một bộ sưu tập các item(mục).

Mỗi item được lưu trữ trong một list  hoặc một tuple có thể thuộc bất kỳ loại dữ liệu nào.

Và bạn cũng có thể truy cập bất kỳ item nào theo chỉ mục của nó.

Vì vậy, câu hỏi là, họ có khác nhau không?

Và nếu không, tại sao chúng ta có hai loại dữ liệu hoạt động khá giống nhau?

Chúng ta không thể sống với lists hoặc tuples?

Vâng, chúng ta hãy cố gắng tìm câu trả lời.

Sự khác biệt chính giữa list và Tuple

Sự khác biệt chính giữa list và tuples là thực tế là list có thể thay đổi (mutability) trong khi bộ dữ liệu là bất biến (immutability) .

Điều đó có nghĩa gì, bạn nói gì?

Một kiểu dữ liệu có thể thay đổi có nghĩa là một đối tượng python thuộc loại này có thể được sửa đổi.

Một đối tượng bất biến không thể.

Chúng ta hãy xem điều này có nghĩa là gì.

Hãy tạo một list và gán nó cho một biến.

>>> a = ["apples", "bananas", "oranges"]

Bây giờ hãy xem điều gì xảy ra khi chúng ta cố gắng sửa đổi item(mục) đầu tiên của danh sách.

Chúng ta hãy thay đổi apples thành một berries .

>>> a[0] = "berries"
>>> a
['berries', 'bananas', 'oranges']

Hoàn hảo! mục đầu tiên của a đã thay đổi.

Bây giờ, điều gì sẽ xảy ra nếu chúng ta muốn thử điều tương tự với một tuple thay vì một list? Hãy xem nào.

>>> a = ("apples", "bananas", "oranges")
>>> a[0] = "berries"
Traceback (most recent call last):
    File "", line 1, in
TypeError: 'tuple' object does not support item assignment

Lý do chúng tôi gặp lỗi này là vì các đối tượng tuple, không giống như list, là bất biến, điều đó có nghĩa là bạn không thể sửa đổi một đối tượng tuple sau khi nó được tạo.

Nhưng chờ đã, hãy xem ví dụ sau:

>>> a = ("apples", "bananas", "oranges")
>>> a = ("berries", "bananas", "oranges")
>>> a
('berries', 'bananas', 'oranges')

Ô điều gì đã xảy ra vậy?

Hãy xem, chúng ta có thực sự sửa đổi item đầu tiên trong tuple a với code ở trên không?

Câu trả lời là Không , hoàn toàn không.

Để hiểu tại sao, trước tiên bạn phải hiểu sự khác biệt giữa một biến và một đối tượng python.

  Chuyển đổi Unicode dựng sẵn & tổ hợp với Python

Sự khác biệt giữa một biến và một đối tượng

Bạn có thể nhầm lẫn các biến với các đối tượng. Đây là một quan niệm sai lầm rất phổ biến ở những người mới bắt đầu.

Hãy nhớ rằng một biến không là gì ngoài tham chiếu đến đối tượng python thực tế trong bộ nhớ.

Bản thân biến không phải là đối tượng.

Ví dụ: chúng ta hãy cố gắng hình dung những gì xảy ra khi bạn gán một list (danh sách) cho một biến a .

>>> a = ["apples", "bananas", "oranges"]

Khi bạn làm điều này, một đối tượng python kiểu list kiểu được tạo trong bộ nhớ và biến a tham chiếu đến đối tượng này bằng cách giữ vị trí của nó trong bộ nhớ .

Python: Sự khác nhau giữa List và Tuple?

Trong thực tế, bạn thực sự có thể lấy lại vị trí của đối tượng list trong bộ nhớ bằng cách kiểm tra a  bằng cách sử dụng function  id () .

>>> a = ["apples", "bananas", "oranges"]
>>> id(a)
26953168

Bây giờ nếu bạn sửa đổi chỉ item đầu tiên của danh sách và kiểm tra lại id () , bạn sẽ nhận được cùng một giá trị chính xác vì a vẫn đang tham chiếu đến cùng một đối tượng.

>>> a[0] = "berries"
>>> id(a)
4340729544

Hình dưới đây cho thấy chính xác những gì đã xảy ra sau khi sửa đổi.

Python: Sự khác nhau giữa List và Tuple?

Bây giờ, hãy xem điều gì xảy ra nếu chúng ta thực hiện điều tương tự trên các tuples.

>>> a = ("apples", "bananas", "oranges")
>>> id(a)
4340765824
>>> a = ("berries", "bananas", "oranges")
>>> id(a)
4340765464

Như bạn có thể thấy, hai địa chỉ là khác nhau.

Điều này có nghĩa là sau lần gán thứ hai, a đang đề cập đến một đối tượng hoàn toàn mới.

Con số này cho thấy chính xác những gì đã xảy ra.

Python: Sự khác nhau giữa List và Tuple?

Hơn nữa, nếu không có biến nào khác trong chương trình của bạn đề cập đến bộ dữ liệu cũ hơn thì trình thu gom rác của python sẽ xóa hoàn toàn bộ dữ liệu cũ khỏi bộ nhớ.

Vì vậy, bạn có nó, khái niệm về khả năng biến đổi này là sự khác biệt chính giữa list và tuples.

Mutability (khả năng biến đổi)  không chỉ là một khái niệm python, nó là một khái niệm ngôn ngữ lập trình mà bạn sẽ gặp trong các ngôn ngữ lập trình khác nhau .

Nhưng bây giờ có lẽ toàn bộ cuộc thảo luận này gợi lên một câu hỏi khác trong đầu bạn.

Tại sao chúng ta có các đối tượng có thể thay đổi và bất biến?

  Chạy Python web app

Tại sao chúng ta cần các đối tượng có thể thay đổi và bất biến?

Thật ra, cả hai đều phục vụ các mục đích khác nhau.

Chúng ta hãy thảo luận về một số khía cạnh phân biệt giữa các đối tượng có thể thay đổi và bất biến

1. Hiệu suất bổ sung

Python: Sự khác nhau giữa List và Tuple?

Khả năng tương tác sẽ hiệu quả hơn khi bạn biết bạn sẽ thường xuyên sửa đổi một đối tượng.

Ví dụ: giả sử bạn có một số đối tượng có thể lặp lại (iterable object) (giả sử x) và bạn muốn nối từng phần tử của x vào danh sách.

Tất nhiên bạn chỉ có thể thực hiện L = list (x) kiểu như thế này:

L  = []
for item in x:
    L.append(item)

Điều này hoạt động ổn. Bạn tiếp tục sửa đổi đối tượng danh sách tại chỗ cho đến khi tất cả các yếu tố của x tồn tại trong danh sách L .

Nhưng bạn thậm chí có thể tưởng tượng điều gì sẽ xảy ra nếu chúng ta đã sử dụng một tuple thay thế?

T  = ()
for item in x:
    T = T + (item,)

Bạn có thể hình dung những gì đang xảy ra trong bộ nhớ?

Vì các bộ dữ liệu là bất biến, về cơ bản, bạn đang sao chép nội dung của bộ dữ liệu Tsang một đối tượng bộ dữ liệu mới tại Mỗi lần lặp.

Nếu vòng lặp for lớn, đây là một vấn đề hiệu năng rất lớn.

Trên thực tế, chúng ta hãy sử dụng python để đo hiệu suất của việc thêm vào list so với việc thêm vào một tuple khi x = range (10000).

Bài viết này hướng dẫn bạn cách sử dụng module time để đo thời gian thực hiện của nhiều dòng python .

$ python3 -m timeit \
-s "L = []" \
-s "x = range(10000)" \
"for item in x:" "    L.append(item)"
1000 loops, best of 3: 1.08 msec per loop

Khá tốt, mất khoảng 1,08 mili giây .

Sẽ thế nào nếu chúng ta làm điều tương tự với tuples?

$ python3 -m timeit \
-s "T = ()" -s "x = range(10000)" \
"for item in x:" "    T = T + (item,)"
10 loops, best of 3: 1.63 sec per loop

Một con lớn hơn rất nhiều 1,63 giây ! ( gấp khoảng 1500 lần)

Đây là một sự khác biệt lớn về hiệu suất giữa các list và tuples.

Nếu bạn muốn kiểm tra sự kiên nhẫn của mình, hãy thử x = range(1000000).

Bây giờ khi ai đó nói với bạn việc append nhiều lần vào một đối tượng string(chuỗi) không hiệu quả, bạn sẽ hiểu chính xác lý do tại sao (các đối tượng chuỗi cũng không thay đổi trong python).

    Hiệu suất bổ sung: Thắng: đối tượng có khả năng thay đổi

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

2. Dễ dàng gỡ lỗi

Python: Sự khác nhau giữa List và Tuple?

Mutility (khả năng biến đổi)  là tuyệt vời và tất cả nhưng một điều có thể thực sự gây phiền nhiễu với các đối tượng có thể thay đổi là gỡ lỗi.

Ý tôi là gì?

Chúng ta hãy xem ví dụ rất đơn giản này.

>>> a = [1, 3, 5, 7]
>>> b = a
>>> b[0] = -10
>>> a
[-10, 3, 5, 7]

Lưu ý rằng khi chúng ta gán b = a , chúng ta sẽ không sao chép đối tượng list từ b sang a .

Chúng tôi thực sự nói với python rằng hai biến a và b nên tham chiếu cùng một đối tượng danh sách.

Bởi vì a vị trí có hiệu quả giữ vị trí của đối tượng Python trong bộ nhớ, khi bạn nói b = a bạn sao chép vị trí địa chỉ đó (không phải đối tượng thực tế) vào b .

Điều này dẫn đến việc có hai tham chiếu (a và b) cho cùng một đối tượng list.

Nói cách khác, khi chúng ta thực hiện b [0] = -10 , nó có tác dụng tương tự như a[0] = -10 .

Tất nhiên bạn có thể nhìn vào code và nghĩ đúng rằng nó rất dễ gỡ lỗi.

Chà, bạn đúng với những đoạn code nhỏ như thế này, nhưng hãy tưởng tượng nếu bạn có một dự án lớn với nhiều tham chiếu đến cùng một đối tượng có thể thay đổi.

Sẽ rất khó khăn để theo dõi tất cả các thay đổi đối với đối tượng này bởi vì bất kỳ sửa đổi nào trong số các tham chiếu đó sẽ sửa đổi đối tượng.

Đây không phải là trường hợp với các đối tượng bất biến ngay cả khi bạn có nhiều tài liệu tham khảo đến chúng.

Một khi một đối tượng bất biến được tạo ra, nội dung của nó sẽ không bao giờ thay đổi.

Dễ dàng gỡ lỗi: Thắng: đối tượng bất biến!

3. Hiệu quả bộ nhớ

Python: Sự khác nhau giữa List và Tuple?

Một lợi ích khác của tính bất biến là nó cho phép thực hiện ngôn ngữ để có hiệu quả bộ nhớ cao hơn.

Hãy để tôi giải thích những gì tôi có ý nghĩa bởi điều đó.

Trong CPython  (cách triển khai Python phổ biến nhất) nếu bạn tạo các đối tượng bất biến có cùng giá trị, python (trong một số điều kiện nhất định) có thể bó các đối tượng khác nhau này thành một.

Ví dụ, hãy xem code này:

>>> a = "Nguyenpv"
>>> b = "Nguyenpv"
>>> id(a)
58752160
>>> id(b)
58752160

Hãy nhớ rằng String(Chuỗi) (cũng như Integer, Float và Bools) đều là ví dụ về các đối tượng bất biến.

Như bạn có thể thấy, mặc dù trong chương trình python của chúng tôi, chúng tôi đã tạo rõ ràng hai đối tượng chuỗi khác nhau, python đã bó chúng lại thành một.

Làm thế nào chúng ta biết điều đó?

À bởi vì danh tính của a giống hệt như danh tính của b .

Python đã có thể làm điều đó bởi vì tính bất biến của chuỗi giúp cho việc thực hiện gói này an toàn.

Điều này không chỉ giúp chúng ta tiết kiệm bộ nhớ (bằng cách không lưu trữ chuỗi nhiều lần trong bộ nhớ) mà còn mỗi khi bạn muốn tạo một đối tượng mới có cùng giá trị, python sẽ chỉ tạo một tham chiếu đến đối tượng đã tồn tại trong bộ nhớ chắc chắn hiệu quả hơn.

Khái niệm này được gọi là String Interning , và đây là một bài viết tuyệt vời nếu bạn muốn tìm hiểu sâu hơn .

Không chỉ strings. Điều này cũng áp dụng cho integer (số nguyên) (trong điều kiện nhất định).

>>> a = 1
>>> b = 1
>>> id(a)
1788568672
>>> id(b)
1788568672

Điều đó thật tuyệt phải không?

Thế còn tuples thì sao?

CPython cho đến khi python 3.6 đưa ra quyết định thiết kế không tự động bundle (bó) hai bộ dữ liệu tương đương thành một.

>>> a = (1, 2)
>>> b = (1, 2)
>>> id(a)
58751816
>>> id(b)
58751536

Như bạn có thể thấy, a có bản sắc khác với b .

Quyết định thiết kế này có ý nghĩa bởi vì thực hiện thực tập cho các tuples đòi hỏi phải đảm bảo rằng tất cả các item (mục, phần tử) của tuples là bất biến.

Hiệu quả bộ nhớ: Thắng: bất biến

Phần kết luận

Để hiểu sự khác biệt giữa lists và tuples trong python, trước tiên bạn phải hiểu khái niệm về tính biến đổi (mutability) / immutability  (bất biến).

Lists là các đối tượng có thể thay đổi, có nghĩa là bạn có thể sửa đổi một đối tượng list sau khi nó được tạo.

Mặt khác, các tuple là các đối tượng bất biến, có nghĩa là bạn không thể sửa đổi một đối tượng tuple sau khi nó được tạo.

Cả Mutility(có thể thay đổi) và Immutability (bất biến) đều có những ưu điểm và nhược điểm riêng.

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

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

Tuyển dụng lập trình viên lương cao trên TopDev

Giới thiệu về Reactive Relational Database Connectivity (R2DBC)

Giới thiệu về Reactive Relational Database Connectivity

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

Lúc trước, khi làm việc với các ứng dụng với cơ chế Reactive có sử dụng database, chúng ta thường sẽ sử dụng MongoDB database bởi vì lúc đó rất ít database hỗ trợ cơ chế Reactive ngoại trừ MongoDB. Nhưng hiện tại thì các bạn không cần nhất thiết phải sử dụng MongoDB nữa, Reactive Relational Database Connectivity (R2DBC) sẽ giúp chúng ta làm việc với nhiều relational database system khác theo cơ chế Reactive. R2DBC là một spec định nghĩa cách thức chúng ta sẽ làm việc với các relational database như MySQL, PostgreSQL, … theo cơ chế Reactive là như thế nào. Nó cung cấp cho chúng ta một bộ thư viện Service Provider Interface (SPI) giúp chúng ta có thể implement driver cho từng loại database system tương ứng. Có nhiều driver đã hiện thực bộ SPI này, ví dụ như R2DBC PostgreSQL hiện thực R2DBC cho PostgreSQL database, tương tự chúng ta cũng có R2DBC MySQL hỗ trợ cho MySQL database, … Trong bài viết này, mình sẽ giới thiệu với các bạn về R2DBC với một ví dụ về cách sử dụng R2DBC PostgreSQL driver để thao tác với PostgreSQL database các bạn nhé!

  3 bước tối ưu hiệu năng React App bằng các API mới của React
  Giới thiệu về Reactive Programing trong javascript

Các bạn có thể xem detail về nội dung specs mà R2DBC định nghĩa ở đây.

Đầu tiên, mình sẽ tạo mới một Maven project:

Giới thiệu về Reactive Relational Database Connectivity (R2DBC)

với R2DBC PostgreSQL driver dependency như sau:

<dependency>
    <groupId>io.r2dbc</groupId>
    <artifactId>r2dbc-postgresql</artifactId>
    <version>0.8.6.RELEASE</version>
</dependency>

Tương tự như khi các bạn làm việc với JDBC, điều đầu tiên chúng ta cần làm việc với một database bất kỳ là setup connection tới nó. Với R2DBC, chúng ta sẽ sử dụng đối tượng ConnectionFactory để làm điều này.

Có 2 cách để chúng ta có thể làm được điều này trong R2DBC đó là:

  • Sử dụng connection URL
  • Sử dụng trực tiếp code Java

Với connection URL thì các bạn có thể sử dụng URL sau cho PostgreSQL database (các database system khác thì connection URL sẽ khác một xí các bạn nhé!):

Trong đó:

  • host là PostgreSQL server,
  • port là port PostgreSQL đang chạy. Port mặc định của PostgreSQL là 5432 nha các bạn!
  • database là tên database mà chúng ta sẽ làm việc.
  • username là user đăng nhập vào PostgreSQL database
  • password là mật khẩu của user

Sau đó thì sử dụng đối tượng ConnectionFactories để get đối tượng ConnectionFactory từ connection URL này:

Nếu các bạn sử dụng code Java thì có thể sử dụng đối tượng Builder trong class ConnectionFactoryOptions để làm điều này:

Sau khi đã có đối tượng ConnectionFactory xong, chúng ta có thể tạo một Publisher các connection tới database bằng cách gọi:

Khởi tạo đối tượng Flux của Project Reactor để subcribe đối tượng Publisher này:

Bây giờ thì chúng ta có thể sử dụng connection từ đối tượng Mono này để thao tác với database rồi, ví dụ như:

Ở đây, chúng ta sử dụng phương thức createStatement() để truyền vào câu query mà các bạn muốn sử dụng để đối tượng Connection execute và trả về kết quả.

Giờ ví dụ trong database test của PostgreSQL database server của mình có một table tên là student với các column name và address như sau:

Để insert một record mới vào table này với R2DBC, mình sẽ viết code như sau:

Như các bạn thấy, chúng ta có thể bind giá trị mà chúng ta muốn vào câu query sử dụng phương thức bind() của đối tượng Statement và sau khi đã bind dữ liệu xong, chúng ta có thể gọi phương thức execute() của đối tượng Statement này để chạy câu lệnh SQL.

Xem thêm việc làm React cho SV mới ra trường tại đây

Kết quả sau khi execute câu lệnh SQL sẽ được trả về trong đối tượng Result của R2DBC, chúng ta phải consume đối tượng Result này thì câu lệnh SQL mới fully execute được. Do đó, chúng ta cần viết thêm code như sau:

Phương thức getRowsUpdated() sẽ trả về số record được cập nhập sau khi execute câu lệnh SQL. Đối tượng Result còn chứa một phương thức khác tên là map() giúp chúng ta có thể lấy được data trả về từ database, với câu lệnh SELECT chẳng hạn.

Chúng ta cần gọi phương thức subscribe() để subcribe vào Publisher.

Toàn bộ code có thể viết lại như sau:

package com.huongdanjava.r2dbcpostgresql;

import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.Result;
import reactor.core.publisher.Flux;

public class Application {

public static void main(String[] args) throws InterruptedException {
ConnectionFactory connectionFactory = ConnectionFactories
     .get("r2dbc:postgresql://khanh:123456@localhost:5432/test");

Flux.from(connectionFactory.create())
.flatMap(connection -> connection.createStatement("INSERT INTO student (name, address) VALUES ($1, $2)")
      .bind("$1", "khanh")
      .bind("$2", "Ho Chi Minh")
      .execute())
.flatMap(Result::getRowsUpdated)
.doOnNext(s -> System.out.println(s))
.subscribe();

Thread.sleep(5000);
}

}

Ở đây, mình có sử dụng thêm phương thức doOnNext() để lấy về thông tin số record được cập nhập trong database. Và vì chúng ta cần đợi cho chương trình chạy hoàn thành rồi mới exit nên mình cũng sử dụng thêm Thread.sleep() 5 giây để làm việc này.

Kết quả khi chạy đoạn code trên như sau:

Giới thiệu về Reactive Relational Database Connectivity (R2DBC)

Check database:

Giới thiệu về Reactive Relational Database Connectivity (R2DBC)

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

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

Xem thêm Việc làm database, tuyển dụng IT hấp dẫn trên TopDev

Đâu là những thách thức đối với Freelancer IT?

freelancer IT
freelancer IT

Lập trình viên IT luôn có những thách thức tồn tại? Vậy đối với một freelancer IT thì sẽ thế nào? Đâu là trình độ đủ chuẩn của một freelancer IT? Cùng TopDev tìm hiểu bài viết sau đây nhé!

Freelancer là gì? Thế nào là Freelancer IT?

Những người làm công việc với một thời gian không bị bó buộc; tự chủ về không gian được xem là một freelancer. Nhiều freelancer làm việc toàn thời gian hoặc chỉ làm việc vào thời gian rảnh của họ (cam kết với doanh nghiệp/khách hàng).

freelancer IT
Freelancer IT được định nghĩa như thế nào?

Hiểu một cách đơn giản, Freelancer IT (người làm lập trình tự do) với đặc tính trải nghiệm các công việc một cách tự do. Họ thật sự được thỏa mãn về nhu cầu thời gian, môi trường. Họ được trả tiền để đảm bảo các nhiệm vụ về ngành lập trình IT.

Các nhiệm vụ được họ thực hiện trong một thời gian nhất định theo hợp đồng freelancer. Và tất nhiên, nhiệm vụ của họ là đảm bảo hiệu suất; cam kết đầu ra theo các chỉ tiêu đã thỏa thuận trước đó.

Trở thành Freelancer IT – Học lập trình bao lâu là đủ?

Kiến thức bạn tích lũy thật sự có quan trọng hay không? Thực tế cho thấy, việc học tập là việc cả đời, là một quá trình dài. Và nếu bạn muốn đạt trình đủ kiến thức dưới góc độ của sự hoàn hảo, đó là một điều không thể. Ví dụ như một junior là gì, senior là gì? Và họ cần bao nhiêu thời gian để trưởng thành. Vì thế, hãy cứ thử sức lập trình viên freelancer IT nếu cảm thấy bản thân đạt tới mức ổn định.

Không còn là việc làm thế nào để viết CV IT Developer cho tốt, Cover Letter cho Dev, CV Template IT hiệu quả nữa. Bạn cần nhiều hơn thế.

Và khi trải nghiệm freelancer IT, bạn có thể trau đồi chúng. Bạn có thể học thêm các khóa học về kỹ năng lập trình, rèn luyện bài tập đồ án, đi tham gia các workshop – hội thảo khoa học chuyên ngành, tham gia câu lạc bộ có liên quan,… Đừng lo sợ sẽ không có cơ hội trau dồi các kiến thức liên quan đến freelancer IT.

Một điều quan trọng hơn – Đã làm thì phải chuyên

Vậy để chuyên thì thế nào? Kiến thức quan trọng nhưng kỹ năng vẫn không thể thiếu. Thậm chí nó có ý nghĩa lớn trong sự thăng tiến của bạn. Nếu thật sự muốn phát triển, bạn cần biết nhiều kỹ năng hơn. Một freelancer IT thực thụ sẽ không dừng lại ở việc trải nghiệm.

Xem thêm các việc làm NTQ Solution tuyển dụng

Các kỹ năng lập trình theo dự án, phân tích nhu cầu khách hàng, giải quyết vấn đề, nghệ thuật giao tiếp,… tất cả bạn cần phải rèn luyện.

Một khi hiểu được tầm quan trọng của kỹ năng và biết cách lập kế hoạch bồi dưỡng, mức lương xứng đáng sẽ đến với bạn. Niềm vui công việc tất nhiên có vì bạn đã có đam mê. Nhưng để chuyên sâu theo đuổi freelancer IT, phải đầu tư và dành cho nó một sự trân trọng.

Một số khó khăn khi trở thành Freelancer IT

freelancer IT
Nhiều thách thức được đặt ra cho mỗi Freelancer lập trình.

Thách thức tìm kiếm dự án

Bất kỳ ngành nghề, vị trí nào như tuyển dụng Data Scientist, bạn cũng chịu các sức ép cạnh tranh rất lớn để có thể phát triển.freelancer IT cũng không ngoại lệ. Tìm kiếm dự án được xem là một thách thức lớn. Vì vậy, hãy linh động tận dụng những nguồn khai thác việc freelance IT phù hợp. Một số nguồn có thể từ các trang web tìm việc freelance uy tín; thông tin từ các hội nhóm facebook groups, linkedin,… 

Khó khăn trong việc lựa chọn các dự án

Mỗi khi đưa quyết định nhận dự án freelance, bạn cần xem xét “sức nặng” mà mỗi dự án mang lại. Một freelancer IT chuyên nghiệp thì uy tín và trách nhiệm rất quan trọng. Nó là cơ sở để hình thành nên thương hiệu – dấu ấn cá nhân.

Hãy đưa ra các nhận định về kỹ năng, mức độ hoàn thành, quy mô sử dụng các phần mềm – kiến thức công nghệ,… trước khi nhận một dự án. Việc đánh giá là rất quan trọng. Vì nó giúp mỗi freelancer IT đo lường về tính khả thi và phần trăm hiệu suất đạt được của từng dự án.

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

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

Viết một con Bash Script back up Mongo Database đơn giản

Viết một con Bash Script back up Mongo Database đơn giản

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

Chả là mấy ngày nay chả làm ăn được gì, hôm qua mở cửa hàng ra bán thì quản lí thị trường cứ lòng vòng nên cũng đóng luôn, hên sao ông anh rủ làm freelancer cho một project về academy video, hai ngày đầu code ngon lành server chạy mượt mà, nhưng sang ngày thứ 3 không biết vì sao con mongodb server lại không thể truy cập được, cả bọn hoảng hốt vì chưa có một bản backup nào cả. Hên sao 3 tiếng sau nó lại sống lại và rồi mình được ông a giao cho cái công việc viết script backup mongo giá 300k :))

Thực ra thì mình chả biết viết bash nhưng mà sau một vòng lội google thì cũng xong, yêu cầu thì cũng khá đơn giản.

  • Back up database có tên là psdp theo chu kì 1 ngày 1 lần.
  • Lưu vào aws s3 và chỉ giữ lại 5 bản mới nhất.

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

                 Tìm việc MongoBD mới nhất trong tháng

Triển khai

  1. Đầu tiên là làm sao để backup

Mongodb có sẳn tool mongodump để backup database, vậy thì để backup database psdp thì mình chỉ cần chạy lệnh

mongodump --uri=$URI --archive="$OUTPUT"

2. Làm sao để copy file đã backup sang aws s3

Uầy, google một vòng mình thấy aws có cùng cấp aws cli , có hỗ trợ command copy qua s3 luôn. Hướng dẫn cài đặt nằm ở đây.

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" 
unzip awscliv2.zip 
sudo ./aws/install

À nếu con server đó chưa cài unzip thì chạy lệnh sudo apt install unzip để cài đặt. Sau khi cài xong aws cli thì phải cấu hình access key và secret key cho nó.

$ aws configure 
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE 
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 
Default region name [None]: us-west-2 
Default output format [None]: json

Vậy là xong phần setup aws cli , tiếp theo là copy cái file này qua bucket bên s3, giả sửa cái bucket đó có tên là psdp-dev-mongo-backup ,và cái file cần copy qua s3 là psdp

aws s3 cp "psdp" "s3://psdp-dev-mongo-backup"

Về cơ bản là đã xong, nhưng giờ làm để xóa hết mấy cái backup cũ chỉ giữ lại 5,6 cái.

Ý tưởng đơn giản là lặp đi lặp lại đoạn code trên, cứ mỗi lần backup thì lưu lại tên file output đã backup vào trong một mảng, nếu số lần backup lớn hơn 5 thì ta lại xóa cái file đã cũ nhất. File đó có tền là phần tử nằm ở vị trí đầu tiên của mảng, sau khi xóa file rồi thì loại bỏ phần tử đó để cập nhật lại mảng, làm như này thì mảng sẽ luôn duy trì ở mức ≤ 5 giá trị.

Khai báo URI , BUCKETNAME , số lần backup i , mảng lưu tên file output của mongodump arr .

URI="mongodb://admin:123@localhost:27017/psdp?authSource=admin"
BUCKET="psdp-dev-mongo-backup"
declare -a arr=()
i = 0

Và sau đó lặp đi lặp lại thao tác.

  1. Tăng số lần đã backup
((i= i+1))echo "===== Lần thứ $i ======"echo "Backup PSDP NOW"echo "Time is $(date)"

2. Chạy lệnh mongodump xuất ra file, tên file có kèm dấu thời gian, tốt nhất là chuyển qua unix time cho ngắn gọn.

FILENAME=$(date +%s)mongodump --uri=$URI --archive="/home/ubuntu/mongoBackup/psdp-$FILENAME"echo "done => $FILENAME"

3. Copy file đó qua aws s3

aws s3 cp "psdp-$FILENAME" "s3://$BUCKET"echo "done => s3://$BUCKET/psdp-$FILENAME"

4. Thêm tên file vừa tạo vào mảng và liệt kê hiện tại có bao nhiêu file, bao gồm tên.

arr+=("psdp-$FILENAME")for f in ${arr[*]}
   do
      echo $f
done

5. Kiểm tra xem nếu số lần đã backup mà > 5 thì xóa đi file cũ nhất ở cả local và bên s3 . Sau đó xóa phần tử đầu của mảng và cập nhật lại mảng.

if (( $i > 5 ))
then
   echo "delete => ${arr[0]}"
   rm ${arr[0]}
   echo "deleted localfile => ${arr[0]}"   file="s3://$BUCKET/${arr[0]}"
   echo "delete on s3 => $file"
   aws s3 rm $file 
   echo "deleted on s3"   unset arr[0]
   arr=( "${arr[@]}" )
fi

6. Sleep trong vòng 24h = 24*60*60 = 86400 giây

sleep 86400

Và đây là đoạn code hoàn chỉnh.

URI="mongodb://xxx:xxx@xxx:xxx/psdp?authSource=admin"
BUCKET="xxx"
declare -a arr=()
i=0
while
((i= i+1))
echo "=============================== $i ========================================="
echo "Backup PSDP NOW"
echo "Time is $(date)"
FILENAME=$(date +%s)
mongodump --uri=$URI --archive="/home/ubuntu/mongoBackup/psdp-$FILENAME"
echo "done => $FILENAME"
echo "Copy to S3"
aws s3 cp "psdp-$FILENAME" "s3://$BUCKET"
echo "done => s3://$BUCKET/psdp-$FILENAME"
arr+=("psdp-$FILENAME")
for f in ${arr[*]}
do
echo $f
done
if (( $i > 5 ))
then
echo "delete => ${arr[0]}"
rm ${arr[0]}
echo "deleted localfile => ${arr[0]}"
file="s3://$BUCKET/${arr[0]}"
echo "delete on s3 => $file"
aws s3 rm $file
echo "deleted on s3"
unset arr[0]
arr=( "${arr[@]}" )
fi
echo "============================================================================"
sleep 3
do :;done
~

Rồi có code rồi vậy làm sao để chạy, nohup xin hân hạnh tài trợ chương trình này.

nohup bash ./cronbackupmongo.bash &

Toàn bộ stdout sẽ được ghi ra nohup.out và để xem output các bạn chạy lệnh.

sudo tail -f nohup.out

Output sẽ tương tự như sau.

============== Lần thứ 1 ==============
Backup PSDP NOW
Time is Tue Apr 14 06:12:30 UTC 2020
2020-04-14T06:12:30.358+0000 writing psdp.logs to archive '/home/ubuntu/mongoBackup/psdp-1586844750'
2020-04-14T06:12:30.360+0000 done dumping psdp.logs (1 document)
2020-04-14T06:12:30.382+0000 writing psdp.users to archive '/home/ubuntu/mongoBackup/psdp-1586844750'
2020-04-14T06:12:30.383+0000 done dumping psdp.users (1 document)
done => 1586844750
Copy to S3
upload: ./psdp-1586844750 to s3://psdp-dev-mongo-backup/psdp-1586844750
done => s3://psdp-dev-mongo-backup/psdp-1586844750
psdp-1586844750
====================================================================

Và khi đến lần thứ 6 thì nó sẽ delete file cũ.

===================== Lần thứ 6 ==========================
Backup PSDP NOW
Time is Tue Apr 14 11:12:35 UTC 2020
2020-04-14T11:12:35.312+0000 writing psdp.logs to archive '/home/ubuntu/mongoBackup/psdp-1586862755'
2020-04-14T11:12:35.314+0000 done dumping psdp.logs (1 document)
2020-04-14T11:12:35.337+0000 writing psdp.users to archive '/home/ubuntu/mongoBackup/psdp-1586862755'
2020-04-14T11:12:35.338+0000 done dumping psdp.users (1 document)
done => 1586862755
Copy to S3
upload: ./psdp-1586862755 to s3://psdp-dev-mongo-backup/psdp-1586862755
done => s3://psdp-dev-mongo-backup/psdp-1586862755
psdp-1586844750
psdp-1586848351
psdp-1586851952
psdp-1586855553
psdp-1586859154
psdp-1586862755
delete => psdp-1586844750
deleted localfile => psdp-1586844750
delete on s3 => s3://psdp-dev-mongo-backup/psdp-1586844750
delete: s3://psdp-dev-mongo-backup/psdp-1586844750
deleted on s3
====================================================================

Và đây là toàn bộ file đã backup bên s3 . Chỉ có 5 file mới nhất. Đúng 1 tiếng 1 lần.

Viết một con Bash Script back up Mongo Database đơn giản

À còn nữa nếu mà muốn stop script để làm gì đó thì chỉ cần kiếm process id của nó sau đó dùng command kill để giết nó.

ubuntu@ip-172-31-38-138:~/mongoBackup$ ps aux | grep cronbackupmongo
ubuntu    9653  0.0  0.1  14856  1036 pts/0    S+   11:21   0:00 grep --color=auto cronbackupmongo
ubuntu   21435  0.0  0.3  13312  3308 ?        S    06:12   0:00 bash ./cronbackupmongo.sh
ubuntu@ip-172-31-38-138:~/mongoBackup$

Và kill process của nó, có id = 21435

kill 21435 

Vậy là xong rồi, bye bye các bạn, cảm ơn đã ghé đọc bài, happy kiếm tiền :))

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

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

Selenium – Xác Định Đối Tượng UI

Selenium – Xác Định Đối Tượng UI

Bài viết được sự cho phép của vntesters.com

Trong kiểm thử tự động, phần quan trọng là chúng ta phải làm sao cho công cụ kiểm thử nhận biết và phân biệt được các đối tượng UI trên phần mềm mà chúng ta đang kiểm tra. Trong kiểm thử, chúng ta gọi bước này là xây dựng bộ giao diện người dùng – build GUI Repositories. Cơ bản, nó là một bệ từ điển kết nối giữa một cái tên logic – thứ mà chúng ta dùng trong script – và mô tả vật lý – thứ hiển thị trên phần mềm.

  18 designer hàng đầu dự đoán về xu hướng UI/ UX trong năm 2022
  5 bài học quí giá về việc phát triển ứng dụng iOS

Để có thể tạo một GUI Repository tốt, chúng ta cần xác định mô tả vật lý của đối tượng UI một cách chính xác, đơn nhất và ổn định. Tính chính xác, đơn nhất của mô tả vật lý dùng để đảm bảo script của chúng ta có thể chạy một cách đúng đắn. Tính ổn định giúp chúng ta không phải chỉnh sửa nhiều khi phần mềm có sự thay đổi.

Selenium cũng như vậy, bộ GUI Repository cũng đòi hỏi các tính chất như các công cụ kiểm thử khác. Có khác, chỉ là các thuộc tính của UI là đặc thù về Web mà thôi.

Đối Tượng UI – Locators

Selenium hỗ trợ chúng ta xác định UI dựa trên các thuộc tính, và chúng ta gọi một cách xác định đối tượng UI thông qua thuộc tính của nó là locator, như sau:

  • ID
  • Name
  • Link Text
  • CSS Selector
    • Tag/ID
    • Tag/class
    • Tag/attribute
    • Tag/class/attribute
    • Inner text
  • XPath

Đối với ID, đây được coi như là thuộc tính đơn nhất và ổn định nhất của hệ thống phần mềm. Nếu có thể sử dụng ID cho việc xác định UI thì quá tốt. Nhưng, tất cả chúng ta đều biết, hiếm có một nhà phát triển phần mềm nào lại chăm chỉ đến mức gắn ID cho mọi đối tượng UI. Đơn giản là vì ID không phải là một thuộc tính bắt buộc và nó không hiện thị trên giao diện nên bên viết ra phần mềm không chú ý đến nó cũng là hiển nhiên.

Về phần Name. Name là lựa chọn thứ hai sau ID. Tuy nhiên, thuộc tính Name đôi khi không đơn nhất. Không có một ràng buộc nào bắt Name phải đơn nhất cả. Xin lỗi, mình ngoài lề một chút, đối với ID, cũng sẽ không có lỗi systax nào xảy ra nếu nhà phát triển đặt hai đối tượng UI cùng ID, nhưng nó là một bug về ý nghĩa. Nếu bạn làm Unit Test, bạn có thể bắt bug này.

Link Text. Một lựa chọn không tồi nếu bạn không phải kiểm định trên hệ thống với nhiều ngôn ngữ khác nhau. Thuộc tính Link Text là không đơn nhất và cũng không ổn định. Một trang web có thể có nhiều liên kết đến một trang khác hay thay đổi từ ngữ nhưng không đổi ý nghĩa. Thử tưởng tượng, một ngày nào đó, nút Login của chúng ta bị chuyển thành SignIn. Wow….

CSS Selector. Sử dụng CSS là chúng ta phụ thuộc vào cách thiết kế web của nhà phát triển. Và hiển nhiên, CSS Selector không đơn nhất. Không một nhà phát triển nào tạo ra một CSS để dùng cho một đối tượng cả. Cho nên, chúng ta phải kết hợp CSS với Tag/ID, Tag/class, ….

Cuối cùng, XPath. Đây được xem như là thuộc tính hay dùng nhất của Selenium. Tuy nhiên, cách này lại thiếu chính xác, thiếu đơn nhất và thiếu ổn định nhất trong tất cả các cách xác định đối tượng UI.

Xác định đối tượng UI với Selenium IDE

Trong Selenium IDE, khi chúng ta record một test case, IDE đã tự động xác định đối tượng UI cho chúng ta. Nhưng, đôi khi các thuộc tính do IDE lấy ra không thể sử dụng được. Các bạn có thể thử với Google, ở đó có hai đối tượng UI có cùng ID.

Để xác định một đối tượng UI với Selenium IDE, chúng ta làm như sau:

B1: Mở trang web mà chúng ta đang muốn kiểm tra

B2: Mở Selenium IDE

B3: Gõ locator của đối tượng mà chúng ta muốn xác định vào Target textbox. Cấu trúc và ví dụ cho các locators mình liệt kê ở cuối bài.

B4: Click Find button

Selenium – Xác Định Đối Tượng UI

Nếu các locator của đối tượng mà chúng ta điền vào Target là đúng, đối tượng UI sẽ được sáng nhấp nháy trên trang web.

Và đây là cách chúng ta tạo ra các locator với từng phương thức khác nhau:

Phương thức

Cấu trúc

Ví dụ

ID

id= id_của_đối_tượng

id=email

Name

name=name_của_đối_tượng

name=username

Name

name=name_của_đối_tượng

name=tripType

Link Text

link=link_text

link=REGISTER

Tag/ID

css=tag#id

css=input#email

Tag/Class

css=tag.class

css=input.inputtext

Tag/Attribute

css=tag[attribute=giá trị]

css=input[name=lastName]

Tag/Class/Attribute

css=tag.class[attribute=giá trị]

css=input.inputtext[tabindex=1]

XPath

Xpath

//html/body//bookstore/book/title

Để có thể xác định được locator một cách nhanh chóng và chính xác hơn, các bạn có thể sử dụng hai công cụ khá mạnh của FireFox: FireBug và XPath Finder. FireBug hỗ trợ chúng ta đọc mã nguồn của trang web một cách rõ ràng, và XPath Finder giúp chúng ta lấy XPath của đối tượng UI một cách chính xác và đơn giản.

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

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

Xem thêm IT job hấp dẫn trên TopDev

Sự khác nhau giữa code dễ và code đơn giản

Sự khác nhau giữa code dễ và code đơn giản

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

Chào các bạn,

Bấy lâu nay, mình và có thể nhiều bạn khác đang có sự nhầm lẫn to lớn giữa hai từ “dễ dàng” và “đơn giản”. Mặc dù nghe qua, chúng có vẻ giống nhau, có vẻ như là từ đồng nghĩa, có vẻ có thể sử dụng thay thế cho nhau được, nhưng thực chất không phải vậy, “dễ dàng” và “đơn giản” là hai từ mang sắc thái ý nghĩa rất khác nhau. Và việc nhầm lẫn giữa “dễ dàng” và “đơn giản” có thể khiến bạn có những suy nghĩ không đúng đắn cả về cuộc sống lẫn … code.

  "Code dễ đọc" là như thế nào?
  Vừa học vừa chơi! Top 15+ game lập trình miễn phí

Vì vậy, bài viết này mình sẽ đi phân tích sự khác nhau giữa “dễ dàng” và “đơn giản” để chúng ta cũng hiểu rõ ý nghĩa của mỗi từ mà nó hướng tới.

I. DỄ DÀNG VS ĐƠN GIẢN

Giả sử mình có câu “Dậy sớm rất đơn giản”.

– Đúng, dậy sớm rất đơn giản, chỉ cần hẹn báo thức và dậy đúng giờ đó, không lằng nhằng nhiều bước, đứa trẻ 5 tuổi cũng làm được.
– Nhưng nó không dễ dàng, bởi bạn có cưỡng lại được sự buồn ngủ, hay cưỡng lại được cái chăn ấm kia. Và thử nghĩ xem, đã bao nhiêu lần bạn đặt mục tiêu dậy sớm và không làm được :D.

Ví dụ ngắn gọn trên có lẽ đã giúp bạn hiểu được sự khác nhau giữa dễ dàng và đơn giản, nhưng hãy cùng phân tích kỹ hơn nhé:

  • Dễ dàng hướng tới việc mô tả một hành động mà không đòi hỏi nhiều công sức, động lực, kiến thức mà vẫn có thể thực hiện.
  • Đơn giản hướng tới việc mô tả một hành động có mà càng ít bước thực hiện, hoặc các bước thực hiện càng rõ ràng càng tốt (xin phép chỉ giới hạn trong phạm vi hành động đơn giản, mà bỏ qua các sự vật, hiện tượng đơn giản).
  • Trái nghĩa với đơn giản là phức tạp, trái nghĩa với dễ dàng là khó khăn.
  • Ranh giới giữa dễ dàng và đơn giản có thể rất mong manh, và bị phụ thuộc nhiều ở góc độ nhìn nhận của các đối tượng khác nhau (mang tính tương đối). Như ví dụ “dậy sớm rất đơn giản” ở trên, chúng ta đều đồng ý là nó đơn giản, nhưng còn dễ dàng thì sao? Với một người lười chảy thây, có thói quen ngủ nướng, hoặc người làm việc nhiều về đêm, thì dậy sớm thật sự khó khăn, nhưng với một người sống trong quân đội lâu năm (hoặc trong tù :D) thì nó quá dễ dàng. Vì thế, để đánh giá một điều là đơn giản (hay dễ dàng) thì cần phải đặt bản thân ở góc độ của đối tượng sẽ nhìn nhận điều đó.

II. CODE DỄ DÀNG VS CODE ĐƠN GIẢN

Dễ dàng và đơn giản khác nhau thế nào thì mình đã phân tích ở trên, vậy code dễ dàng và code đơn giản thì khác nhau thế nào:

  • Code dễ dàng: Là những đoạn code mà để tạo ra nó thì không cần nhiều công sức hay kiến thức về code.
  • Code đơn giản: Là những đoạn code sáng sủa, ít bước xử lý, hoặc có các bước xử lý rất rõ ràng.

Trong lập trình, chúng ta thường hướng tới code đơn giản nhiều hơn là code dễ dàng, và một sự thật rằng “Để tạo ra các đoạn code đơn giản thường không dễ dàng”.

Nguyên tắc KISS.

KISS (không phải là HÔN HÍT) là viết tắt của Keep it simple, Stupid, tạm dịch là Giữ nó đơn giản thôi, đồ ngu – là một nguyên tắc giúp chúng ta hướng tới sự đơn giản, và cho rằng một điều gì đó đơn giản thì sẽ dễ dàng sử dụng hơn là phức tạp (lưu ý là dễ dàng sử dụng, chứ không phải dễ dàng tạo ra nhé).

Để hình dung rõ hơn về code dễ dàng và code đơn giản, chúng ta sẽ cùng làm một ví dụ nhỏ sau:

Xét bài toán

Cho mảng $numbers chứa các số nguyên, hãy viết chương trình in ra màn hình các số nguyên tố có trong mảng $numbers.

Mình sẽ giải bài toán trên theo 2 cách, một cách ưu tiên code dễ, cách còn lại ưu tiên code đơn giản, sau đó chúng ta sẽ cùng rút ra nhận xét về 2 cách này.

Cách 1: Ưu tiên code dễ dàng

// Ban đầu đề bài cho cái mảng này
$numbers = [1, 2, 4, 5, 7, 39, 12, 0];

// Tạo cái mảng để chứa các số nguyên tố
$soNguyenTo = [];

// Bắt đầu đi tìm các số nguyên tố có trong mảng
foreach ($numbers as $n) {
    // Số nguyên tố là số tự nhiên lớn hơn 1
    // và chỉ chia hết cho 1 và chính nó
    // hay nói cách khác, số nguyên tố luôn chỉ có 2 ước
    $soUoc = 1;
    for ($i = 2; $i <= $n; $i++) {
        if ($n % $i == 0) {
            $soUoc = $soUoc + 1;
        }
    }

    // Kiểm tra số ước
    // Nếu bằng 2, thì thêm vào mảng các số nguyên tố
    if ($soUoc == 2) {
        $soNguyenTo[] = $n;
    }
}

// In các số nguyên tố ra màn hình
foreach ($soNguyenTo as $n) {
    echo $n . PHP_EOL;
}

/*
Output

2
5
7
*/

Cách 2: Ưu tiên code đơn giản

/*
 * Đừng quan tâm tới 3 hàm dưới đây viết như thế nào,
 * hãy chỉ quan tâm tới input và output của nó thôi
 */

// Hàm lọc các số nguyên tố có trong $mang
// input: một biến $mang là mảng chứa các số nguyên
// output: trả về một mảng các số nguyên tố có trong biến $mang
function locCacSoNguyenTo($mang) {
    $mangSoNguyenTo = [];

    foreach ($mang as $phanTu) {
        if (laSoNguyenTo($phanTu) == true) {
            $mangSoNguyenTo[] = $phanTu;
        }
    }

    return $mangSoNguyenTo;
}

// Hàm kiểm tra một số $n có phải số nguyên tố hay không
// input: một số $n bất kỳ
// output: trả về true/false. true thì $n là số nguyên tố và ngược lại
function laSoNguyenTo($n) {
    $soUoc = 1;
    for ($i = 2; $i <= $n; $i++) {
        if ($n % $i == 0) {
            $soUoc = $soUoc + 1;
        }
    }

    if ($soUoc == 2) {
        return true;
    }

    return false;
}

// Hàm in các phần tử có trong mảng
// input: một mảng bất kỳ
// output: in ra các phần tử trong mảng
function inPhanTuTrongMang($mang) {
    foreach ($mang as $phanTu) {
        echo $phanTu . PHP_EOL;
    }
}

/*
 * Đoạn này thì hãy quan tâm chi tiết
 */

// Cái mảng đề bài cho này
$numbers = [1, 2, 4, 5, 7, 39, 12, 0];

// Lọc các số nguyên tố có trong mảng ra này
$mangSoNguyenTo = locCacSoNguyenTo($numbers);

// In ra màn hình các số nguyên tố này
inPhanTuTrongMang($mangSoNguyenTo);

/*
Output

2
5
7
*/

Nhận xét

  • Về kết quả, cả 2 cách trên đều cho ra kết quả giống nhau, và đều chính xác so với đề bài.
  • Cách 1 không sử dụng nhiều kiến thức về code, chỉ bao gồm: kiến thức về cách sử dụng biến, cách sử dụng lệnh rẽ nhánh và vòng lặp.
  • Cách 2 thì sử dụng nhiều kiến thức hơn, bao gồm các kiến thức của cách 1, và kiến thức về cách sử dụng function.

Mới chỉ là một bài toán đơn giản, mà hàm lượng kiến thức giữa 2 cách code đã khác nhau rất nhiều (biết sử dụng function và không biết sử dụng function là rất khác nhau). Nếu trong các dự án thực tế, thì sự khác biệt giữa code dễ và code đơn giản còn chênh lệch nhau nhiều nữa.

>> Đọc thêm: Design pattern là gì mà lập trình viên giỏi phải biết

  • Cách 1 code chạy một lèo từ trên xuống dưới, vẫn chia thành các bước nhưng không rõ ràng, nếu không comment có lẽ bạn sẽ không biết các bước được thực hiện như thế nào.
  • Cách 2 code được chia thành 2 bước rõ ràng, bước 1 tìm các số nguyên tố, bước 2 in ra màn hình, mỗi bước được đóng gói thành một function, nếu không có comment, có lẽ bạn sẽ vẫn hiểu code trong cách 2 được chạy như thế nào.
  • Cách 1 code nhanh hơn, do người code chỉ việc viết một chương trình chạy từ trên xuống dưới.
  • Cách 2 code lâu hơn, do người code phải mất công phân tích để tách thành các function.

Trên là một bài toán đơn giản và cũng phổ biến, nên không tốn nhiều thời gian để phân tích xem cần phải tách thành các function nào, còn với các bài toán mới, các bài toán phức tạp trong thực tế thì việc thiết kế code gồm những function nào là cả một vấn đề lớn, và thường được thực hiện bởi những người có kinh nghiệm.

  • Cách 1 không có khả năng tái sử dụng code đã viết.
  • Cách 2 có thể tái sử dụng code, do code được đóng gói thành các function.
  • Cách 1 code khó hiểu hơn, hãy tưởng tượng 3 tháng sau nhìn lại code trong cách 1 thì mất bao lâu để bạn hiểu nó đang thực hiện cái gì. Code khó hiểu hơn, đồng nghĩa với việc khó bảo trì hơn.
  • Cách 2 code dễ hiểu hơn, chắc chắn là vậy, và cũng dễ bảo trì hơn.

Một thực tế rằng, các lập trình viên sẽ dành thời gian để sửa code nhiều hơn là viết code, mà để sửa code thì bạn phải hiểu code hiện tại đang chạy như thế nào, vì thế việc viết code dễ hiểu quan trọng hơn rất nhiều so với việc viết code sao cho nhanh.

  • Để có các dòng code đơn giản, thì không dễ dàng và ngược lại.

III. TỔNG KẾT

Một bài viết ngắn gọn giúp các bạn phân biệt thế nào là code dễ và code đơn giản, và … à mà thôi. Keep it simple, stupid.

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

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

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

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

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

Trong những năm trở lại đây, ngành công nghệ thông tin trở nên vô cùng “hot”. Kéo theo đó là các khái niệm đi cùng như “lập trình”, “ngôn ngữ lập trình”.. xuất hiện một cách dày đặc hơn trên các phương tiện thông tin đại chúng.

Nếu các bạn đang học công nghệ thông tin (IT) thì sẽ biết rằng, số lượng ngôn ngữ lập trình hiện nay đã lên đến con số hàng trăm và nó sẽ còn tiếp tục tăng nữa.

Vậy một câu hỏi đặt ra cho chúng ta là nên chọn học loại ngôn ngữ lập trình nào cho phù hợp với nhu cầu thị trường trong hiện tại và tương lai. Ở đây mình có thống kê một số ngôn ngữ phổ biến như sau:

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

Trong bài viết này mình sẽ giới thiệu với các bạn TOP 5 ngôn ngữ lập trình đáng học nhất năm 2024, những ngôn ngữ lập trình mà mình thấy tiềm năng khá là lớn ở Việt Nam trong khoảng 5-7 năm tới.

#1. Python

Có thể nói Python đang là ngôn ngữ được khuyến khích học nhiều nhất, không chỉ ở Việt Nam mà còn cả trên thế giới nữa. Câu hỏi là tại sao? Tại sao lại là Python?

Python được ra đời vào năm 1991, tính đến hiện tại cũng đã khoảng 30 năm tuổi. Nếu xét về tuổi đời thì python cũng không phải là mới.

Nhưng một trong những điểm cộng lớn nhất của python là sự đơn giản, người học dễ dàng tiếp cận, cú pháp khá giống với ngôn ngữ giao tiếp nên python được đánh giá cao trong việc dễ học, dễ sử dụng.

Ngoài ra, python có một số lượng lớn các thư viện giúp cho ngôn ngữ này trở nên rất mạnh (về khía cạnh các thư viện, hàm dựng sẵn). Cùng một công việc, các ngôn ngữ khác có thể mất 5-10 dòng code nhưng với python chỉ mất khoảng 2-3 dòng.

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?
Python Hello World program

Không tin các bạn có thể vào trang https://www.python.org/ để xem cách python giải quyết những bài toán phức tạp mà xem, rất ngắn gọn.

Cuối cùng, không thể không nhắc đến sự phát triển của AI (trí tuệ nhân tạo), Machine Learning (học máy), Deep Learning (học sâu) cũng được viết bằng python rất nhiều…

Tìm việc làm Python mới nhất

#2. JavaScript

Nếu như python nổi lên như một hiện tượng thì JavaScript cũng vậy. Việc JavaScript ra đời và được phát triển là dựa trên sự phát triển của Internet.

Cụ thể hơn là sự phát triển của các ứng dụng web, đặc biệt là phía Client do các máy tính cá nhân ngày càng “khỏe” -> Browser làm được nhiều việc hơn.

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

Số lượng Frameword JavaScript (Front End) cũng nổi lên như nấm sau mưa. Một số cái tên tiêu biểu như ReactJS (Facebook phát triển), AngularJS (Google phát triển), VueJS (Một kỹ sư phần mềm Trung Quốc phát triển).

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

Mình sẽ có một bài riêng nói về các Framework, nhưng các bạn phải luôn nghi nhớ rằng dù là Framework nào thì cũng được xây dựng từ ngôn ngữ lập trình.

Ở đây mình nói đến việc các bạn phải hiểu kỹ các khái niệm của JavaScript trước khi học một Framework.

Quay lại với câu chuyện lập trình web chưa bao giờ hết “hot” do nhu cầu ngày càng nhiều, đặc biệt là các hệ thống web lớn. Vì vậy học JavaScript đã và sẽ chưa bao giờ là quá sớm hay quá muộn.

Tuyển dụng lập trình Javascript lương cao

#3. Java

Java thì là một ngôn ngữ lập trình có thể nói là “huyền thoại”. Sự ra đời của Java đã chuẩn hóa nhiều khái niệm lập trình, cũng như là cảm hứng cho nhiều ngôn ngữ lập trình khác.

Ví dụ như JavaScript đã đặt tên gần giống với Java để “ké” chút danh tiếng, mặc dù hai ngôn ngữ này chả liên quan gì đến nhau cả !

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

Nói về tuổi đời, Java cũng đã khoảng 30 năm kể từ ngày nó được thai nghén bởi James Gosling và bạn đồng nghiệp ở Sun Microsystems.

Vậy tại sao Java cũ nhưng chúng ta vẫn nên học. Cũng đơn giản thôi, thứ nhất là Java là ngôn ngữ thuần hướng đối tượng. Học Java sẽ giúp người học tiếp cận các khái niệm lập trình một cách chuẩn chỉ.

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?
Java Hello World program

Hai nữa là trong suốt gần 30 năm qua, có vô số ứng dụng lớn nhỏ được tạo ra từ Java và cho đến nay vẫn đang hoạt động. Vì vậy học Java sẽ không lo thất nghiệp vì số lượng công việc với Java khá là nhiều, nhưng cũng khó.

Học Java các bạn có thể làm các ứng dụng di động trên hệ điều hành Android, có thể là các ứng web với Framework Spring…

Các vị trí tuyển Java hấp dẫn 2022

#4. C/C++

Nhiều bạn có thể sẽ không đồng ý khi mình đưa C/C++ vào danh sách này vì hai ngôn ngữ một phần khá là khó học, hai nữa tuổi đời cũng lớn, ít dùng…

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

Nhưng có lẽ các bạn không biết về sức mạnh của C/C++ nên mới nghĩ vậy ! Do C/C++ là ngôn ngữ bậc trung nên chúng sẽ tương tác với hệ thống tốt hơn, chính xác là đem lại hiệu năng lớn hơn các ngôn ngữ như Python, Java…

Các ngôn ngữ như Python, NodeJs… đều có bộ nhân được viết từ C/C++ để tối ưu hiệu năng. Vì vậy bạn đừng nghĩ C/C++ “vô dụng” nha.

Ngày nay các job liên quan đến C/C++ phải nói là khá ít vì nhu cầu không nhiều. Đặc biệt là trong các hệ thống nhúng, các hệ thống kết hợp với các thiết bị điện tử thì C/C++ được dùng nhiều hơn.

Nhưng nếu ai giỏi C/C++ thì lương cũng cao lắm đó, cái gì cũng có giá mà các bạn. Vậy nên đừng thấy nó cũ mà nghĩ nó ít dùng nha.

#5. Swift

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

Cuối cùng mình muốn đề cập đến một ngôn ngữ lập trình do Apple phát triển. Như các bạn biết thì Táo khuyết từ trước đến nay toàn dùng hàng “độc”. Bạn không thể dùng Java, Kotlin… để viết app iOS được. Thay vào đó bạn phải sử dụng Swift.

Cụ thể về Swift thì mình cũng không hiểu biết nhiều để đánh giá về hiệu năng cũng như cú pháp. Nhưng nếu Apple đã tin dùng thì cũng không phải là hàng “lởm”.

Các bạn cứ yên tâm học nếu muốn đi theo hướng xây dựng, lập trình các ứng dụng iOS hay các ứng dụng của Apple.

#6. Kết luận

Cá nhân mình nghĩ rằng công nghệ có thể thay đổi hàng ngày nhưng nền tảng (người ta hay gọi là core) sẽ không bao giờ thay đổi.

Việc học công nghệ mới là tất yếu nhưng 5 ngôn ngữ mình giới thiệu bên trên không phải là mới. Các bạn cứ học và nắm chắc một hoặc hai trong số chúng là các bạn đã trang bị cho mình một nền tảng vững chắc để tiến tới việc học các Framework, thư viện… rồi đấy.

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

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

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

Cơ bản về Embedded và ứng dụng

Cơ bản về Embedded và ứng dụng

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

Mình đã muốn viết về chủ đề này khá lâu rồi, vì công việc hiện tại của mình đang liên quan đến mảng này. Thực ra mảng embedded (nhúng) này nó cũng khá là rộng, và mình thì cũng mới biết và làm việc với một phần nhỏ liên quan đến nó thôi. Liên quan đến các ứng dụng web, hay di động thì mọi người chắc hẳn là đã rất quen thuộc, và các bài viết chia sẻ, kiến thức cũng rất nhiều. Nhưng về kiểm thử phần mềm liên quan đến embedded thì lại chưa nhiều lắm, nó khá là đặc thù và theo quan sát cộng với tầm hiểu biết hạn hẹp của mình thì không nhiều công ty làm chuyên sâu cái này (không tính các công ty outsourcing, mà công ty nào làm về mảng này thì hầu như các công ty đó phải có tiềm lực kinh tế tương đối mạnh.

Nếu muốn tìm hiểu về kiểm thử phần mềm nhúng, tìm kiếm google cũng ra được không nhiều kết quả như mong đợi lắm – cũng ko biết có phải do từ khóa tìm kiếm của mình chưa sát hay không :v.  Và dù gì thì mình cũng quyết định phải làm một điều gì đó để phong phú thêm cái bộ tìm kiếm cho Google mặc dù biết là nó chả thấm vào đâu so với bộ dữ liệu của nó cả -.- bằng cách thêm tag về embedded và testing nhiều hơn =)))

Đùa chút thôi, mục đích chính của mình vẫn là tổng hợp kiến thức, chia sẻ cho mọi người kiến thức mình thu lượm được, cũng hi vọng mọi người có thể đóng góp cho mình để kiến thức của mình hoàn thiện hơn.  Tất nhiên có cả những người biết mình sai mà họ không thèm nói chỉ cười khẩy cái thôi, ấy mới ghê =]]

Đầu tiên trước khi đi vào mấy cái liên quan đến phần mềm nhúng, chúng ta sẽ đi từ cái to nhất :D, hiểu xem nó là cái gì. Sau này mình cũng chỉ đi vào cái phần be bé liên quan đến phần mềm nhúng – chính là những cái mình đang làm đó thôi. Bài viết này mình cũng tham khảo và tổng hợp lại thôi nhé – vì kiến thức hàn lâm, ko bịa được kaka, nhiều chỗ khá là tối nghĩa, nên mình có để các đường dẫn tham khảo phía dưới, hi vọng nhận được sự đóng góp của mọi người.

Cơ bản về Embedded và ứng dụng

1. Embedded system là gì?

Hệ thống nhúng là một loại hệ thống máy tính được thiết kế để thực hiện một số tác vụ như truy cập, xử lý, lưu trữ và kiểm soát dữ liệu trong các hệ thống thiết bị điện tử khác nhau.

Các hệ thống nhúng là sự kết hợp giữa phần cứng và phần mềm, và ở đây phần mềm được nhúng vào phần cứng.

Một trong những đặc điểm quan trọng nhất của các hệ thống này là nó cung cấp input/output trong một khoảng thời gian giới hạn.

Sự hỗ trợ của các hệ thống nhúng giúp cho cho công việc trở nên hoàn thiện và thuận tiện hơn. Vì thế, các hệ thống nhúng thường được tích hợp trong rất nhiều trong cả các thiết bị đơn giản hay phức tạp.

Hệ thống nhúng được ứng dụng rất nhiều trong cuộc sống của chúng ta, các ứng dụng trên các thiết bị sử dụng hàng ngày mà bạn có thể thấy như lò vi sóng, máy tính, điều khiển từ xa TV, máy giặt, các hệ thống tích hợp trên ô tô…

Cơ bản về Embedded và ứng dụng

2. Embedded hardware

Hệ thống nhúng sử dụng nền tảng phần cứng để thực thi các hoạt động. Phần cứng của hệ thống nhúng được lắp ráp cùng với bộ vi xử lý / vi điều khiển. Hệ thống phần cứng này bao gồm các yếu tố như giao diện cho các dữ liệu đầu vào / đầu ra, bộ nhớ, giao diện người dùng và bộ hiển thị dữ liệu. Về cơ bản, một hệ thống nhúng thường bao gồm:

– Bộ cung cấp năng lượng
– Bộ nhớ
– Bộ xử lý
– Timers
– Đầu ra/Bảng mạch đầu ra
– Cổng giao tiếp nối tiếp
– SASC (System application specific circuits – Các mạch ứng dụng cho một hệ thống cụ thể nào đó)

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

3. Embedded software

Phần mềm được viết cho hệ thống nhúng được gọi là phần mềm nhúng (Embedded software) hay còn gọi là firmware.

Phần mềm nhúng là một chương trình được viết, biên dịch trên máy tính và nạp vào một hệ thống khác bao gồm một hoặc nhiều bộ vi xử lý đã được cài sẵn một hệ điều hành, bộ nhớ ghi chép được, các cổng giao tiếp với các phần cứng khác. Phần mềm nhúng là phần mềm tạo nên phần hồn, phần trí tuệ của các sản phẩm nhúng. Phần mềm nhúng ngày càng có tỷ lệ giá trị cao trong giá trị của các sản phẩm nhúng.

Ví dụ trực quan nhất đó là máy giặt được điều khiển bởi embedded software, hệ thống có thể đo lượng quần áo và chọn chu trình phù hợp để giặt đồ. Với tủ lạnh, hệ thống nhúng cung cấp cho phép chúng ta có thể lựa chọn các chế độ bảo quản phù hợp….

4. Đặc điểm của Embedded system

Hệ thống nhúng được thiết kế để thực hiện một chức năng chuyên biệt nào đó. Đây là điểm khác biệt so với các hệ thống máy tính khác như máy tính cá nhân hoặc các siêu máy tính có thể thực hiện nhiều chức năng khác nhau với những phép tính phức tạp. Chuyên dụng giúp nâng cao tính dễ sử dụng và tiết kiệm tài nguyên.

Tất cả các hệ thống máy tính đều có những hạn chế về các số liệu thiết kế, tài nguyên. Số liệu thiết kế là thước đo để đánh giá việc xây dựng các tính năng như độ lớn, công suất, chi phí và cả hiệu năng hoạt động của hệ thống.

Hệ thống phải hoạt động nhanh ở mức độ chấp nhận được nào đó đồng thời vẫn phải đảm bảo tiêu thụ ít năng lượng hơn để tăng tuổi thọ của pin.

Một số hệ thống nhúng phải tương tác liên tục với những thay đổi trong hệ thống và tính toán các kết quả cụ thể trong thời gian thực với độ trễ cực thấp hoặc hầu như không có. Ví dụ, trong một bộ theo dõi hành trình trên ô tô, hệ thống phải liên tục hiển thị và có phản hồi tương ứng với tốc độ thực tế hiện tại và bộ cảm biến phanh của. Đồng thời, cũng phải tính toán gia tốc/giảm tốc thường xuyên trong một thời gian giới hạn, chỉ với một phép tính chậm trễ có thể ảnh hưởng rất nhiều đến việc điều khiển xe.

Hệ thống nhúng phải được dựa vào một vi điều khiển hoặc trên bộ vi xử lý.

Hệ thống nhúng phải yêu cầu một bộ nhớ, phần mềm nhúng thường đưa trực tiếp vào ROM. Hệ thống phần mềm nhúng không bắt buộc sử dụng bộ nhớ thứ cấp trên PC.

Hệ thống nhúng phải được kết nối với các thiết bị ngoại vi để kết hợp các thiết bị đầu vào và đầu ra.

Hệ thống nhúng được tích hợp sẵn với phần cứng để đảm bảo được tính bảo mật và hiệu suất. Phần mềm nhúng đáp ứng được nhu cầu sử dụng với độ linh hoạt hơn.

Ứng tuyển các vị trí Embedded tuyển dụng trên TopDev

5. Các ứng dụng Embeded system

Các ứng dụng cơ bản của hệ thống nhúng mà ta có thể dễ dàng thấy được như trong các thẻ thông minh, mạng máy tính, vệ tinh, viễn thông, thiết bị điện tử tiêu dùng kỹ thuật số, tên lửa, v.v.

Cơ bản về Embedded và ứng dụng

Hệ thống nhúng được ứng dụng trong ngành công nghiệp ô tô như điều khiển động cơ, kiểm soát,theo dõi hành trình, việc bảo an toàn cho thân xe, sự an toàn cho động cơ, điều khiển robot trong các chuyền lắp ráp, trình đa phương tiện trên ô tô, hệ thống giải trí trên ô tô, truy cập E-com, kết nối với điện thoại di động, v.v …

Các hệ thống nhúng trong viễn thông thuộc các mạng lưới viễn thông, ứng dụng điện toán di động và hệ thống truyền thông không dây, v.v.

Các hệ thống nhúng ứng dụng trong thẻ thông minh thuộc các hệ thống ngân hàng, hệ thống ứng dụng điện thoại di động và bảo mật.

Hệ thống nhúng ứng dụng trong vệ tinh và tên lửa thuộc các đơn vị quốc phòng, truyền thông và hàng không vũ trụ.

Các hệ thống nhúng trong hệ thống mạng và các thiết bị ngoại vi máy tính nằm trong các ứng dụng xử lý hình ảnh, hệ thống mạng lưới, các máy in, các thẻ mạng, màn hình và các vật hiển thị.

Các hệ thống nhúng ứng dụng trong các thiết bị điện tử tiêu dùng kỹ thuật số có thể thấy được như đầu DVD, các loại tivi với độ phân giải cao và máy ảnh kỹ thuật.

Và những bài viết sau này, mình sẽ bật mí cho các bạn đó là việc kiểm thử phần mềm nhúng cho ứng dụng trên ô tô, vẫn gọi là automotive. Trên ô tô thì lại có những phần nhỏ hơn có phần mềm nhúng, bạn có biết chúng có những chức năng gì không? Chúng ta sẽ kiểm thử những gì? Và còn nhiều câu hỏi liên quan khác nữa, lại phải học thôi :v

Mời các bạn theo dõi bài viết tiếp theo về ứng dụng phần mềm nhúng trong ngành công nghiệp ô tô tại đây nhé!

Tham khảo:

https://en.wikipedia.org/wiki/Embedded_system

https://en.wikipedia.org/wiki/Embedded_software

https://www.elprocus.com/basics-of-embedded-system-and-applications/

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

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

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

Python: Top 18 module hữu ích nhất

Python: Top 18 module hữu ích nhất

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

Như các bạn đã biết python có rất nhiều module.

Trong bài này là 18 module python tốt nhất mà bạn thực sự nên biết!

Đây là  các module liên quan đến: web development, machine learning, data science and graphical user interfaces ( phát triển web, học máy, khoa học dữ liệu và giao diện đồ họa người dùng ).

Tìm việc làm python lương cao đi làm ngay

Đây là những module python phổ biến nhất sẽ làm cho cuộc sống của bạn dễ dàng hơn.

Đây là danh sách các module:

Web:

Data science:

Machine Learning:

GUI:

Ngoài ra còn có:

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

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

Xem thêm Việc làm it đà nẵng, hcm, hà nội hấp dẫn trên TopDev

Giới thiệu lifecycle hook của Vue JS

Giới thiệu lifecycle hook của Vue JS

Bài viết được sự cho phép của tác giả Lưu Bình An

Mình đã có bài giới thiệu về lifecycle hook của React Component, Vue component cũng có lifecycle hook, biết hết các hook cơ bản là quan trọng vì sớm muộn chúng ta cũng muốn chạy một số đoạn code khi component được thêm vào DOM, được update, hoặc xóa.

Giới thiệu lifecycle hook của Vue JS

Chúng ta có thể nhóm nó theo

  • 1. Khởi tạo
  • 2. Chèn vào DOM
  • 3. Cập nhập
  • 4. Xóa

1. Khởi tạo

Các hook xảy ra trước khi component được chèn vào DOM, khác với các hook khác, những hook thuộc nhóm này sẽ chạy trong quá trình server-side render. Chúng ta cũng không truy cập được DOM và this.$el trong đây

  3 phút làm quen với Vue.js
  10 kinh nghiệm khi làm việc với các dự án lớn viết bằng Vue.js

beforeCreate

Sự kiện xảy ra khi mới vừa khởi tạo component, data chưa khởi tạo, và các sự kiện chưa được setup

export default {
	beforeCreate() {
		console.log('Không ai chạy trước mình đâu!')
	}
}

created

Có thể truy xuất đến data và events. Template và Virtual DOM chưa được mount và render

export default {
	data() {
    return {
      property: 'Blank'
    }
  },
  computed: {
    propertyComputed() {
      console.log('Thay đổi khi this.property thay đổi');
      return this.property;
  }
  },

  created() {
    this.property = 'Giá trị property mới';
    console.log('propertyComputed sẽ update vì this.property đã thay đổi');
  }
}

2. Chèn vào DOM

Các hook được sử dụng thường xuyên nhất. Cho phép truy cập lúc component ngay trước và sau lần render đầu tiên, tất nhiên nó sẽ không chạy lúc server render

Không nên sử dụng trong trường hợp muốn fetch dữ liệu cho component lúc khởi tạo. Thay vào đó dùng created ( hoặc created + activated cho component keep-alive )

beforeMount

Ngay trước lần render đầu tiên và sau khi template hoặc render function được compile. Thường thì rất chẳng ai đụng đến hook này.

export default {
	beforeMount() {
		console.log('this.$el chưa tồn tại')
  }
}

mounted

Chúng ta có thể truy cập tất cả, cũng là hook được sử dụng nhiều nhất

<template>
	<p>text here</p>
</template>

<script>
	export default {
		mounted() {
			console.log(this.$el.textContent); // text here
		}
	}
</script>

3. Cập nhập

Các hook sẽ được gọi khi component được re-render.

Không nên sử dụng các hook này nếu muốn biết các reactive property nào trên component đã thay đổi. Thay vào đó hãy sử dụng computed và watch

beforeUpdate

Sau khi data thay đổi, trước khi render lại component.

export default {
	data() {
		return {
			counter: 0
		}
	},
	beforeUpdate() {
		console.log(this.counter);
  },
  created() {
    setInterval( () => {
      this.counter++;
    }, 1000)
  }
}

updated

Sau khi component đã re-render

<template>
	<p ref="dom-element">{{ counter }}</p>
</template>
<script>
export default {
	data() {
		return {
			counter: 0
  }
  },
  updated() {
    // gọi mỗi giây
    console.log(+this.$refs['dom-element'].textContent === this.counter)
  },
  created() {
    setInterval( () => {
      this.counter++;
    }, 1000)
  }
}
</script>

4. Xóa

beforeDestroy

Trước khi destroy

export default {
  data() {
    return {
      someLeakyProperty: 'Em sẽ sử dụng hết bộ nhớ luôn!'
    }
  },

  beforeDestroy() {
    this.someLeakyProperty = null
    delete this.someLeakyProperty
  }
}

destroyed

Sau khi đã destroy

export default {
  destroyed() {
    console.log(this) // Chẳng bao giờ xài cái này
    MyCreepyAnalyticsService.informService('Mọi dấu vết đã được xóa')
  }
}

Ngoài ra, component keep-alive còn có 2 hook khác là activated và deactivated

Understanding Vue.js Lifecycle Hooks

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

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

Xem thêm các it job hấp dẫn trên TopDev

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

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

Bài viết được sự cho phép của vntesters.com

Viết 1 test case đơn giản với Python Selenium WebDriver. Đây là bài viết trong loạt bài Automation skills cho tester già mà lười. Bài này VNTesters sẽ hướng dẫn các bạn viết 1 test case đơn giản. Dù bạn chưa từng làm hay học qua Selenium cũng có thể làm được.

Chuẩn bị test environment

Về cơ bản các bạn cần những software sau

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

Viết 1 test case đơn giản với Python Selenium

Mình sẽ lấy Chrome là trình duyệt chạy test case. Web Driver cho Chrome có thể tìm thấy tại đây. Download về rồi bỏ nó vô folder C:\VNTesters\. Cũng trong folder này các bạn tạo 1 file tên simple_test_v1.py với nội dung như sau

from selenium import webdriver
driver = webdriver.Chrome(executable_path="C:/VNTesters/chromedriver.exe")
driver.get ("https://vntesters.com/")
print (driver.title)
driver.quit()
view rawsimple_test_v1.py hosted with ❤ by GitHub

Test case ở trên đơn giản quá phải không? Đơn giản nên dễ giải thích (khó quá sẽ bỏ qua)

  1. from selenium import webdriver: import webdriver từ selenium package
  2. driver = webdriver.Chrome(executable_path=”C:/VNTesters/chromedriver.exe”): mở Chrome lên,
  3. driver.get (“https://vntesters.com/”): navigate tới trang chủ của VNTesters
  4. print (driver.title): in ra tiêu đề của trang web
  5. print (driver.title): tắt Chrome

Để chạy test case trên, các bạn mởi CMD và vào folder C:\VNTesters rồi gõ lệnh sau

python simple_test.py

Cải thiện test case đơn giản với WebDriver Manager

Các bạn có để ý dòng số 2 không? Đặc biệt đoạn executable_path=”C:/VNTesters/chromedriver.exe”. Đường dẫn tuyệt đối là rủi ro lớn khi test case phải chạy trên nhiều máy khác nhau. Để giải quyết vấn đề này VNTesters sẽ sử dụng WebDriver Manager. Để cài WebDriver Manager, anh em gõ lệnh sau vô CMD

pip install webdriver_manager

Test case ở trên sẽ được sửa lại chút xíu cho linh hoạt.

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get ("https://vntesters.com/")
print (driver.title)
driver.quit()
view rawsimple_test_v2.py hosted with ❤ by GitHub

Test case nhìn ngon ăn hơn nhiều rồi đúng không nào? Tuy nhiên sau khi chạy Test Case xong thì chẳng biết là Pass hay Fail nữa vì thiếu checkpoint. Solution? Đọc tiếp phần sau nhé.

  10 Lý do nên học Python trong năm 2024

Chạy test case với PyTest

PyTest Framework hỗ trợ viết test nhanh và dễ dàng hơn. Từ những test case nhỏ đến những test case kiểm thử chức năng phức tạp…vân vân và mây mây. Thôi vô vấn đề chính, để xài được PyTest các bạn phải cài nó trước

pip install pytest

Sau đó sửa test case đơn giản của chúng ta lại chút xíu nữa

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import pytest

def test():
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get ("https://vntesters.com")
page_title = driver.title
assert 'Cộng Đồng Kiểm Thử Phần Mềm' in page_title
driver.quit()
view rawsimple_test_v3.py hosted with ❤ by GitHub

Sau khi chạy test case, các bạn sẽ biết là test case này Pass hay Fail. Cú pháp để chạy test case bằng PyTest như sau

pytest –q simple_test.py

Chạy test case với PyUnit

Lân Huỳnh đã có bài viết chi tiết về PyUnit rồi. Bài này mình chỉ update lại code cho ví thôi nhé.

import unittest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

class VNTestersTestCase(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Chrome(ChromeDriverManager().install())
self.addCleanup(self.browser.quit)
def testPageTitle(self):
self.browser.get('https://vntesters.com')
self.assertIn('Cộng Đồng Kiểm Thử Phần Mềm', self.browser.title)

if __name__ == '__main__':
unittest.main(verbosity=2)
view rawsimple_test_v4.py hosted with ❤ by GitHub

Các bạn chạy test case bằng lệnh sau

python -m unittest tests.py

Lời Kết

Như vậy là chúng ta đã viết được 1 test case đơn giản với Python Selenium. Từ level siêu gà đến hơi hơi gà. Chạy test case với PyTest, PyUnit kết hợp với WebDriver Manager. Để lại comment nếu bạn muốn biết thêm về những chủ đề khác.

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

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

Xem thêm việc làm IT mới nhất trên TopDev

Automation skills cho tester già mà lười

Automation skills cho tester già mà lười

Bài viết được sự cho phép của vntesters.com

Sau hơn 10 năm gắn bó với nghề kiểm thử phần mềm, VNTesters đã từng trải qua thăng có (lead nhiều project, có nhiều member…), trầm có (không project, không member…). Bài này mình đề xuất một vài automation skills cho tester già mà lười giống VNTesters.

Ngoài công việc ra thì gia đình, con cái hầu như đã chiếm gần hết quỹ thời gian 24h/ngày của mình. Thấy có gì đó hơi hơi tiếc nuối về tuổi trẻ đã giành không ít thời gian cho những chuyện vô bổ. Nhớ thời kỳ VLTK mới ra, hầu như mình đều dành 2-3h mỗi ngày để cày game. Nếu giành thời gian đó để học cái gì đó như ngôn ngữ lập trình nào đó, có lẽ giờ mình cũng đã có thể viết được vài cái app nho nhỏ hữu ích nào đó rồi.

Ok! hết 2 phút retrospective (ai từng làm Agile có lẽ sẽ quen với từ này), mình đã giành chút ít thời gian hiếm coi còn lại để định ra kế hoạch học thêm kỹ năng gì đó cho công việc. Mục tiêu là phải hữu ích cho công việc và phải phù hợp với lứa tuôỉ (già) và tính cách (lười). Kết quả cuối cùng là luyện vài kỹ năng kiểm thử tự động (automation skills cho tester già). Mà cụ thể là Selenium, ngôn ngữ dùng để viết script là Python. Tại sao lại là Selenium và Python? Các bạn đọc tiếp nhé…

Tại sao mình chọn Selenium?

Trên thị trường có khá nhiều các công cụ kiểm thử cho Desktop cũng như Web. Mình chọn Selenium vì nó phổ biến, cộng đồng mạnh, miễn phí và nhất là có thể kiếm job được hoặc chí ít có thể chém gió khi phỏng vấn vị trí kỹ sư kiểm thử phần mềm.

Các bạn có thể tham khảo kết quả khảo sát trên Facebook Group về automation tool hiện đang được sử dụng tại đây

Selenium Webdriver được tiến cử bởi W3C. Nó hỗ trợ những trình duyệt phổ biến. Điều này có nghĩa là Test viết 1 lần mà có thể chạy trên nhiều trình duyệt khác nhau. Webdriver đã thay đổi cách thức kiểm thử web. Các công cụ kiểm thử tự động hay Test Framework chỉ cần gọi WebDriver APIs, và nó hoạt động trên hầu hết các trình duyệt hiện hành.

Tại sao mình chọn Python?

Selenium Webdriver hỗ trợ khá nhiều ngôn ngữ lập trình dùng để viết test script. Java có vẻ như đang được ưa chuộng tuy nhiên đang có sự dịch chuyền dần sang Python. Theo tìm hiểu của VNTesters thì Selenium Python chạy nhanh hơn Selenium Java (mình chưa kiểm chứng được cũng chưa thấy official report nào). Anh chị em có thể tham khảo danh sách ngôn ngữ lập trình dùng để viết testscript tại đây https://www.seleniumhq.org/about/platforms.jsp#programming-languages

Tuy nhiên nguyên nhân chính mình chọn Python là do nó đơn giản và dễ học hơn Java hay C#. Nghe có vẻ rất phù hợp cho một người già và lười như VNTesters.

Kế hoạch luyện skills

Mình sẽ bỏ qua Selenium IDE, Selenium Grid, Selenium RC mà đi ngay vào Selenium WebDriver. Nếu tình hình cho phép mình sẽ ghi chú lại quá trình học của mình để các bạn tham khảo và chỉ giáo

  • Bước 0: Cài đặt Eclipse & PyDev. Có nhiều lựa chọn cho script/code editor hoặc IDE (Integrated development environment). Mình sẽ giải thích tại sao mình chọn bộ đôi này trong bài cài đặt.
  • Bước 1: Học cơ bản về python. Mình bỏ qua bước này tuy chưa rành Python cho lắm. Làm đến đâu google đến đó. Mình chủ yếu tham khảo và học (nếu có thời gian) từ cuốn này http://www.diveintopython3.net/
  • Bước 2: Luyện PyUnit, nếu có cơ duyên có thể làm thêm unit test (white-box testing)
  • Bước 3: Viết 1 test case đơn giản với Python Selenium Webdriver
  • Bước 4: Framework

Lời kết

Kế hoach là vậy (Automation skills cho tester già). Mọi ý kiến đóng góp cũng như phê bình đều được hoan nghênh. Các bạn ráng chờ tester già mà lười trong loạt bài tiếp theo nhé. Trong lúc chờ đợi các bạn có thể đọc bài tự học kiểm thử tự động với Seleniumhọc gì để trở thành automation tester và tham khảo báo cáo lương tester.

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

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

Xem thêm việc làm tester hcm, đà nẵng, hà nội hấp dẫn trên TopDev

Lập trình hướng đối tượng – Hiểu cái ý đồ

Lập trình hướng đối tượng – Hiểu cái ý đồ

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

Chào các bạn,

Lập trình hướng đối tượng đã rất quen thuộc với nhiều người, nhưng với những bạn mới học code thì lập trình hướng đối tượng có thể vẫn là khái niệm xa lạ. Thậm chí nhiều bạn đã học qua rồi nhưng vẫn chưa hiểu rõ bản chất, chưa hiểu thế nào là “Hướng đối tượng“. Thì với bài viết này, mình sẽ trình bày một cách ngắn gọn về lập trình hướng đối tượng, để các bạn hiểu rõ cái bản chất của nó, hiểu cái “ý đồ” của nó trong lập trình.

Lập trình hướng đối tượng còn được viết tắt là OOP – Object Oriented Programming, và nó là một kiểu lập trình.

  Lập trình hướng đối tượng (OOPs) trong Java
  OOP là gì? Giải thích dễ hiểu về lập trình hướng đối tượng

I. PHÂN TÍCH TỪNG THÀNH PHẦN CỦA “LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG”

Cụm từ “Lập trình hướng đối tượng” có thể được chia làm 2 phần như sau:

  • Lập trình: Ám chỉ việc viết code, lập trình viên sử dụng phương pháp lập trình hướng đối tượng vẫn phải viết code như thường, thậm chí viết code dài hơn.
  • Hướng đối tượng: Mô tả cách giải quyết bài toán của kiểu lập trình này. Đây là cụm từ quan trọng nhất trong khái niệm OOP, và cả bài viết này cũng chỉ nhằm tới mục giải thích cho bạn thế nào là “Hướng đối tượng“.

Vậy OOP là một kiểu lập trình (hay một kiểu viết code), thay vì hướng tới điều gì đó, thì phướng pháp này hướng tới đối tượng.

II. THẾ NÀO LÀ “HƯỚNG ĐỐI TƯỢNG”

Để hiểu thế nào là “hướng đối tượng” và làm nổi bật “hướng đối tượng”, mình sẽ đi so sánh lập trình hướng đối tượng với lập trình hướng cấu trúc thông qua việc so sánh cách giải của cùng một bài toán.

– Nếu như bạn đã biết code, nhưng chưa bao giờ code theo kiểu OOP thì khả năng cao những gì bạn code đều theo kiểu “hướng cấu trúc” (hay hướng thủ tục).
– Lập trình hướng cấu trúc sẽ tập trung vào triển khai các function (các hàm)

Xét bài toán như sau:

Viết một chương trình quản lý sinh viên, có các tính năng:
– Nhập thông tin sinh viên: tên, năm sinh, lớp
– Liệt kê sinh viên với các thông tin: tên, năm sinh, tuổi (tính theo công thức 2020 – năm sinh), lớp

Ví dụ được thực hiện trên ngôn ngữ lập trình JavaScript

>> Đọc thêm: Nhập môn lập trình với JavaScript

>> Đọc thêm: Học JavaScript trong 15 phút

2.1 Giải theo phương pháp hướng cấu trúc

// Tạo cái mảng để lưu thông tin của tất cả sinh viên
var danhSachSinhVien = []

// Tạo cái hàm để thêm sinh viên vào cái mảng ở trên
function themSinhVien (ten, namSinh, lop) {
    danhSachSinhVien.push({
        ten: ten,
        namSinh: namSinh,
        lop: lop
    });
}

// Tạo cái hàm tính tuổi của sinh viên
function tinhTuoi (namSinh) {
    let namHienTai = 2020;
    return namHienTai - namSinh;
}

// Tạo cái hàm hiểu thị thông tin của một sinh viên
function hienThiThongTin (sinhVien) {
    console.log('Ten:' + sinhVien.ten)
    console.log('Tuoi:' + tinhTuoi(sinhVien.namSinh))
    console.log('Nam Sinh:' + sinhVien.namSinh)
    console.log('Lop:' + sinhVien.lop)
    console.log('---')
}

// Tạo cái hàm liệt kê toàn bộ sinh viên
function lietKeDanhSach () {
    for (let sinhVien of danhSachSinhVien) {
        hienThiThongTin(sinhVien);
    }
}

// Thêm 1 sinh viên vào danh sách
themSinhVien('Binh', 1996, 'PHP');

// Thêm 1 sinh viên nữa
themSinhVien('Minh', 2000, 'PHP');

// Thêm một sinh viên nữa này
themSinhVien('Trang', 2005, 'JS');

// Liệt kê toàn bộ sinh viên
lietKeDanhSach();

/*
Output:

Ten:Binh
Tuoi:24
Nam Sinh:1996
Lop:PHP
---
Ten:Minh
Tuoi:20
Nam Sinh:2000
Lop:PHP
---
Ten:Trang
Tuoi:15
Nam Sinh:2005
Lop:JS
---
*/

2.2 Giải theo phương pháp hướng đối tượng

// Định nghĩa thế nào là một sinh viên
class SinhVien {
    // Sinh viên là đối tượng có các thông tin tên, năm sinh, lớp
    // Trong OOP, các thông tin này được gọi là thuộc tính
    // Các thuộc tính khai báo tại đây có thể sử dụng như một biến global trong các hành động
    constructor (ten, namSinh, lop) {
        this.ten = ten;
        this.namSinh = namSinh;
        this.lop = lop;
    }

    // Tính tuổi của một sinh viên
    // Trong OOP, đây được gọi là một hành động
    tinhTuoi () {
        let namHienTai = 2020;

        // Sử dụng thuộc tính năm sinh
        return namHienTai - this.namSinh;
    }

    // Hiển thị thông tin của một sinh viên
    hienThiThongTin () {
        console.log('Ten: ' + this.ten)
        console.log('Tuoi: ' + this.tinhTuoi())
        console.log('Nam Sinh: ' + this.namSinh)
        console.log('Lop: ' + this.lop)
        console.log('---')
    }
}

// Định nghĩa thế nào là một người quản lý sinh viên
class NguoiQuanLy {
    constructor () {
        // Người quản lý sinh viên sẽ quản lý một danh sách các sinh viên
        this.danhSachSinhVien = []
    }

    // Thêm một sinh viên vào danh sách
    themSinhVien (sinhVien) {
        this.danhSachSinhVien.push(sinhVien)
    }

    // Liệt kê tất cả các sinh viên có trong danh sách
    lietKeDanhSachSinhVien () {
        for (let sinhVien of this.danhSachSinhVien) {
            sinhVien.hienThiThongTin()
        }
    }
}

// Khởi tạo sinh viên thứ 1
let sinhVien1 = new SinhVien('Binh', 1996, 'PHP');

// Khởi tạo sinh viên thứ 2
let sinhVien2 = new SinhVien('Minh', 2000, 'PHP');

// Khởi tạo sinh viên thứ 3
let sinhVien3 = new SinhVien('Trang', 2005, 'JS');

// Khởi tạo một người quản lý sinh viên
let coGiaoChuNhiem = new NguoiQuanLy();

// Thêm sinhVien1 vào danh sách của coGiaoChuNhiem
coGiaoChuNhiem.themSinhVien(sinhVien1);

// Thêm sinhVien2 vào danh sách của coGiaoChuNhiem
coGiaoChuNhiem.themSinhVien(sinhVien2);

// Thêm sinhVien3 vào danh sách của coGiaoChuNhiem
coGiaoChuNhiem.themSinhVien(sinhVien3);

// Hiển thị danh sách sinh viên của coGiaoChuNhiem
coGiaoChuNhiem.lietKeDanhSachSinhVien();

/*
Output

Ten: Binh
Tuoi: 24
Nam Sinh: 1996
Lop: PHP
---
Ten: Minh
Tuoi: 20
Nam Sinh: 2000
Lop: PHP
---
Ten: Trang
Tuoi: 15
Nam Sinh: 2005
Lop: JS
---
*/

2.3 Nhận xét

Hãy đọc cẩn thận 2 đoạn code trên nhé, đừng đọc lướt qua, mình cần bạn đọc cẩn thận.

>> Đọc thêm: Lập trình hướng đối tượng trong JavaScript

Xét về kết quả (Output)

Về output của bài toán, cả 2 cách làm đều có output như nhau

Xét về cách tiếp cận

Lập trình hướng cấu trúc tiếp cận bài toán theo tính năng. Từ yêu cầu bài toán, ta xác định các tính năng cần triển khai, sau đó triển khai toàn bộ chương trình theo các tính năng đã phân tích được

– Từ yêu cầu “Nhập thông tin sinh viên”, tôi biết mình phải làm một tính năng “Nhập thông tin sinh viên”.
– Từ yêu cầu “Liệt kê thông tin về tuổi của sinh viên”, tôi biết mình phải làm một tính năng “Tính tuổi”

Lập trình OOP tiếp cận bài toán bằng cách xác định các đối tượng có thể xuất hiện trong bài toán, xác định thuộc tính và hành động cho các đối tượng, xác định mối quan hệ giữa các đối tượng.

– Tôi hình dung tới việc quản lý sinh viên trong thực tế, vì vậy tôi xác định bài toán sẽ có 2 đối tượng: SinhVien và NguoiQuanLyNguoiQuanLy sẽ quản lý nhiều SinhVien
– SinhVien sẽ có các thuộc tính tennamSinhlopNguoiQuanLy sẽ có thuộc tính danhSachSinhVien
– SinhVien sẽ có hành động “tự tính tuổi của mình” và “tự hiển thị thông tin của mình”
– NguoiQuanLy sẽ có hành động liệt kê hết thông tin sinh viên mình quản lý

Lập trình hướng cấu trúc khiến developer dễ dàng tưởng tượng ra cấu trúc chương trình mình định viết

Đọc yêu cầu bài toán, tôi xác định được ngay cấu trúc chương trình định viết bao gồm những function gì

Lập trình OOP đòi hỏi một bước phân tích, xác định các đối tượng tồn tại trong bài toán

May mắn bài toán quản lý sinh viên là một bài toán phổ biến, nên tôi dễ dàng xác định được các đối tượng. Chứ nếu là một bài toán mới, thì tôi sẽ cần nhiều thời gian hơn.

Xét về hướng giải quyết

Lập trình hướng cấu trúc giải quyết bài toán theo kiểu “làm mịn”, một tính năng phức tạp sẽ được chia nhỏ thành các hàm, các hàm lại có thể chia nhỏ thành các hàm nhỏ hơn, chia đến bao giờ bạn cảm thấy hàm đã đủ đơn giản.

Bạn có để ý chỗ hiển thị tuổi không, về cơ bản tôi có thể hiển thị tuổi trực tiếp trong lệnh console.log() (dòng 22), nhưng tôi nghĩ điều đó khó hiểu, nên tôi đã tách thành một hàm tinhTuoi() riêng

Lập trình OOP giải quyết bài toán bằng cách cho các đối tượng tương tác với nhau.

Tôi khai báo hành động tính tuổi cho mỗi sinh viên, người quản lý muốn biết tuổi thì có thể gọi tới hành động sinhVien.tinhTuoi() để biết tuổi của sinh viên đó

Lập trình hướng cấu trúc giải quyết trực tiếp bài toán. Trong khi lập trình OOP giải quyết bài toán gián tiếp qua hành động của các đối tượng.

Bạn thấy đấy, lập trình hướng đối tượng thật sự hướng tới các đối tượng.

III. ƯU & NHƯỢC ĐIỂM CỦA OOP

3.1 Ưu điểm

Có tính đóng gói cao

Vì tổ chức dưới dạng đối tượng, nên các hành động và thuộc tính sẽ được đóng gói trong các đối tượng, vì thế mà bạn dễ dàng quản lý code hơn.

Cách tiếp cận sát với thực tế

Mình cho rằng đây là ưu điểm lớn nhất. Nếu bạn để ý thì các sự vật, hiện tượng ngoài cuộc sống cũng có các hành động và thuộc tính, điều này cũng tương tự với các đối tượng trong OOP. Nên khi triển khai một phần mềm với các yêu cầu bắt nguồn từ thực tế, bắt nguồn từ cuộc sống, thì chúng ta sẽ dễ dàng chuyển đổi thành code.

Việc có cách tiếp cận sát với thực tế, cũng khiến code đọc mạch lạc hơn, dễ hiểu hơn, từ đó mà phần mềm sẽ dễ bảo trì, dễ nâng cấp hơn.

3.2 Nhược điểm

Nhược điểm kể ra cho vui thôi chứ bạn không có quyền “nghỉ chơi” với OOP đâu, vì nó hiện đang là kiểu lập trình phổ biến nhất trên thế giới. Nếu không muốn code OOP, thì bạn cũng không phù hợp với nghề developer.

Hơn nữa, quyền lựa chọn giữa code OOP và không code OOP cũng hạn chế, vì không phải ngôn ngữ nào cũng hỗ trợ OOP, và có những ngôn ngữ chỉ hỗ trợ OOP.

Nhưng may mắn rằng, các nhược điểm của OOP không phải là vấn đề lớn. Các developer trên khắp thế giới vẫn yêu thích và sử dụng OOP hằng ngày.

Khó tiếp cận với người mới bắt đầu

Những bạn mới code thường chỉ quan tâm tới output của chương trình, họ chẳng quan tâm tới phương pháp lập trình theo hướng cấu trúc hay hướng đối tượng, vì vậy mà họ thường “Từ chối hiểu OOP là gì” trong những ngày đầu học lập trình.

Mặt khác, phần lớn (khi không muốn nói là tất cả) chúng ta đều tiếp cận với kiểu lập trình hướng cấu trúc trước học OOP. Trong khi các ví dụ về lập trình hướng cấu trúc thường quá đơn giản để chúng ta thấy được hạn chế của nó. Vì thế khi tiếp cận với lập trình hướng đối tượng, chúng ta sẽ cảm thấy đây là một phương pháp “thừa”, và thường có chung một câu hỏi “Tại sao tôi phải học OOP trong khi mọi thứ vẫn ổn“. Trong trường hợp bạn quyết định học OOP đi nữa, thì theo sau OOP là một mớ kiến thức khác như tính đa hình, tính đóng gói, tình kế thừa, tính trừu tượng,…

Không phù hợp để giải quyết các vấn đề đơn giản

OOP như một con dao mổ trâu, trong trường hợp vấn đề của bạn chỉ là một con gà thì sử dụng OOP sẽ được coi là “mang dao mổ trâu đi giết gà”.

Hãy tưởng tượng mình chỉ muốn kiểm tra một string có đúng định dạng email không, mà lại tạo ra một class Email, kèm theo một hành động là validate() thì quả là cồng kềnh đúng không.

Một số nhược điểm khác

Mình tham khảo một số tài liệu thì họ nói OOP chạy chậm hơn so với kiểu lập trình hướng cấu trúc do phải thực thi nhiều thành phần hơn, và code OOP cũng thường dài hơn. Nhưng mình thấy đây không phải vấn đề, do sống tới 25 tuổi (2020) mà mình vẫn chưa gặp trường hợp nào mà vấn đề phát sinh từ việc số lượng dòng code nhiều, hay chương trình thực thi chậm do code OOP cả. Nên mình cứ đăng vậy cho các bạn tham khảo thôi nhé.

Chúc các bạn học tập hiệu quả

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

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

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

Một ngày làm việc của Google Product Manager

product manager là gì?
Một ngày làm việc của Google Product Manager

Tác giả: Alex Rechevskiy

Làm việc tại Google có gì khác so với các công ty công nghệ khác?

Công việc của Product Manager tại Google và những công ty khác nhau chủ yếu là do dự án đang thực hiện là dự án lớn hay nhỏ, họ làm việc để phát hành một sản phẩm mới hay duy trì phát triển sản phẩm đã có, làm việc với một nhóm các Product Manager hay đang điều hành team riêng của mình, thời gian làm việc cho dự án đó kéo dài bao lâu cũng như các mức độ bảo mật cho dự án.

Nếu bạn nghĩ rằng mình sẽ trở thành một Product Manager và tạo ra những video nói về cách làm sao tạo ra những resume hay nhất, cách trả lời phỏng vấn các chương trình Product Manager tuyển dụng tốt nhất để có thể làm việc ở vị trí này thì có thể bạn đã lầm. Google Product Manager dành rất nhiều thời gian ở công ty nên các nhiệm vụ mà họ chịu trách nhiệm cũng rất nhiều.

  3 bài học xương máu mà mỗi Product Manager đều phải trải qua.
  Con đường trở thành Product Manager từ lập trình viên tại Amazon

Công việc của một Product Manager là gì?

1. Có rất nhiều cuộc họp

Product Manager là gì và sẽ làm những gì? Họ là người quản lý toàn bộ quá trình thiết kế và sản xuất sản phẩm? Họ có hàng tá cuộc họp mỗi ngày. Vậy làm sao để sắp xếp thời gian làm việc hiệu quả nhất với nhiều cuộc họp như thế? Hãy check lịch các cuộc họp ngày hôm sau của bạn vào buổi tối trước. Bạn sẽ biết được trình tự cuộc họp mình cần tham dự, dễ dàng hiểu được nội dung cuộc họp vì đã review qua trước, từ đó bạn có thể thảo luận về những vấn đề được trình bày tại cuộc họp.

Product Manager
Product Manager phải họp nhiều lần trong ngày

Thông thường họ có từ 3 đến 5 cuộc họp khác nhau trong một ngày. Mỗi người sẽ có một ngày làm việc với các công việc khác nhau, nhưng với các công ty về công nghệ như Google thì cuộc họp có thể diễn ra mọi lúc. Để có thể tìm cách tốt nhất để thu nhập thông tin và data thông qua những cuộc họp trực tiếp như thế này. Sẽ có nhiều cuộc gặp mặt một – một giữa hai người để thảo luận,… có rất nhiều cuộc họp giữa các nhóm nhỏ với nhau mỗi ngày.

Xem thêm Tui muốn làm Product Manager (PM)! Biết PM là gì chưa mà đòi?

Và mỗi tuần đều có nhiều cuộc họp giữa các bộ phận trong công ty với nhau như với bộ phận sales, marketing, pháp lý, thiết kế, nghiên cứu, phân tích và nhiều bộ phận khác nữa. Sau khi kết thúc cuộc họp với các bên liên quan, Product Manager sẽ làm việc với các dev, Software engineer leader, Program Managers. Một Program Manager ở Google sẽ chịu trách nhiệm quản lý dự án, công việc của họ nhiều hơn và nhiều người trong số họ cũng có nền tảng kỹ sư.

2. Tổ chức công việc và sắp xếp tài liệu

Tôi sử dụng tiện ích Chrome để sắp xếp các tabs. Tôi không xem kiểu cùng lúc hàng chục tab trên Chrome vì luôn có rất nhiều tài liệu để theo dõi. Một trang giấy chỉ chứa một trong rất nhiều các thông tin của dự án

PRD là một bộ tài liệu đa dạng các yêu cầu của dự án, sau đó nó sẽ được trình bày với các kỹ sư để họ bắt đầu build các thông số kỹ thuật riêng cho từng dữ liệu và tiến hành lập kế hoạch hoạt động cho dự án trong thực tế.

Xem thêm Một số mẹo vặt dành cho Developer trên Chrome

Tuy nhiên, càng nhiều các nhiệm vụ được thực hiện trước khi PRD hoàn thành thì sản phẩm sẽ càng dễ dàng hơn khi thực sự đến lúc để các kỹ sư làm việc.

3. Mục tiêu và kết quả chính

Sẽ có rất nhiều task khác biệt nhưng liên kết với nhau trong một quý. Có lẽ bạn đã nghe đến việc không chỉ Google mà rất nhiều công ty công nghệ khác cũng sẽ làm như vậy. Kế hoạch làm việc của Google là quý này bạn sẽ bắt đầu lên kế hoạch làm việc cho quý tiếp theo với team của mình. Product Manager cần phải vạch ra mục tiêu của mình là gì, kết quả cần đạt được như thế nào, với kế hoạch đó thì bạn có đạt được mục tiêu đề ra không.

Xem thêm “Làm PM, theo anh không cần biết về code, nhưng phải hiểu về SQL, database, những khái niệm cơ bản của code”

Những mục tiêu này sẽ được thực hiện cho toàn công ty và hoàn toàn đồng bộ giữa các team để mọi người biết được mình đang làm gì. Nếu bạn cần sự giúp đỡ từ những phòng ban khác để hoàn thành công việc thì nên sắp xếp ổn thỏa ngay từ sớm để đảm bảo dự án hoàn thành kịp tiến độ. Bạn có thể sắp xếp những cuộc họp với các bộ phận như kỹ thuật,… hoặc họp với giám đốc kỹ thuật, giám đốc sản phẩm hoặc cả hai. Trong đó mọi người sẽ kiểm tra về doanh số bán hàng của quý rồi cũng như các chức năng khác có đang hoạt động hiệu quả không.

Mỗi ngày Product Manager có thể nhận từ 20 đến 200 email phụ thuộc vào các vấn đề mà họ đang làm việc nhiều hay ít, bug xảy ra trong quá trình làm việc có được theo dõi hay không. Product Manager được mong đợi sẽ là một trụ cột chính của thông tin, vì họ biết cách để tìm ra giải pháp tốt nhất.

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

4. Thuyết trình dự án

Có rất nhiều thứ cần làm với các tài liệu cũng như nhận xét về cách hoạt động của chúng. Product Manager sẽ đánh giá và phản hồi quá trình làm việc với các bộ phận trong buổi thuyết trình cùng các lãnh đạo. Thường là một cá nhân hoặc một Product Manager hoặc Project Manager sẽ tạo không gian riêng để các thành viên trong team cùng tham gia đóng góp câu hỏi và giải quyết chúng. Product Manager cộng tác với Project Manager để giải quyết các tài liệu, đảm bảo kế hoạch đã hoàn hảo. Vì nó sẽ được trình bày với giám đốc để họ xem xét trước.

Product Manager tuyển dụng
Công việc của Product Manager bao quát toàn bộ quá trình

5. Lộ trình xây dựng sản phẩm

Product Manager sẽ có một số cuộc gặp, thực hiện update các tài liệu, đọc và bổ sung nhận xét cũng như phản hồi email, dự trù kinh phí phù hợp để thực hiện và suy nghĩ về lộ trình xây dựng sản phẩm. Yếu tố nào là quan trọng nhất, khi nào vấn đề có thể xảy ra, giải quyết chúng như thế nào thì tốt nhất cho sản phẩm mới của mình.

Kết luận

Ngày làm việc tốt nhất là ngày bạn thực sự có thể đạt được sự tiến bộ về mọi thứ trong lộ trình công việc, trong những task quan trọng của sản phẩm để hoàn thiện sản phẩm trước khi phát hành. Trên đây là một số công việc cơ bản mà Product Manager cần làm. Tham khảo về nó và có sự chuẩn bị trước sẽ giúp bạn dễ dàng đậu vào các chương trình phỏng vấn của những công ty hạng top như KMS Technology tuyển dụng. Dù bạn ứng tuyển chương trình KMS tuyển dụng Intern với vị trí này thì việc chuẩn bị cũng rất cần thiết để thể hiện sự quan tâm của bạn với công việc.

Bài viết được transcript từ video gốc

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

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

Những mẹo hay để trở thành một Product Manager giỏi nhất

product manager là gì
Những mẹo hay để trở thành một Product Manager tuyệt nhất

Tác giả: SHERIF MANSOUR

Product manager là gì? Họ làm việc như thế nào?

Như chúng ta đã biết thì không có một định nghĩa thật sự rõ ràng cho khái niệm Product Manager là gì, và đôi khi một Product Manager phải đảm nhận nhiều công việc khác nhau. Nhiệm vụ chính của họ là làm sao để bật lên được điểm mạnh của sản phẩm mình đang chịu trách nhiệm, thông qua việc quản lý và giám sát toàn bộ quá trình làm việc.

Thế hệ trước đây thực hiện việc quản lý sản phẩm – product management với các vấn đề kỹ thuật, thiết kế, tài chính, marketing,… trong khi đó những người trẻ hiện nay, những người có cơ hội tiếp cận sâu sắc với công nghệ, họ quản lý sản phẩm bằng tư duy. Điều đó đòi hỏi bạn cần có những phương pháp riêng cho bản thân để trở thành một Product Manager thật sự.

Những tips hay ho để Product Manager làm việc hiệu quả hơn

Đánh đổi trong lựa chọn của Product Manager là gì?

Product Manager là gì? Đây là một công việc khó có định nghĩa rõ ràng nhưng tôi đã nghe ai đó ví von công việc Product Manager với công việc của một chính trị gia. Cả hai đều nhận được một nguồn tài nguyên được phân bổ hợp lý để làm việc. Chỉ khác nhau là mỗi người sẽ có cách riêng để làm sao sử dụng nguồn lực đó một cách tốt nhất và phát huy thế mạnh của công việc mình đang làm.

Xem thêm Product Manager được sinh ra để làm gì?

Dù là lúc nào đi nữa, một Product Manager sẽ luôn phải đối mặt với những lựa chọn khó khăn giữa việc: một tính năng có thể khiến một khách hàng lớn hài lòng nhưng lại khiến 100 khách hàng nhỏ hơn khó chịu, duy trì hiện trạng của sản phẩm hoặc định hướng sản phẩm theo hướng mới để mở rộng phạm vi tiếp cận và phù hợp với các mục tiêu kinh doanh lớn hơn, hoặc tập trung vào sự tươi sáng nhưng ít tác dụng hay sự nhàm chán nhưng quan trọng.

Muốn trở thành một Product Manager thực thụ, bạn phải hiểu rõ về sự đánh đổi giữa chi phí và lợi ích của từng lựa chọn để đưa ra những lựa chọn đúng đắn.

Biết cách tận dụng thế mạnh

Product Manager là người hiểu rõ hơn ai hết những lợi thế của nguồn data mà mình đang sở hữu. Bạn sẽ thất bại nếu không dành thời gian để nghiên cứu, tìm hiểu và lên kế hoạch cụ thể cho dữ liệu của mình. Đây là chuyện đương nhiên với tất cả công việc, chẳng hạn bạn apply vào vị trí tuyển dụng PM chưa có kinh nghiệm, việc đầu tiên bạn cần làm là tìm hiểu thật kỹ về những việc mình cần làm để từ đó có hướng đi đúng đắn.

Product Manager sẽ bắt đầu công việc bằng cách đặt ra những câu hỏi. Nếu bạn mới tiếp nhận vị trí này, lời khuyên của tôi là hãy dành nhiều thời gian để nói chuyện với khách hàng. Hãy nói chuyện với nhiều bên liên quan trong nội bộ công việc nhất có thể. Bạn cần phải hiểu rõ về mô hình kinh doanh, về lịch sử phát triển và hình thành cũng như hiểu được vai trò của mỗi người có ảnh hưởng như thế nào trong công việc. Chỉ có như thế bạn mới có thể đưa ra quyết định đúng đắn từ quan điểm cá nhân của mình.

product manager
Product Manager cần biết cách khai thác các thế mạnh của mình

Hãy để các thành viên trong team được tự quyết định

Product Manager không thể đưa ra mọi quyết định. Hãy tin tôi đi, tôi đã thử quản lý tất cả mọi thứ và vào cuối ngày tôi có hàng tá tin nhắn chưa đọc. Tôi phải mò mẫm xem lại từng tin nhắn để trả lời đồng nghiệp của mình.

Nhưng đây thật sự là việc các Product Manager không nên làm. Bạn đã bao giờ tự hỏi công việc của Product Manager là gì, nó nhiều như thế nào không? Vậy nên một trong những công thức để quản lý sản phẩm tốt nhất là hãy trao quyền cho team của bạn để mỗi người được đưa ra quyết định của riêng họ. Từ đó các ý kiến sẽ tạo nên một bộ não chung – hoặc tạo ra quyết định và một bộ tiêu chí để báo cáo những thành quả.

Khi một người nào đó trong team hỏi bạn về chuyện mà lẽ ra họ có thể tự quyết định thì chắc chắn là vì họ không được tạo điều kiện để làm vậy. Một Product Manager tài năng cần biết cách tạo cơ hội cho thành viên trong team được nói lên tiếng nói riêng.

Xem thêm việc làm tuyển product manager hấp dẫn tại TopDev

Học cách gây ảnh hưởng mà không cần dùng đến quyền hạn

Ảnh hưởng có nhiều dạng. Lắng nghe mọi người và hiểu cách tác động đến họ là bước đầu tiên. Tìm cách để họ hiểu được những gì bạn nói là bước thứ hai bạn cần làm. Và cuối cùng, bạn cần chứng minh được năng lực của mình với họ. Một số người sẽ không bị thuyết phục cho đến khi họ thấy bạn thật sự làm được việc.

Hiểu được công thức này để “lôi kéo”, thuyết phục nhân viên giúp bạn làm việc hiệu quả dù không phải dùng đến bất kỳ quyền hạn trực tiếp nào.

  Phỏng vấn Product Manager: Giới thiệu về bản thân sao cho ấn tượng?
  Con đường trở thành Product Manager từ lập trình viên tại Amazon

Kỹ năng quan trọng của Product Manager là gì? Biết cách thuyết phục người khác!

Như đã nói, một Product Manager cần học cách đưa ra những quyết định mang tính đánh đổi. Bạn có thể vấp phải sự phản đối khi nói lên lựa chọn của mình. Nên việc đầu tiên bạn cần làm là đưa ra quyết định đúng và giải thích lý do tại sao bạn làm như thế để thuyết phục các thành viên của mình.

Xem thêm các việc làm hấp dẫn KMS Technology tuyển dụng

Thời gian đầu có thể đồng nghiệp không thích điều đó nhưng nếu bạn có thể giải thích và thuyết phục, họ sẽ dần tôn trọng quyết định của bạn. Ngay cả khi họ không như vậy, những Product Manager tài năng sẽ biết cách biến chúng thành sự công nhận thật sự. Hoặc với bất cứ công việc nào khác cũng tương tự vậy, dù bạn là sinh viên đang apply chương trình KMS tuyển dụng intern chẳng hạn, bạn cũng cần biết cách nói chuyện thuyết phục để nhà tuyển dụng chấp nhận mình.

Kết luận

Những Product Manager tài năng sẽ là người làm được những điều trên và đặt ra các tầm nhìn tuyệt vời cho dự án tương lai của họ. Có thể thời gian đầu bạn sẽ cảm thấy khó khăn nhưng sự cố gắng sẽ giúp bạn thành công hơn khi apply vào các chương trình Product Manager tuyển dụng và cả trong công việc của mình.

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

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

Tuyển dụng lập trình viên đãi ngộ tốt trên toàn quốc, ứng tuyển ngay!

Tuyển dụng IT? Đâu là nguyên nhân dẫn đến các thách thức?

tuyen dung it da nang
tuyen dung it da nang

Không thể phủ nhận, tuyển dụng IT (tuyển dụng ngành công nghệ thông tin) là một trong những ngành hot. Tuy nhiên, tính cạnh tranh và những biến động đã tạo ra các thách thức trong vấn đề tuyển IT. Cùng TopDev tìm hiểu đâu là những khó khăn đang tồn tại qua bài viết sau!

Tuyển dụng IT là gì?

Tuyển dụng IT (IT Recruitment) là quá trình tuyển dụng các vị trí có liên quan đến ngành IT (ngành công nghệ thông tin – CNTT). Tùy vào mỗi vị trí, quá trình tuyển dụng sẽ có những yêu cầu nhất định về CV IT Developer, Freelancer IT, Cover Letter cho Dev. Tất nhiên, quá trình tuyển IT cần được thực hiện. Đồng thời, được quản lý bơi những nhà tuyển dụng giàu chuyên môn.

tuyen dung it da nang
Tuyển dung Công nghệ thông tin là gì?

Giải mã các nguyên nhân ảnh hưởng quá trình tuyển dụng IT

Có nhiều nguyên nhân làm tác động đến quá trình tuyển dụng IT. Chúng ta có thể chia ra thành 2 nguyên nhân như sau:

Nguyên nhân từ phía ứng viên 

Có thể thấy, rất nhiều ứng viên ra trường thiếu kinh nghiệm thực tế. Do vậy, CV cho sinh viên IT mới ra trường của họ thiếu sự chỉn chu. Thậm chí, họ hầu như chỉ có tấm bằng cử nhân thay vì các kinh nghiệm thực tế liên quan đến chuyên môn mà vị trí tuyen dung đòi hỏi.

Ngoài ra, họ là những người trẻ, họ luôn e sợ các thách thức mới. Họ chưa dám liều lĩnh để trải nghiệm tính thực tế cao. Và đặc biệt, môi trường cạnh tranh về tuyen dung it da nang quá áp lực. Với những người mới, dù có kinh nghiệm trước đó, trong họ vẫn tồn tại sự e dè về năng lực của bản thân. Điều này chính là nguyên nhân làm họ bị thụt lùi, trở nên bị động. Song, các nhà tuyển dụng sẽ khó khăn hơn trong việc tuyển dụng IT. Khi các ứng viên đa phần đều ngại thử thách; thậm chí là thiếu đi sự dân thân và nhiệt huyết của một người trẻ.

Nguyên nhân từ phía nhà tuyển dụng

Nhà tuyển dụng gặp khó khăn ghi cạnh tranh về thương hiệu tuyển dụng. Các doanh nghiệp dường như đấu tranh cho tuyen dung it da nang. Họ nhận ra tầm quan trọng của nhân lực IT. Vì thế, hầu hết các doanh nghiệp đều có những chiến lược phát triển quy trình tuyển dụng để thu hút ứng viên. Chính điều này tạo ra nhiều cơ hội lựa chọn cho nhiều ứng viên hơn.

tuyen dung it da nang
Doanh nghiệp liệu đã có những chiến lược đúng đắn?

Tuyen dung trở nên đầy thách thức hơn. Ứng viên có quá nhiều sự lựa chọn. Và điều đó dẫn đến thời gian tuyen sẽ kéo dài. Và tuyển dụng bị trì trễ thậm chí hiệu quả tuyển dụng IT cũng giảm xuống đáng kể. 

Không những thế, nhà tuyển dụng từ các doanh nghiệp dường như chưa có sự chuẩn bị tốt về các yêu tuyen dung it da nang. JD tuyển dụng rất quan trọng. Vì tùy vị trí khác như tuyển dụng Data Scientist, tuyển dụng Senior Developer thì đều cần một bộ thông tin chi tiết, rõ ràng về vị trí công việc. Các ứng viên sẽ khó nắm bắt chính xác những gì mình sẽ làm. Từ việc mơ hồ về thông tin tuyen dung, họ không đủ tự tin để ứng tuyển dù cho họ sở hữu các kỹ năng – chuyên môn thật sự phù hợp.

Lời kết

Thế mới thấy, tuyển dụng IT có nhiều khó khăn đang tồn tại. Vấn đề nằm ở chỗ mỗi ứng viên cần hiểu rõ về năng lực của mình. Đâu là điểm mạnh và điểm yếu cần khắc phục. Ngoài ra, để tuyen dung hiệu quả, ứng viên cần rèn luyện các kỹ năng cần thiết liên quan đến vị trí ứng tuyển.

Về phía nhà tuyển dụng, các doanh nghiệp cần định hình và triển khai các chiến lược phát triển thương hiệu nhà tuyển dụng. Điều này có ý nghĩa quan trọng trong việc tiếp cận chính xác với với nguồn ứng viên tiềm năng.


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 hàng đầu tại TopDev

Mới đi làm thì chọn công ty to hay công ty nhỏ

Mới đi làm chọn công ty to hay nhỏ

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

Chào các bạn,

Câu hỏi “mới đi làm thì nên chọn công ty to (công ty lâu năm, nhiều nhân sự) hay công ty nhỏ (mới startup) để làm việc” là một câu hỏi cũ nhưng chưa bao giờ hết hot. Đặc biệt là mỗi mùa ra trường, các bạn sinh viên lại đau đầu, không biết nên “trao thân gửi phận” vào đâu là hợp lý nhất.

Mặc dù đã có rất nhiều các bài viết khác trên internet viết về chủ đề này, nhưng mình vẫn xin phép được đưa ra một số ý kiến riêng, hy vọng sẽ giúp các bạn có thêm góc nhìn để có sự lựa chọn tốt nhất.

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer
  10 câu nói cực hay về lập trình

Phần lớn chúng ta đều cho rằng khi vào công ty to sẽ học được sự chuyên nghiệp, được trả lương cao, vào công ty nhỏ sẽ học được nhiều việc. Ban đầu mình cũng nghĩ vậy, nhưng theo tìm hiểu và trải nghiệm của bản thân, mình dần thấy điều này không còn đúng nữa. Cụ thể thì các phân tích dưới đây sẽ chỉ rõ.

Bài viết sẽ được chia làm 2 phần: một là mình sẽ đi chỉ ra một số sự thật của công ty to và công ty nhỏ mà mọi người có thể nhầm lẫn, sau đó mới đi trả lời câu hỏi “Mới đi làm thì chọn công ty hay nhỏ”.

Lưu ý: Bài viết chỉ thảo luận trong phạm vi ngành IT.

I. MỘT SỐ SỰ THẬT DỄ NHẦM LẪN

1.1 Chỉ có công ty to mới chuyên nghiệp?

Chuyên nghiệp ở đây là chuyên nghiệp trong cách làm việc. Ban đầu mình cho rằng công ty lớn sẽ có quy trình làm việc rõ ràng, có đầy đủ bộ phận và mỗi người làm một việc, giống như BA chỉ việc phân tích, dev chỉ việc code, tester chỉ việc test,… Và ngược lại, các công ty nhỏ thì sẽ làm kiểu kiêm nhiệm, mỗi người đều đảm nhiệm từ 1 – 2 vai trò trong dự án, và thường không có quy trình làm việc.

>> Đọc thêm: Các công việc hàng ngày của lập trình viên.

Nhưng không phải vậy, không có mối liên hệ nào giữa quy trình làm việc chuyên nghiệp và độ lớn của công ty cả. Một công ty lớn vẫn có thể có quy trình làm việc lộn xộn, và công ty nhỏ vẫn có thể có quy trình rõ ràng. Vậy sự chuyên nghiệp phụ thuộc vào điều gì trong công ty? Theo mình thì:

  • Phụ thuộc vào team: Một công ty tuy lớn, nhưng để triển khai dự án thì chỉ cần một team hoặc một vài team là đủ, và chuyên nghiệp hay không thì phụ thuộc vào thành viên trong team có chuyên nghiệp hay không.
  • Phụ thuộc vào tính chất của dự án: Một dự án không quá khó, thì không cần có quá nhiều người tham gia, vì vậy các thành viên trong team có thể làm kiêm nhiệm nhiều vai trò. Và nếu là một dự án siêu đơn giản, thì thậm chí còn không có bước kiểm thử, hay viết tài liệu mô tả.

Chúng ta không thể cho rằng một công ty nhỏ thì không có team chuyên nghiệp, cũng không thể cho rằng một công ty nhỏ thì không làm được dự án khó. Vì thế, không thể khẳng định công ty lớn thì chuyên nghiệp, còn công ty nhỏ thì kém chuyên nghiệp. Mặt khác, nhiều công ty nhỏ được dẫn dắt bởi các senior đầy kinh nghiệm, và họ không hề nghiệp dư.

1.2 Chỉ có công ty to mới trả lương cao?

Vào công ty to sẽ được trả lương cao hơn? Không, không đúng, lương cao hay thấp phụ thuộc vào rất nhiều yếu tố, và mình không cho rằng quy mô công ty sẽ ảnh hưởng tới mức lương hàng tháng.

>> Đọc thêm: Ngôn ngữ lập trình nào lương cao nhất.

Chúng ta đều biết rằng, tiền lương bản chất chính là công sức lao động của bản thân trong tháng đó, nếu muốn lương cao, nghĩa là bạn phải đem lại giá trị cho công ty nhiều hơn (làm nhiều hơn, làm việc khó hơn, chịu trách nhiệm nhiều hơn).

Nếu một công ty sẵn sàng trả cho bạn lương cao hơn mặt bằng chung, trong khi lại không yêu cầu bạn phải đem lại giá trị tương xứng, thì khả năng bạn sẽ không được tăng lương trong một hoặc một vài đợt tới, hoặc có thể là bạn đang mắc bẫy họ (bẫy thế nào thì inbox mình nói cho vì vấn đề này nhạy cảm). Hãy nhớ rằng “không có bữa ăn nào miễn phí, và miếng pho mai chỉ nằm trên cái bẫy chuột“. Các công ty lớn đều giống như tấm chiếu cũ, “từng trải” rất nhiều, họ sẽ không ngây thơ như vậy đâu.

Với công ty nhỏ, lương bạn nhận được sẽ rất xứng đáng, bởi họ không có nhiều tiền để chạy chiến lược “nuôi quân ba năm dùng một giờ“. Mặt khác họ cũng không thể trả bạn thấp hơn so với mặt bằng chung vì nhân sự IT đang thiếu hụt rất nhiều, họ cũng lo lắng là bạn sẽ nhảy việc lắm chứ.

Sau cùng, không có mối liên hệ giữa quy mô công ty và lương, chỉ có mối liên hệ giữa công sức của bạn và lương.

1.3 Công ty nào sẽ học hỏi được nhiều hơn?

Người thì cho rằng công ty lớn sẽ học hỏi được nhiều hơn, người thì cho rằng công ty nhỏ sẽ học được nhiều hơn. Nhưng mình cho rằng công ty nào cũng có cái hay để học cả, và không có mối liên hệ nào giữa quy mô công ty và kiến thức bạn học hỏi được. Bạn học hỏi được bao nhiêu một phần là do bạn, phần khác là tính chất của công ty. Công ty áp dụng quy trình làm việc chuyên nghiệp thì bạn học được sự chuyên nghiệp, công ty áp dụng công nghệ abc thì bạn sẽ học được công nghệ abc. Có vậy thôi.

>> Đọc thêm: Những bài học cuộc sống mà mình học được từ code.

1.4 Công ty nào công việc ổn định hơn?

Chắc nhiều bạn sẽ cho rằng công ty lớn công việc sẽ ổn định hơn, thế nhưng lại nhầm to. Cũng không có mối liên nào giữa quy mô công ty và tính ổn định của công việc cả. Công ty lớn sẽ khó bị phá sản hơn, nhưng vẫn sẵn sàng cắt giảm nhân sự khi cần thiết (điển hình như trong đợt covid vừa qua), vị trí công việc của bạn vẫn bị đe dọa như thường. Sau cùng, ổn định hay không vẫn là ở bạn, nếu bạn “pro vip” thì chẳng bao giờ phải lo công việc không ổn định.

1.5 Công ty nào thăng tiến tốt hơn?

Một lần nữa, không có mối liên hệ giữa quy mô công ty và tốc độ thăng tiến của bạn. Thăng tiến hay không phụ thuộc vào nhiều yếu tố:

  • Chính bạn: Bạn có đủ khả năng để làm việc khó hơn, chịu trách nhiệm nhiều hơn,…
  • Tốc độ phát triển của công ty: Công ty có phát triển đủ nhanh để có các vị trí cao và phù hợp với năng lực của bạn. Và đương nhiên, một công ty nhỏ vẫn có thể có những bước phát triển đột phá, tạo ra các vị trí quan trọng cần người lãnh đạo.

II. NÊN CHỌN CÔNG TY TO HAY NHỎ KHI MỚI ĐI LÀM?

Không, chẳng có câu trả lời nào thỏa đáng cả, bởi chính câu hỏi này vẫn còn đang mập mờ. Giống như bạn không thể tính được diện tích của hình chữ nhật khi chỉ biết độ dài của một cạnh ý. Và mình cũng cho rằng không nên chọn chọn công ty chỉ dựa vào việc nó to hay nhỏ, mà cần dựa vào nhiều yếu tố khác, như:

  • Bạn có thích lĩnh vực của công ty đó?
  • Công ty đó có áp dụng các công nghệ, kiến thức mà bạn biết, quan tâm, hay mong muốn học tập.
  • Công ty đó có môi trường làm việc phù hợp với bạn.
  • Đồng nghiệp ở đó có tốt không? Sếp ở đó có tốt không?

>> Đọc thêm: TopCV – Tuyển đồng nghiệp về cà khịa

Đừng ngại ngần ứng tuyển vào một công ty chỉ vì bạn cho rằng nó “nhỏ”, cũng như đừng để một công ty lớn làm lóa mắt. Làm trong một công ty vĩ đại không khiến bạn trở nên vĩ đại, người đưa một công ty trở nên vĩ đại, mới là người vĩ đại.

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

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

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

Làm việc với nguồn dữ liệu trong JasperReport

Làm việc với nguồn dữ liệu trong JasperReport

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

Các báo cáo chỉ được tạo ra khi có các nguồn dữ liệu hay có một thuật ngữ hay dùng là Data Adapter (tạm dịch là những bộ chuyển đổi dữ liệu), nó xác định hai việc là nơi lấy dữ liệu và lấy dữ liệu bằng cách nào? Data adapter là các đối tượng được lưu trữ trong một file XML chứa các cấu hình về cổng, nguồn dữ liệu… cho các môi trường JasperReport khác nhau. Hiện tại có rất nhiều các nguồn dữ liệu khác nhau như:

Làm việc với nguồn dữ liệu trong JasperReport

  • Dữ liệu trong các hệ cơ sở dữ liệu thông dụng như SQL Server, mySQL, Oracle…
  • Dữ liệu trong các loại file phổ biến như Excel, CSV
  • Dữ liệu trong các định dạng XML, JSON thông qua file hoặc qua các đường dẫn trên mạng

Data Adapter là cầu nối giúp các báo cáo xác định được nơi lấy dữ liệu và cách thức lấy khác nhau đối với mỗi loại dữ liệu ở trên.

  12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2024
  Các kiểu dữ liệu trong lập trình C/C++ (Data type)

1. Tạo và chỉnh sửa Data Adapter

1.1 Tạo Data Adapter

Một data adapter có thể được sử dụng chỉ cho một project nhất định hoặc có thể sử dụng ở phạm vi toàn cục cho tất cả các project. Ở phạm vi cục bộ của project, data adapter được lưu thành file XML trong project, nó có thể được copy từ project này sang project khác một cách dễ dàng. Với các data adapter ở phạm vi toàn cục, nó được lưu lại thành các thiết lập trong Eclipse (nhân của JasperSoft Studio) và hiển thị ở tất cả các project. Để tạo một data adapter mới click vào biểu tượng trên thanh công cụ chính hoặc click chuột phải vào một project (phạm vi cục bộ) trong cửa sổ Project Explorer và chọn New > Data Adapter hoặc click chuột phải vào nút Data Adapters trong cửa sổ Respository Explorer (phạm vi toàn cục) và chọn Create Data Adapter.

Làm việc với nguồn dữ liệu trong JasperReport

Trong cửa sổ Data Adapter Wizard có rất nhiều các loại Data Adapter khác nhau, chọn loại Data Adapter phù hợp với nguồn dữ liệu của bạn sau đó bấm Next. Bước tiếp theo chúng ta sẽ thiết lập một số thông tin giúp cho Data Adapter biết cách thức kết nối đến nguồn dữ liệu và lấy dữ liệu ra. Tùy thuộc vào loại Data Adapter, các thông tin thiết lập có thể bao gồm đường dẫn đến nguồn dữ liệu, cổng kết nối, thông tin đăng nhập, các driver ngoài hỗ trợ kết nối… Trong cửa sổ tiếp theo này có nút Test giúp chúng ta kiểm tra thử xem các thiết lập đến nguồn dữ liệu đã hoạt động hay chưa.

Làm việc với nguồn dữ liệu trong JasperReport

Tiếp theo, với các thông tin thiết lập cho data adapter, nó sẽ tự động kết nối đến nguồn dữ liệu để lấy ra thông tin về các trường dữ liệu để người dùng có thể lựa chọn sau này đưa vào báo cáo. Khi bạn nhấp vào nút Finish, toàn bộ thiết lập này sẽ được lưu trữ lại thành một file XML trong project hoặc trong thiết lập toàn cục phụ thuộc vào lựa chọn ban đầu.

1.2 Import và export data adapter

JasperSoft Studio cho phép chúng ta import và export các thiết lập data adapter hỗ trợ cho việc chia sẻ các cấu hình nguồn dữ liệu. Việc import và export sẽ thông qua các file XML, thực hiện export một data adapter thành file XML bằng cách nhấp chuột phải vào data adapter đó trong cửa sổ Repository Explorer và chọn Export to File.

Làm việc với nguồn dữ liệu trong JasperReport

Sau đó chúng ta lựa chọn tên file và nơi lưu trữ, click OK là các thiết lập data adapter đó được lưu thành file XML. Để import một file XML cấu hình cho data adapter, chúng ta nhấp chuột phải vào Data Adapters trong cửa sổ Repository Explorer và chọn Import From Workspace và chọn đến file XML cần đưa vào. Chú ý, có tùy chọn Overwrite data adapter if exists để có thể ghi đè thiết lập data adapter nếu nó đã tồn tại trước đấy.

1.3 Copy data adapter giữa các project

Data adapter bản chất là các file XML lưu trữ thiết lập, do vậy việc copy giữa các project là hết sức đơn giản. Trong cửa sổ Project Explorer, nhấp chuột phải vào data adapter còn copy chọn Copy hoặc nhấn tổ hợp phím Ctrl + C sau đó chọn project đích và chọn Paste hoặc Ctrl + V.

1.4 Chỉnh sửa data adapter

Để chỉnh sửa thiết lập trong data adapter, nhấp đúp chuột vào data adapter cần chỉnh sửa trong cửa sổ Repository Explorer hoặc chuột phải chọn Edit Data Adapter.

2. Thiết lập một số data adapter thông dụng

Trong cửa sổ tạo data adapter chúng ta thấy có rất nhiều loại, tuy nhiên trong khuôn khổ bài viết này chúng ta sẽ chỉ tìm hiểu các loại data adapter cho một số nguồn dữ liệu thông dụng nhất hiện nay: CSDL mySQL, dữ liệu dạng JSON.

2.1 Làm việc với MySQL thông qua JDBC Connection

MySQL là một hệ cơ sở dữ liệu mã nguồn mở miễn phí được sử dụng rất nhiều, MySQL phù hợp với các ứng dụng vừa và nhỏ, nó được sử dụng ở khắp mọi nơi trên thế giới. Thiết lập báo cáo JasperReport sử dụng nguồn dữ liệu MySQL khá đơn giản.

Bước 1: Tạo data adapter dạng JDBC Connection

JDBC viết tắt của Java Database Connectivity là một API được thiết kế dành cho ngôn ngữ lập trình Java, hỗ trợ việc truy cập đến Cơ Sở Dữ Liệu (CSDL), nó gồm có những phương thức thực hiện truy vấn và cập nhật CSDL gián tiếp qua Java. Nhấp chuột phải vào Data Adapters trong cửa sổ Repository Explorer và chọn Create Data Adapter.

Làm việc với nguồn dữ liệu trong JasperReport

Chọn Database JDBC Connection và chọn Next

Bước 2: Thiết lập các thông tin kết nối đến CSDL MySQL

Làm việc với nguồn dữ liệu trong JasperReport

Các thông tin cần thiết lập bao gồm:

  • JDBC Driver (trình điều khiển) là một phần mềm nhỏ được cung cấp bởi nhà phát triển CSDL theo một tiêu chuẩn của do Java đưa ra giúp cho Java có thể kết nối đến các CSDL. Do có nhiều các CSDL khác nhau nên có nhiều các driver khác nhau, chúng ta cần lựa chọn driver phù hợp. Với CSDL MySQL chúng ta thấy có hai driver là org.gjt.mm.mysql.Driver và com.mysql.jdbc.Driver. Chúng ta chọn com.mysql.jdbc.Driver vì org.gjt.mm.mysql.Driver chỉ tương thích với các driver phiên bản rất cũ.
  • JDBC URL: là một đường dẫn theo định dạng cho trước, nó sẽ có một số thông tin như tên miền hoặc ip máy chủ CSDL, cổng kết nối và tên database cần lấy dữ liệu. Trong hình ảnh minh họa URL là jdbc:mysql://localhost:3306/cussupport thì máy chủ CSDL ở đây cài cục bộ nên có tên là localhost, cổng kết nối mặc định của MySQL là 3306 và database cần kết nối đến là cussupport.
  • Username và password: Thông tin tài khoản để kết nối đến CSDL MySQL, vì CSDL cài cục bộ nên lấy luôn tài khoản mặc định là tài khoản root và không có password.

Ok như vậy bạn đã thiết lập xong, thử click vào nút Test để kiểm tra thử kết nối xem thế nào.

Làm việc với nguồn dữ liệu trong JasperReport

Lỗi rồi, hic: Không tìm thấy driver. Lỗi này là do chúng ta mới chỉ định là sử dụng class com.mysql.jdbc.Driver mà chưa chỉ chỗ cho data adapter biết là Class này phải tìm ở đâu. Trong tab Driver Classpath, click vào Add để trỏ đến file driver vật lý. File này có thể tìm thấy ở các website của nhà phát hành CSDL, với MySQL chúng ta vào mysql.com và tìm kiếm từ khóa JDBC Connection hoặc bạn có thể vào thẳng đường dẫn tải các driver của MySQL này. Chú ý, driver này cũng có thể tìm thấy trong thư mục cài đặt MySQL. Chú ý, driver này là file có phần mở rộng là .jar (Java Archive) là file lưu trữ thông tin của Java và có thể thực thi được bằng máy ảo Java.

Làm việc với nguồn dữ liệu trong JasperReport

Click vào Test để kiểm tra lại kết nối một lần nữa.

Làm việc với nguồn dữ liệu trong JasperReport

Kiểm tra đã thành công, như vậy là các thông tin thiết lập cho data adapter đến CSDL MySQL đã hoàn thành.

2.2 Làm việc với nguồn dữ liệu dạng JSON

JSON viết tắt của JavaScript Object Notation là một kiểu dữ liệu mở trong JavaScript, nó bao gồm chủ yếu là văn bản có cấu trúc theo cặp dạng thuộc tính/giá trị (attribute/value). JSON là một kiểu dữ liệu trung gian, thường được sử dụng truyền tải thông tin giữa các thành phần của một chương trình. JSON hiện nay rất phổ biến vì tính đơn giản và khả năng parser nhanh cũng như dung lượng rất nhỏ do đã loại bỏ rất nhiều các thông tin metadata như XML.

Bước 1: Tạo data adapter dạng JSON

Thực hiện các bước tạo Data Adapter giống như với JDBC Connection, tuy nhiên đến bước chọn dạng Data Adapter thì chọn JSON File:

Làm việc với nguồn dữ liệu trong JasperReport

Bước 2: Thiết lập thông tin trong data adapter dạng JSON

Làm việc với nguồn dữ liệu trong JasperReport

Một số thông tin cơ bản:

  • Name: Tên data adapter
  • File/URL: Đường dẫn đến file JSON cục bộ hoặc đường dẫn http. Nếu đường dẫn JSON này có yêu cầu xác thực thì bấm vào Options khi đó chúng ta có thể thêm vào thông tin tài khoản đăng nhập cũng như là các tham số URL, thậm chí có thể thêm dữ liệu vào HTTP headers trước khi gửi yêu cầu đi.
  • Pattern: vì JSON là dạng văn bản không có chứa dạng dữ liệu do vậy có thể tạo ra các pattern cho các loại dữ liệu như ngày tháng, các loại dữ liệu số.

Sau khi thiết lập xong chúng ta cũng sử dụng nút Test để kiểm tra kết nối đến nguồn dữ liệu.

Bài viết gốc được đăng tải tại allravel.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

Hàm bạn và lớp bạn trong C++

Bài viết được sự cho phép của tác giả Khiêm Lê

Đặt vấn đề

Giả sử bạn có hai class là MyClass1 và MyClass2, không dùng getter và setter, bạn hãy giải quyết hai vấn đề sau:

  • Truy cập thành phần private hoặc protected của hai class trên trong một hàm khác không phải thành phần của hai class đó.
  • Truy cập thành phần private hoặc protected của MyClass1 từ thành phần của class MyClass2.

Nhìn qua có vẻ khó nhưng nếu bạn biết được hàm bạn và lớp bạn thì mọi chuyện sẽ cực kỳ đơn giản.

  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++
  Các kiểu dữ liệu trong lập trình C/C++ (Data type)

Hàm bạn

Hàm bạn (friend function) là hàm có thể truy cập thành phần private hoặc protected của lớp xem nó là bạn.

Giả sử mình có class MyClass và hàm myFunc như sau:

class MyClass
{
private:
    int _privateProp;

public:
    MyClass(int n) // constructor
    {
        this->_privateProp = n;
    }
};

void myFunc(MyClass mClass)
{
    cout << mClass._privateProp; // Không hợp lệ
}

Như bạn thấy trong đoạn code trên, dòng in ra giá trị thuộc tính _privateProp là không hợp lệ do nó là thuộc tính private và không được phép truy cập từ bên ngoài. Tuy nhiên mọi chuyện sẽ khác nếu hàm myFunc là hàm bạn của lớp MyClass.

Để khai báo hàm bạn, ta có cú pháp như sau:

class <ClassName>
{
    // properties & methods
    friend <return_type> <func_name>([<parameters>]);
};

Chỉ đơn giản như bạn khai báo function prototype và thêm từ khóa friend ở phía trước. Vậy thì đối với ví dụ của mình thì sẽ thêm như sau:

class MyClass
{
    // properties & methods
    friend void myFunc(MyClass);
};

Lưu ý: nhiều bạn thường nhầm hàm myFunc là thành phần của class MyClass. Hàm myFunc không phải là thành phần của lớp MyClass, nó chỉ là một hàm bình thường (không hề có toán tử phạm vi (::) trước tên hàm).

Bây giờ thì hàm myFunc đã là hàm bạn của lớp MyClass, do đó đoạn code in giá trị thuộc tính _privateProp sẽ hợp lệ. VÍ dụ hoàn chỉnh như sau:

#include <iostream>
using namespace std;

class MyClass
{
private:
    int _privateProp;

public:
    MyClass(int n)
    {
        this->_privateProp = n;
    }

    friend void myFunc(MyClass);
};

void myFunc(MyClass mClass)
{
    cout << mClass._privateProp;
}

int main()
{
    MyClass mClass(2409);
    myFunc(mClass); // in ra màn hình 2409
    return 0;
}

Như vậy vấn đề đầu tiên đã được giải quyết, giờ chúng ta hãy đến với vấn đề thứ hai.

Lớp bạn

Lớp bạn (friend class) là lớp có thể truy cập các thành phần private hoặc protected của lớp xem nó là bạn.

Giả sử mình có hai class như sau:

class MyClass1
{
private:
    int _privateProp;

public:
    MyClass1(int n)
    {
        this->_privateProp = n;
    }
};

class MyClass2
{
private:
    int _privateProp;

public:
    MyClass2(int n) // constructor
    {
        this->_privateProp = n;
    }

    void myMethod(MyClass1 mClass)
    {
        cout << mClass._privateProp; // Không hợp lệ
    }
};

Trong đoạn code trên, dòng in giá trị thuộc tính _privateProp trong phương thức myMethod của lớp MyClass2 không hợp lệ do ta không thể truy cập thành phần private hoặc protected từ bên ngoài class.

Để phương thức myMethod có thể truy cập được thành phần private, protected của lớp MyClass1, hay tổng quát hơn là để lớp MyClass2 có thể truy cập thành phần private, protected của lớp MyClass1, ta sử dụng cú pháp:

class <ClassName>
{
    // properties & methods
    friend class <friendClass>;
}

Quay trở lại với ví dụ, chúng ta chỉ cần thêm như sau để đoạn code hợp lệ:

class MyClass1
{
    // properties & methods
    friend class MyClass2;
}

Như vậy, lớp MyClass2 đã là lớp bạn của lớp MyClass1, vậy phương thức myMethod của lớp MyClass2 sẽ có quyền truy cập các thành phần private, protected của lớp MyClass1 một cách hợp lệ. Và đây là toàn bộ ví dụ:

#include <iostream>
using namespace std;

class MyClass1
{
private:
    int _privateProp;

public:
    MyClass1(int n)
    {
        this->_privateProp = n;
    }

    friend class MyClass2;
};

class MyClass2
{
private:
    int _privateProp;

public:
    MyClass2(int n)
    {
        this->_privateProp = n;
    }

    void myMethod(MyClass1 mClass)
    {
        cout << mClass._privateProp;
    }
};

int main()
{
    MyClass1 mClass1(2409);
    MyClass2 mClass2(2001);
    mClass2.myMethod(mClass1); // in ra màn hình 2409
    return 0;
}

Như vậy, chúng ta đã giải quyết được vấn đề thứ hai ở phần đặt vấn đề đã đưa ra.

Lưu ý: lớp bạn là mối quan hệ một chiều, có nghĩa là lớp này có thể xem lớp kia là bạn, nhưng không có nghĩa lớp kia xem lớp này là bạn. Trong ví dụ trên, lớp MyClass1 xem lớp MyClass2 là bạn nhưng không có nghĩa là lớp MyClass2 xem lớp MyClass1 là bạn (nếu muốn, bạn phải khai báo lớp bạn tương tự cho lớp MyClass2).

Tổng kết

Vậy là qua bài viết này, mình đã giới thiệu đến các bạn hàm bạn và lớp bạn trong C++. Nếu các bạn thấy hay, đừng quên đăng ký nhận thông báo mới nhất và chia sẻ để bạn bè cùng biết. Cảm ơn các bạn đã đọc bài viết!

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

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

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