Home Blog Page 120

Share data giữa Docker Container bằng Docker Volume

Share data giữa Docker Container bằng Docker Volume

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

Như chúng ta đều biết, đặc điểm của Docker container là chúng chạy độc lập, và không ảnh hưởng đến nhau, thế nhưng vì một lí do nào đó, chúng ta lại muốn chia sẻ data giữa các container ví dụ, bạn có một 2,3 web server nginx và mong muốn khi chúng share chung các file config, hay html tĩnh. May mắn docker cung cấp volume để thực hiện việc đó.

  Docker to Serverless (Google Cloud Platform)

  Kubernetes sẽ không còn hỗ trợ Docker?

Docker volume là một volume được tạo ra cho phép các container mount volume vào trong các container hay dễ hiểu hơn là đocker sử dụng Volume đó thay thế cho 1 folder của container.

Để tiến hành chia sẻ file html tĩnh cho các 2 web server nginx, đầu tiên mình tạo một volume và đặt tên nó là nginx-static-html-share-volume

docker volume create nginx-static-html-share-volume
Image for post

Mỗi volume được lưu trữ trong host file system (/var/lib/docker/volumes/), và được docker quản lí.

Để xem thông tin chi tiết hơn về volume đã được tạo mình dùng lệnh.

docker volume inspect nginx-static-html-share-volume
Image for post

docker volume inspect

Như các bạn thấy thì volume chúng ta nằm ở “/var/lib/docker/volumes/nginx-static-html-share-volume/_data”

Trước khi chui vào đây thì mình sẽ tạo ra hai web server nginx share folder “/usr/share/html” cho cả hai bằng cách mount volume đó vào 2 container.

docker run -d --name nginx1 --mount source=nginx-static-html-share-volume,destination=/usr/share/nginx/html -p 2222:80 nginx
docker run -d --name nginx2 --mount source=nginx-static-html-share-volume,destination=/usr/share/nginx/html -p 2223:80 nginx

Khi bạn chạy docker run một container, có chỉ định — mount, đầu tiên docker sẽ xem volume đã tồn tại hay chưa, nếu chưa thì docker sẽ tạo volume đó. Sau đó docker sẽ tiến hành copy tất cả các file trong destination vào volume và sau khi copy xong docker container sẽ sử dụng volume đó thay cho destination. Mọi thao tác của container với destination thực chất là thao tác với docker volume.

Image for post

Hai Web server của mình đã chạy, để tiến hành kiểm tra mình gửi 2 get request tới 2 server và thực sự chúng đã chạy và share chung forder “/usr/share/html”.

Image for post

curl localhost:2222

Và giờ mình sẽ chui vào docker VM để xem các volume của chúng ta có gì. Để login vào docker VM mình dùng lệnh.

screen $HOME/Library/Containers/com.docker.docker/Data/vms/0/tty

Nói sơ qua một chút về screen, screen cũng tương tự như việc bạn ssh đến một server, nhưng điểm khác với ssh là ví dụ như vì một lí do nào đó mà bị mất kết nối ( ví dụ mạng mất ) thì phiên làm việc (session) của ssh đó sẽ mất, nhưng với screen thì chúng ta có thể kiểm tra các session và resume lại các session đó để làm việc tiếp.

Sau Khi dùng lệnh trên thì mình đã ở trong docker VM, mình sẽ chui vào “/var/lib/docker/volumes/nginx-static-html-share-volume/_data”

để xem có gì không.

Image for post
Image for post

docker vm

Đây rồi, thư mục /usr/share/nginx/html

đã được share chung giữa 2 nginx container. Có hai file index.html, 50x.html, mình sẽ tiến hành edit index.html xem nó có tác động gì đến hai nginx server không.

echo "Nginx web Server" > index.html
Image for post

Nổi dung file đã thay đổi mình sẽ tiến hành gửi hai get request tới 2 server và kì vọng nội dung trả về của hai server trả về sẽ giống nhau.

curl localhost:2222
curl localhost:2223

Và đúng như kì vọng, 2 Docker container đã share chung được data bằng cách mount volume “nginx-static-html-share-volume” vào “usr/share/nginx/html” của 2 container.

Image for post

Và nếu sau này bạn không có nhu cầu sử dụng volume nữa thì hay remove

nó nhưng trước khi remove nó bạn phải stop và remove docker container.

Để stop và remove container dùng lệnh

docker stop <tên container>
docker rm <tên container>

Để remove volume dùng lệnh

docker volume remove <tên volume>
Image for post

Và sau khi remove mình lại chui vào docker VM để coi nó đã xoá hay chưa. Lúc nãy mình có tắt ngang “screen” và để coi còn nhưng screen session nào và để resume lại vào session đó mình dùng các lệnh sau.

screen -ls      // lệnh này sẽ list ra những session đang tồn tại
screen -r <screen-session-id>       // resume một session.
Image for post
Image for post

Vậy là volume của mình đã bị xoá.

Tổng kết : Ở bài viết trên mình giới thiêụ với các bạn một số điều cơ bản về docker volume và share data giữa các container bằng docker volume. Mình sẽ tìm hiểu thêm và sẽ chia sẻ với các bạn trong những bài viết sau. Cảm ơn các bạn đã đọc bài viết. Bye bye các bạn. ^_^

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

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

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

Endpoint là gì? Lợi ích trong việc phát triển APIs

Endpoint là gì? Lợi ích trong việc phát triển APIs

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Endpoint là gì?

Để dễ hiểu mình sẽ làm ví dụ về Endpoint.

Khi App gọi đến API URL: https://abc.com/foo/bar và lúc này ta gọi /foo/bar là Endpoint.

Endpoint là một phần quan trọng trong quá trình phát triển API

Định nghĩa Hàm (Tạo Action Plan)

Công việc đầu tiên của bạn là nghĩ về những thứ mà API của bạn sẽ cung cấp. Đó có thể là 1 danh sách các hàm CRUD (Create, Read, Update, Delete) thao tác với resourece của bạn. Để giải thích rõ hơn thì đây chính là 1 danh sách các “Action” cần phải làm với mỗi resource:
Ví dụ:

Bạn có một Resouce là Người dùng và bạn cần 1 danh sách hàm như sau:
Users:

  • Create
  • Read
  • Update
  • Delete
  • List

Công việc này gần giống với TDD tức là bạn hình dung ra các hàm cần viết và viết các đoạn mã giả giả sử rằng hàm này và class này đã tồn tại rồi đó, sau đó bạn mới định nghĩa chúng.

Nếu API của bạn có chức năng tìm kiếm theo tên hay mã số người dùng thì công việc đó ta liệt vào List nhé:
Users:

  • Create
  • Read
  • Update
  • Delete
  • List(Name,ID)

Thêm các Params vào có thể tốt và dễ hình dung tuy nhiên không nên thêm quá nhiều và dư như thêm tất cả các thuộc tính vào Create(name,id,age,…) là không nên.

Lý thuyết Restful

Chuyển một Action Plan thành một Danh sách Endpoint thì cần những hiểu biết căn bản về RestFul API và các “Best Practice” trong việc đặt tên. Tất nhiên thì mỗi công ty, mỗi nhóm có chuẩn đặt tên khác nhau và cũng chả thể so sánh được cái nào là tốt nhất. Tuy nhiên mình sẽ nói về cái phổ biến mà mình nghĩ là OKie nhất cho các bạn.
RestFul thì gồm nhiều tuy nhiên có 4 cái căn bản sau:
GET – POST- PUT -DELETE

1. GET

  • GET /resources – Tìm một danh sách records từ resource có thể có phân trang thì tốt nhất hoặc lấy toàn bộ records
  • GET /resources/X – Chỉ cần lấy Record X, ví dụ /users/thanhtriphap -> Lấy Info mình ra nè
  • GET /resources/X,Y,Z – Người dùng muốn tìm kiếm trên nhiều điều kiện hay 1 điều kiện mà nhiều giá trị
  • GET /places/X/users – Lấy tất cả người dùng đang sinh sống trong vùng X
  • GET /users/X/places – Lấy tất cả các nơi mà người dùng này đang hay đã ở
  • GET /users/X/places/Y – Tìm kiếm user theo điều kiện X và Places theo điều kiện Y

[Danger Zone] Auto Increment

Trong quá trình học trong trường các bạn thường xài ID dạng Auto-Increment. Tuy nhiên trong thực tế nếu API của ta để như vậy thì người ta có thể biết được số lượng Resource mà ta đang có điều này rất có ích với đối thủ đó chứ.
Biện pháp là ta sử dụng UUID – Các bạn có thể tìm UUID cho PHP, Ruby hay Python và các Package hỗ trợ Gen UUID trên GOOGLE.

2. DELETE

  • DELETE /users/X – Xóa một người dùng
  • DELETE /users/X,Y,Z – Xóa một vài dòng dữ liệu
  • DELETE /users – Xóa tất cả các dòng dữ liệu (Không nên)
  • DELETE /users/X/image – Xóa image của người dùng X
  • DELETE /users/X/images – Xóa một loạt các hình ảnh của người dùng X
  10 Kỹ năng quan trọng cần có của Front-end để tìm công việc dễ dàng hơn
  3 công cụ ngon bổ rẻ cho Front-End developer

3. POST và PUT

Về mặt lý thuyết POST dùng tạo 1 dòng dữ liệu mới còn PUT thì dùng cập nhật một dòng dữ liệu đã có. Khác nhau là vậy tuy nhiên trên nguyên tắc thiết kế thì 2 hành động này như nhau mà thôi có nghĩa là những gì POST làm được thì PUT làm được và ngược lại.
Tuy nhiên, tất nhiên phải có sự khác nhau căn bản để dùng chứ. Chúng ta xem khái niệm về
idempotent : Có nghĩa là khi mình gọi đến resource dùng PUT n lần thì behavior vẫn là như nhau, dữ liệu thay đổi của lần thứ n vẫn giống như lần gọi đầu tiên

Nghe có vẻ hơi khó hiểu đúng không, thôi ví dụ cho dễ nhé:

  • Giả sử mỗi sản phẩm chúng ta có 1 hình ảnh đại diện thôi (Chỉ 1 thôi nhé) và mỗi lần ta thay đổi nó tức là thay hình đại diện cho sản phẩm thì dữ liệu vẫn như cũ (Như cũ ở đây có nghĩa là không làm phát sinh thêm dòng nào mới nhé): PUT /products/ao-so-mi-tay-dai-MB2331/image
  • Cũng ví dụ trên tuy nhiên sản phẩm lại có nhiều hình ảnh thì mỗi lần ta thêm thì có 1 dòng dữ liệu mới nên ta xài POST vì dữ liệu thay đỗi mà: POST /products/quan-tay/images

4. Danh từ số nhiều, số ít hay Cả hai

Một vài Developer thì dùng danh từ số ít một số lại xài số nhiều.
Ví dụ:

  • GET /user/1 – Trả về user có ID là 1
  • GET /user – Thắc mắc user nào sẽ được trả về hay về hết

Do đó mình thường xài số nhiều cho các Endpoints:

  • GET /users/1 – Trả về user có ID là 1
  • GET /users?limit=5 – Trả về 5 user cho một lượt

5. Danh từ hay động từ

Trước đây khi POST cái gì đó một vài Dev thường dùng động từ:

  • POST /SendMeAMessage
  • POST /users/5/send-message

Tuy nhiên hình như hơi có vấn đế, chúng ta chỉ cần 1 động từ duy nhất trong đây là POST PUT hay GET … và URL là danh từ chứ không phải động từ. Một vài ví dụ sau:

  • POST /users/5/message – Gửi một Message tới User 5

Một cách tuyệt vời hơn chúng ta có thể:

  • POST /users/thanhtriphap/message
  • PUT /users/thanhtriphap/message/wsis0n

Xây dựng EndPoints

Sau khi hoàn thành công việc định hình GET, PUT, POST … cho mỗi Action trong Action Plan việc tiếp theo chính là Đặt mỗi Resource trong 1 controller trong đó có các hàm trong Action Plan:

  • UsersController
  • CategoriesController
  • PlacesController

Và hoàn thành việc định tuyến Routing.
Ví dụ trên Laravel Framewok

alt text

Kết luận

Làm bất cứ điều gì nếu chúng ta định hình rõ những công việc sẽ phải làm giúp chúng ta dễ dàng hơn rất nhiều trong công việc sau này. Việc tạo ra các Endpoints là cách để Back End và Develper Mobile hay Front End làm việc với nhau và nâng cao hiệu quả công việc.

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

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

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

Chạy Postgresql trong Docker container

Chạy Postgresql trong Docker container

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

Hi các bạn, sau một tuần không chạm vào laptop thì hôm nay mình quay lại và gửi đến các bạn bài hướng dẫn cài Postgres trên Docker. Trong khi viết những dòng chữ này thì mình đã không còn là developer nữa rồi, nhưng niềm đam mê và sở thích thì vẫn còn đó, và biết đâu sau này mình lại có cơ hội quay trở lại với nghề.

Trước tiên, lý do mà mình cài Postgres trên Docker là vì nó khá đơn giản, dễ cài dễ dùng, muốn xóa đi thì cx dễ remove cái container đi là xong.

Để chạy được postgres thì bạn phải pull image của Postpres về và sử run một container trên image đó.

Để pull dùng lệnh

Image for post

  20 trường hợp sử dụng lệnh Docker cho developer

  Docker là gì? Kiến thức cơ bản về Docker

Để run một container mình dùng lệnh dưới

Lệnh trên có nghĩa là

-e POSTGRES_PASSWORD=ai_khoc_noi_dau_nay   
       : lệnh này set biết môi trường để postgres set password cho tài khoản postgres, nếu không set thì mặc định sẽ là không có.postgres: cái này là tên image.
Image for post

Ok, giờ mình sẽ chui vào cái container để tạo database cũng như tạo user cho nó, các bạn có thể làm ngoài docker container nhưng nó sẽ yêu cầu bạn nhập pass khi đăng nhập, còn nếu chạy vào docker container luôn thì họ sẽ không yêu cầu nhập pass, điêu này nói rõ ở trong docs nằm ở đây.

Để chui vô bash của container mình dùng lệnh

Image for post

Sau đó dùng psql để kết nối với psql user là postgres, và ko cần nhập mật khẩu vì container cho phép điều đó. Tiếp theo tạo database “gaugau”, rồi user có username là “cay_to” và password là “thit cho xao lan” rồi gán tất cả quyền trên database cho user.

Image for post

Mình dùng lệnh “\l” để list ra tất cả database hiện tại, xem hình thì thấy okie rồi.

Sau đó mình out ra container và dùng psql của máy mình xem có kết nối được không.

Image for post

Vì mình thao tác ngoài container nên nó yêu cầu nhập pass, nhập “thit_cho_xao_lan” thì mình đã connect thành công.

Image for post

Mình xin được phép dừng bài viết tại đây, trở lại với vai trò “ chạy chợ “ là dân chợ búa nhưng mình sẽ vẫn tiếp tục hỏi hỏi và hi vọng được chia sẻ nhiều kiến thức hơn với các bạn trong tương lai, bye bye các bạn mình đi dọn hàng tiếp đây, mẹ chửi quá trời. Hihi

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

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

Xem thêm Việc làm it tại TPHCM hấp dẫn trên TopDev

Hướng dẫn cài đặt và cấu hình để dùng nhiều version PHP (Multiple versions PHP)

Hướng dẫn cài đặt và cấu hình để dùng nhiều version PHP

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Để cài đặt nhiều version php cho nhiều project website, dùng yum-config-manager để cài đặt multiple versions of PHP. Và lưu ý bài viết này dành cho những người có kiến thức cơ bản về Nginx và PHP.

1. Cài đặt và cấu hình các version PHP

1.1 Cài đặt PHP 7.1 Version

# yum-config-manager --enable remi-php71 [Default]
# yum install php php-common php-fpm
# yum install php-mysql php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml php-pecl-apc php-cli php-pear php-pdo

1.2 Cài đặt PHP 5.6 Version

# yum install php56 php56-php-common php56-php-fpm
# yum install php56-php-mysql php56-php-pecl-memcache php56-php-pecl-memcached php56-php-gd php56-php-mbstring php56-php-mcrypt php56-php-xml php56-php-pecl-apc php56-php-cli php56-php-pear php56-php-pdo

Kiểm tra version PHP mặc định.

# php -v

1.3 Cấu hình PHP-FPM và PHP56-PHP-FPM

Đây là phần cấu hình php-fpm sẽ hoạt động tương thích với Nginx. Cần thiết lập user/group của FastCGI khi hoạt động trên Nginx sẽ listen đúng port.

php-fpm (default 7.1): /etc/php-fpm.d/www.conf

php56-php-fpm: /opt/remi/php56/root/etc/php-fpm.d/www.conf

Mở file config đề thiết lập user/group của FastCGI.

# vi /etc/php-fpm.d/www.conf [PHP 7.1]
# vi /opt/remi/php56/root/etc/php-fpm.d/www.conf [PHP 5.6]

Cập nhật thông tin user/group

user = nginx
group = nginx

Kế tiếp, cập nhật thiết lập address:port cho FastCGI listen các request sẽ nhận.

listen = 127.0.0.1:9000 [php-fpm]
listen = 127.0.0.1:9001 [php56-php-fpm]
Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev

2. Thiết lập Nginx dùng PHP-FPM tương ứng

2.1 Khởi chạy services

----------------  NGINX  ---------------- 
# systemctl enable nginx 
# systemctl start nginx 
---------------- PHP 7.1 ---------------- 
# systemctl enable php-fpm 
# systemctl start php-fpm 
---------------- PHP 5.6 ----------------
# systemctl enable php56-fpm 
# systemctl start php56-php-fpm 

Nếu trường hợp bị lỗi xãy ra thì gõ lệnh sau:

# getenforce
# setenforce 0 

2.2 Thiết lập đường dẫn cho website

Tạo các folder web để chạy các version PHP khác nhau trong /var/www/html/.

---------------- Website 1 ----------------
# mkdir -p /var/www/html/example1.com/
# mkdir -p /var/www/html/example2.com/
---------------- Website 2 ----------------
# mkdir -p /var/log/nginx/example1.com/
# mkdir -p /var/log/nginx/example2.com/

2.3 Thiết lập permission

---------------- Website 1 ----------------
# chown -R root:nginx /var/www/html/example1.com/
# chmod -R 755 /var/www/html/example1.com/
# chown -R root:nginx /var/log/nginx/example1.com/
# chmod -R 660 /var/log/nginx/example1.com/
---------------- Website 2 ----------------
# chown -R root:nginx /var/www/html/example2.com/
# chmod -R 755 /var/www/html/example2.com/
# chown -R root:nginx /var/log/nginx/example2.com/
# chmod -R 660 /var/log/nginx/example2.com/
  10 điều bạn cần biết về PHP7
  10 Frameworks tốt nhất hiện nay cho PHP

2.4 Config Nginx Server cho  các Website

Tạo các config Nginx cho các website tại /etc/nginx/conf.d/.

# vi /etc/nginx/conf.d/example1.com.conf
# vi /etc/nginx/conf.d/example2.com.conf

Website 1 cấu hình cho example1.com

server {
	listen 80;
	server_name example1.com www.example1.com;
	root   /var/www/html/example1.com/;
	index index.php index.html index.htm;
	#charset koi8-r;
	access_log /var/log/nginx/example1.com/example1_access_log;
	error_log   /var/log/nginx/example1.com/example1_error_log   error;
	
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}

	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	location ~ \.php$ {
		root    /var/www/html/example1.com/;
		fastcgi_pass   127.0.0.1:9000;	#set port for php-fpm to listen on
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include         fastcgi_params;
		include /etc/nginx/fastcgi_params;
	}
}

Website 2 cấu hình cho example2.com

server {
	listen 80;
	server_name example2.com www.example2.com;
	root /var/www/html/example2.com/;
	index index.php index.html index.htm;
	
	#charset koi8-r;
	access_log /var/log/nginx/example2.com/example2_access_log;
	error_log /var/log/nginx/example2.com/example2_error_log error;
	
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}
	
	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	location ~ \.php$ {
		root /var/www/html/example2.com/;
		fastcgi_pass 127.0.0.1:9001; #set port for php56-php-fpm to listen on
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
		include /etc/nginx/fastcgi_params;
	}
}

Kế tiếp tạo các nội dung chứa phpinfo() để xem các version PHP của các website.

# echo "" > /var/www/html/example1.com/info.php
# echo "" > /var/www/html/example2.com/info.php

Để apply các cấu hình thì phải restart lại các services.

# nginx -t
# systemctl restart nginx php-fpm php56-php-fpm
Verify Nginx Configuration
Verify Nginx Configuration

Nếu chạy dưới local thì nhớ cấu hình /etc/hosts.

Cuối cùng truy cập vào domain các trang đã setup trong config nginx để xem thành quả.

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

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

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

Đôi điều về “nghề nghiệp” trong ngành Công nghệ Thông tin

Đôi điều về

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

Ngành CNTT (IT- Informatic Technology) trong khoảng chục năm trở lại đây luôn là một trong những ngành “hot” nhất trong thị trường lao động Việt Nam và thế giới. Trong bối cảnh cuộc cách mạng công nghiệp lần thứ 4 đang bắt đầu bùng nổ, ngành IT càng trở nên nóng hơn bao giờ hết.

  10 bí kíp để startup và FinTech startup thành công đột phá
  6 giải pháp công nghệ hữu ích cho phòng nhân sự của bạn

Bài viết nhằm chia sẻ một số nhận định cá nhân về nghề nghiệp trong CNTT, cũng như dự đoán xu hướng các ngành nghề trong tương lai không xa và các kỹ năng, kiến thức cần thiết cho một vị trí tốt trong một số ngành “hot”. Nội dung bài viết chủ yếu chia sẻ nhận định chủ quan, trải nghiệm cá nhân của mình sau hơn mười năm làm trong ngành công nghệ thông tin. Trong quá trình làm việc, mình đã tham gia và làm đối tác của khá nhiều công ty lớn nhỏ trong và ngoài nước, chứng kiến nhiều sự thay đổi trong công nghệ, thị trường nhân sự, việc làm, cũng như cách thức tổ chức, vận hành, văn hoá doanh nghiệp của nhiều công ty, tổ chức trong ngành.

Điều đầu tiên cần nhấn mạnh là CNTT là một ngành rất rộng, công việc rất đa dạng và phù hợp với nhiều đối tượng khác nhau. Có những việc lặp lại, ổn định, có thể học rất nhanh và không cần đào tạo bài bản (cài đặt máy móc, sửa chữa máy tính cơ bản, lắp đặt phòng máy, mạng, tư vấn sản phẩm, hỗ trợ kỹ thuật sản phẩm, hotline chăm sóc khách hàng…), và có những công việc cần đào tạo bài bản và/hoặc dài hạn hơn, và yêu cầu nhiều chất xám hơn nhiều hơn như lập trình viên, kiến trúc sư hệ thống, chuyên viên phân tích nghiệp vụ, kiểm thử viên, quản trị mạng, phân tích, xử lý dữ liệu… Bài viết này tập trung nói về nhóm ngành thứ hai.

Thách thức trong ngành CNTT

it challenges

Là ngành “hot” trong thị trường lao động, ngành CNTT thu hút số lượng lớn các sinh viên tham gia học, nhiều trường đại học vốn không liên quan đến IT cũng đã mở ra các khoa mới, liên quan đến IT trong lĩnh vực chuyên ngàng chính của trường, hoặc thậm chí cả các khoa chuyên biệt về CNTT vốn chưa bao giờ là thế mạnh của trường như mạng máy tính hay công nghệ phần mềm… Điều này có thể là đúng, để đáp ứng nhu cầu thị trường và đảm bảo duy trì số lượng / thu hút sinh viên. Tuy nhiên, cũng phải nói là chất lượng đầu ra sinh viên CNTT trong nước nhìn chung đang ở mức độ dưới trung bình, phần đông là chưa đáp ứng được nhu cầu công công việc. Sinh viên ra trường rất đông, không tìm được việc làm hoặc làm trái ngành rất nhiều, nhưng các công ty CNTT đều luôn thiếu nhân sự. Cá nhân mình đã từng phỏng vấn đầu vào không dưới 200 bạn sinh viên ra trường và những người đã đi làm (sau khi đã lọc kỹ hồ sơ), thì tỷ lệ trúng tuyển là tương đối thấp. Và trong số trúng tuyển thì phần đông vẫn là từ các trường Bách Khoa, Công Nghệ, Bưu Chính Viễn Thông, FPT và các trường nước ngoài. Rất nhiều bạn trong số đó đã có thành tích học tập các cấp rất tốt, học chuyên ban từ phổ thông, hay là top ở các trường phổ thông, đại học, rất nhiều bạn đạt giải cao trong các kỳ thi học sinh, sinh viên giỏi và nghiên cứu khoa học các cấp.

Có thể thấy ngành CNTT là ngành có yêu cầu khá cao về cả thái độ, kiến thức, kỹ năng. Điều này bởi nhiều lý do:

  • Bản thân ngành CNTT là mới (so với rất nhiều ngành khác), lại rất rộng, yêu cầu nhiều kiến thức nền tảng nhưng lại được trang bị khá muộn trong các trường phổ thông.
  • Công nghệ phát triển chóng mặt, thay đổi liên tục, khiến người làm CNTT nếu không liên tục nghiên cứu, học hỏi, thích ứng thay đổi thì sẽ sớm bị đào thải nhanh chóng.
  • Mức độ cạnh tranh cao và không phân biệt tuổi tác. Do sự thay đổi hàng ngày của công nghệ, yếu tố kinh nghiệm trong CNTT thường mờ nhạt hơn rất nhiều so với các ngành khác. Một sinh viên giỏi mới ra trường làm 1–2 năm với công nghệ hiện đại có thể dễ dàng vượt qua cả về năng suất lẫn chất lượng công việc so với một người với hàng chục năm kinh nghiệm nếu không chịu cập nhật công nghệ thường xuyên. Phải nói thêm, việc “cập nhật công nghệ” ở đây là để làm việc, tức là học nghề để áp dụng vào công việc, chứ không phải đơn thuần là cập nhật tin tức về công nghệ qua báo chí, truyền hình một cách giải trí.

Nghề nào phù hợp?

Do tính cạnh tranh cao và không phân biệt tuổi tác như đề cập phía trên, ở Việt Nam, mình thường thấy hầu hết mọi người làm “kỹ thuật” trong ngàng CNTT thông thường chỉ làm khoảng chục năm hoặc ít hơn, sau đó chuyển hướng qua “quản lý” hay “kinh doanh“, một là vì không theo kịp thế hệ trẻ đi sau, cảm thấy mệt mỏi, hao mòn, hai là nếu không “thăng chức” sẽ bị coi là kém cỏi vì mãi chỉ làm kỹ thuật. Nhưng theo mình, dù làm kỹ thuật, quản lý, kinh doanh… đều là các “nghề” khác nhau, yêu cầu các kỹ năng khác nhau và phù hợp với từng cá nhân khác nhau. Tiếp xúc với các công ty nước ngoài sẽ thấy điều này rất rõ, làm lập trình viên, hay làm quản lý dự án đều là các nghề, và người ta sẽ làm mãi nghề đó nếu thấy còn phù hợp với bản thân, cả về sở thích, năng lực lẫn thu nhập. Làm quản lý không có nghĩa là thu nhập tốt hơn, hay có địa vị cao hơn, nó chỉ là công việc với tính chất khác. Đồng nghiệp và là quản lý trực tiếp làm việc hàng ngày với mình là một anh người Ý, nhiều năm làm việc ở khắp các nước trên thế giới: Hà Lan, Mỹ, Canada, Singapore, gần 50 tuổi, và vẫn đang làm kỹ thuật thuần tuý. Mình cũng có hỏi về vấn đề này, anh ý trả lời: “Anh không giỏi làm quản lý, giám sát các thành viên trong nhóm, anh chỉ thích nghiên cứu và làm kỹ thuật, được cập nhật công nghệ hàng ngày. Và trí nhớ và suy nghĩ của tôi vẫn hoạt động tốt, chừng nào vẫn còn nhớ tốt thì vẫn sẽ làm kỹ thuật”, và anh này là một đội trưởng kỹ thuật rất tốt, đạo tạo, huấn luyện và truyển cảm hứng học hỏi cho đội. Hay hồi qua Mỹ công tác nửa năm, mình có làm việc cùng những đồng nghiệp hơn 60 tuổi, vẫn hàng ngày thiết kế mạch, lập trình vi điều khiển, và rất uyên bác về mọi công nghệ, xu hướng hiện đại.

Mình muốn nhấn mạnh ở đây là chọn nghề không nên quá theo đuổi xu hướng, mà quan trọng hơn là: trong những xu hướng đó, lựa chọn công việc phù hợp với mình. Vậy những ai phù hợp với CNTT? Theo mình, những người phù hợp với CNTT là những người:

  • Thích công nghệ. Dấu hiệu: thích đồ mua, đọc đánh giá, ngắm nghía các đồ công nghệ, thích chơi game, hay tìm tòi, thử nghiệm các tính năng phần mềm, trang web…
  • Tư duy logic tốt và thích logic chặt chẽ. Dấu hiệu: thích học toán, thích lập trình (thích hơn học toán), thích các trò chơi logic, các bài test IQ…
  • Thích thử thách. Dấu hiệu: tự vào các trang mạng giải toán, giải bài các bài lập trình, thích chế độ thi đấu trực tuyến, chơi các trò chơi trí tuệ….
  • Cầu toàn. Dấu hiệu: Luôn không ưng ý với những gì đang có, luôn muốn nâng cấp, sửa đổi từ những thứ nhỏ nhất.

Một số việc làm có nhu cầu cao trong ngành công nghệ

Công việc cụ thể của các vị trí này nằm ngoài phạm vi của bài viết này, mình sẽ viết cụ thể hơn ở một bài khác, mọi người có thể tham khảo link cuối bài để biết thêm thông tin.

Trong số đó một số nghề mới trở nên phổ biến gần đây, cùng với sự bùng nổ của cuộc cách mạng công nghiệp lần thứ 4, và chắc chắn sẽ vẫn là các nghề hot trong một thời gian tới như Data Scientist, AI/ML Engineer, Business Intelligence Analyst…

Một số việc khác có thể sẽ thành “hot trend” trong tương lại không xa có thể kể đến như: kỹ sư vạn vật kết nối (IoT Engineer); kỹ sư nhà thông minh (Smart Home Engineer); kỹ sư xe tự lái, xe bay, robot; kỹ sư công nghệ xử lý rác thải, nước thải; kỹ sư thực tế ảo…

Thế hệ trẻ cần chuẩn bị gì để bước vào ngành CNTT trong tương lai

  • Làm quen, sử dụng các phần mềm máy tính (không phải game) càng nhiều càng tốt: Paint, Word, Powerpoint, Excel, Windows, Photoshop, Illustrator, Algodoo… (từ Tiểu học)
  • Tiếp xúc, học càng nhiều càng tốt các khoá học STEM (online hoặc offline): lập trình, thuật toán robotics, sáng tạo công nghệ… (từ Tiểu học)
  • Học chắc chắn các môn toán, và tiếp xúc, học nhiều về các môn toán đặc biệt cần thiết cho ngành khoa học máy tính. Ở Tiểu học và THCS: các môn toán trong trường phổ thông, logic, đồ thị (graph), tập hợp, toán tổ hợp, xác suất… Ở các cấp cao hơn: toán rời rạc, xác suất, thống kê, đại số tuyến tính, giải thích hàm nhiều biến…
  • Tiếp xúc với lập trình thuật toánlập trình ứng dụng càng nhiều càng tốt.
  • Tham gia làm sản phẩm công nghệ thông tin (phần mềm, website, sản phẩm công nghệ…) trong các cuộc thi sáng tạo, tin học trẻ…, và tự làm các sản phẩm công nghệ, phần mềm phục vụ chính nhu cầu của mình và những người xung quanh.
  • Tham gia, tương tác trên các cộng đồng công nghệ, lập trình trực tuyến

Nội dung, lộ trình, tài liệu học lập trình cụ thể cho các bạn nhỏ từ cấp 2 trở lên mình đã post trước đó. Nội dung và tài liệu cho các bạn nhỏ hơn (tiểu học, tiền tiểu học) mình sẽ chia sẻ ở một bài post khác.

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

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

Xem thêm Việc làm ngành công nghệ thông tin hấp dẫn trên TopDev

Lộ trình công việc của bạn như thế nào?

Lộ trình công việc của bạn như thế nào?

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Xác định mục tiêu công việc

Bạn phải xác định được mục tiêu công việc của bạn. Nó là mục tiêu SMART, chứ không giống như mục tiêu công việc các bạn hay đề ra trong cv: cống hiến & tìm công việc ổn định & gắn bó & thăng chức… Mấy dòng này viết vào cho vui thôi.

  Một vài “trick” khi sử dụng Xpath và CSS selector trong Selenium
  Đam mê game? Hãy đến với Gameloft Career Day – Level Up Your Career!

Lựa chọn cho khởi đầu

Có 2 con đường chủ yếu để bắt đầu:
Một là, bạn nhắm vào công ty nhỏ trước, để phát triển kỹ năng bề rộng trước, khiến bạn trở nên đazi năng. Sau đó, bạn tiến vào công ty lớn để trau dồi chuyên môn sâu hơn và tiếp cận hệ thống, quy trình bài bản, chuyên nghiệp. Lúc này, các kỹ năng “thập cẩm”, linh hoạt, nhạy bén, mà bạn tích lũy ở công ty nhỏ, nơi bạn thường phải ôm đồm, kiêm nhiệm nhiều việc sẽ giúp đỡ bạn rất nhiều ở công việc mới.

  • Có thể việc trúng tuyển vào công ty nhỏ sẽ dễ hơn công ty lớn, vì:
  • Công ty nhỏ không quá nổi tiếng, không phải ai cũng có thể tiếp cận thông tin tuyển dụng, việc cạnh tranh không quá gay gắt.
  • Quy trình tuyển chọn đơn giản, trực quan hơn.
  • Bạn dễ tương tác với sếp hơn.
  • Yêu cầu với ứng viên không quá cao siêu…

Hai là, bạn tiếp cận các công ty lớn, tập đoàn trước. Việc có thể trúng tuyển hoặc vào các vòng phỏng vấn sau trong quy trình phỏng vấn cũng là một thành công đối với bạn. Bạn sẽ được tiếp cận với quy trình tuyển chọn bài bản, bạn sẽ phải cạnh tranh với nhiều người, trong quá trình phỏng vấn bạn cũng đã tích lũy thêm nhiều kiến thức, kỹ năng rồi, đó là một ưu điểm để bạn nên apply job tới cùng (Vd: Management Trainee).

Lộ trình nghề nghiệp cần lựa chọn thật tỉnh táo

Đánh giá

Ở các công ty lớn, bạn sẽ được đào tạo bài bản hơn, công việc sẽ chuyên biệt hơn, mang lại cho bạn sự chuyên nghiệp, năng lực được đào sâu, tập trung vào một mảng.Nếu có thể thăng tiến lên cấp quản lý ở đây luôn thì rất tốt. Nhưng có lẽ cơ hội không đủ nhiều cho tất cả.
Do đó, bạn có thể cân nhắc tình huống nhảy sang công ty nhỏ làm quản lý. Dựa vào năng lực chuyên môn của bạn, dựa vào brand name của công ty… đó sẽ là điểm cộng cho bạn ở các vị trí trong công ty nhỏ.
Sau khi trải nghiệm cả hai môi trường công ty lớn và nhỏ, thì bạn cũng sẽ có kha khá tích lũy rồi, lúc ấy, bạn hoàn toàn có thể xác định cho mình con đường hoặc đích đến tiếp theo.

Bonus: Mức lương khởi điểm ở công ty lớn thường sẽ cao hơn, chức vụ ở công ty nhỏ thì lại cao hơn.

Vân D.

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

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

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

Mail xin nghỉ việc? Tips viết mail xin nghỉ việc chuyên nghiệp 

mail xin nghỉ việc
mail xin nghỉ việc

Nhu cầu xin nghỉ việc là nhu cầu tất yếu phải xảy ra khi một cá nhân cảm thấy không còn điểm chung đối với doanh nghiệp. Đây là lúc bạn cần quan tâm đến việc làm thế nào để có một lá đơn xin nghỉ việc phù hợp. Đồng thời, có rất nhiều hình thức xin nghỉ việc. Viết mail xin nghỉ việc là một trong số đó. Cùng đọc bài viết sau đây để nắm bắt những thông tin bổ ích về vấn đề này nhé.

Thế nào là viết mail xin nghỉ việc?

Đơn giản, mail xin nghỉ việc nó cũng giống như một lá đơn xin nghỉ việc thông thường. Nó có hiệu lực trong một khoảng thời gian nhất định; có ý nghĩa thông báo cho tổ chức/doanh nghiệp về việc dừng hoạt động công tác của một cá nhân nào đó.

mail xin nghỉ việc
mail xin nghỉ việc

Đây được xem là một hình thức viết đơn xin nghỉ việc gián tiếp. Dù nói như vậy, nhưng bạn vẫn phải trực tiếp đến tổ chức để hoàn tất các giấy tờ nếu có các phát sinh về pháp lý. Thực tế, viết mail xin nghỉ việc hoàn toàn giống với cách tổ chức viết đơn xin nghỉ việc bình thường. Điểm khác duy nhất chính là cách thức viết được truyền tải trên một phương tiện chuyển giao gián tiếp qua hòm thư mail; thay vì văn bản giấy như hình thức thông thường.

  Bí quyết phát triển hoạt động nhân sự qua email (Email Marketing) hiệu quả - Bạn đã biết?

Khi đưa ra một quyết định nghỉ việc thường sẽ không dễ dàng. Nó đòi hỏi sự cân nhắc kỹ lưỡng đến từ nhiều phía. Và khi đã thật sự có quyết định, bạn nên có một mail xin nghỉ việc hợp lý, đúng chuẩn.

Điều này sẽ giúp bạn để lại ấn tượng đẹp trong lòng các đồng nghiệp; doanh nghiệp của mình. Đồng thời cũng thể hiện mình là người có ý thức làm việc. Dưới đây sẽ là những tips giúp bạn viết mail xin nghỉ việc sao cho thật hiệu quả.

1. Đảm bảo một lý do xin nghỉ việc thật thuyết phục

Lý do xin nghỉ việc thật sự rất quan trọng không chỉ với đơn xin nghỉ việc thông thường; mà còn đối với mail xin nghỉ việc. Mail xin nghỉ việc của bạn có được chấp thuận hay không; tất cả đều phụ thuộc lớn vào lý do xin nghỉ việc. Hãy thật tỉnh táo để cho đưa ra các lý do hợp tình nhất; tránh những lý do bất khả thi. Điều này sẽ tạo sự thuận lợi giúp mail xin nghỉ việc của bạn dễ được phê duyệt hơn.

Tìm ra một lý do xin nghỉ việc không khó khi bạn thật sự rời đi với các mong muốn chính đáng. Nếu thiếu chuyên nghiệp trong cách làm việc thì có lẽ, bạn đã bị loại khỏi cuộc chơi nghề nghiệp từ lâu rồi.

Một lý do xin nghỉ việc thuyết phục còn giúp bạn nhận được sự đồng cảm từ cấp trên; công ty và các cộng sự. Từ đó, bạn cũng cảm thấy thật thoải mái khi rời đi; chuyển sang một môi trường khác phù hợp hơn.

2. Lưu ý về việc chi tiết thời gian nghỉ việc

Bạn cần phải rõ ràng trong từng nội dung được đề cập trong mail xin nghỉ việc. Cụ thể, đó chính là thời gian nghỉ việc. Việc chia sẻ cụ thể thời gian nghỉ việc giúp nhà quản lý nắm bắt chính xác được quãng thời gian bạn nghỉ. Đồng thời, họ cũng có những cơ sở về thời gian để tìm kiếm; chọn lọc các nhân sự mới cho vị trí mà bạn rời đi.  

  Cách tạo hồ sơ xin việc online qua email ấn tượng
  Văn hóa giao tiếp qua Email - Thế nào là chuyên nghiệp?
mail xin nghỉ việc
mail xin nghỉ việc

Theo quy định của Bộ luật Lao động năm 2019, từ năm 2021, người lao động nghỉ việc phải báo trước ít nhất 45 ngày với hợp đồng không xác định thời hạn.

Nếu còn thời hạn hợp đồng từ 12 – 36 tháng phải báo trước ít nhất 30 ngày; hợp đồng dưới 12 tháng chỉ cần báo trước ít nhất 03 ngày; trừ một số trường hợp được đơn phương chấm dứt hợp không cần báo trước. 

Trong trường hợp, bạn là người chịu trách nhiệm quản lý các đầu công việc chính, là Team Lead,.. thì bạn cần nhiều thời gian hơn để bàn giao công việc. Bên cạnh đó, nếu công việc của bạn tương đối phức tạp cần nhiều thời gian để bàn giao công việc. Thậm chí, bạn có thể cân nhắc kỹ hơn về việc kéo dài thêm thời gian làm việc ra đôi chút để bàn giao; làm việc với nhân sự mới để họ có cái nhìn đủ tốt với vị trí họ sắp đảm nhận.

3. Tận tình chia sẻ về những thứ còn đang thực hiện

Nếu là một nhân viên có tâm và có tầm, bạn hoàn toàn có thể chia sẻ về những dự án còn dang dở về tiến độ thực hiện trong mail xin nghỉ việc của mình.

Cụ thể, khi đã trình bày lý do xin nghỉ việc, hãy khéo léo nhắc đến chúng. Nói chi tiết về những vấn đề đang còn tồn đọng; tính hiệu quả và gợi ý về những cách thức  – giải pháp tiếp theo nào có tính khả thi để thực hiện. Dù là những thông tin phân tích từ một người sắp trở thành cựu nhân viên, nhưng những gì bạn truyền tải qua mail xin nghỉ việc chắc chắn sẽ để lại ấn tượng đẹp trong lòng những bạn bè, đồng nghiệp,…

Việc chia sẻ này cho thấy bạn là người có trách nhiệm với công việc cao; luôn quan tâm đến sự phát triển chung của tổ chức dù không còn hoạt động nữa. Một thái độ chuyên nghiệp qua cách viết mail xin nghỉ việc cũng là điều quan trọng bạn nên lưu tâm, thực hiện.

4. Một điều cực quan trọng – Hãy nói lời cảm ơn

Thời gian gắn bó với tổ chức của bạn dù ngắn hay dài thì khi ra đi, bạn cũng nên nói lời cảm ơn. Chí ít bạn đã có sự trưởng thành hơn nhờ những cọ xát thực tế; có cho mình những trải nghiệm mới. Lời cảm ơn thể hiện bạn là người biết lý lẽ; chuyên nghiệp trong cách hành xử, cách sống và là một nhân viên có phẩm chất tốt.

mail xin nghỉ việc
mail xin nghỉ việc

Đứng bao giờ quên nói lời cảm ơn hoặc quên thể hiện thái độ trân trọng, biết ơn đối với doanh nghiệp của mình.

5. Không bao giờ đưa ra những lời phê phán

Đây được xem là điều tối kỵ bạn không nên thể hiện trong mail xin nghỉ việc.

Đặc biệt, trong phần lý do xin nghỉ việc, đừng bao giờ chia sẻ rằng công ty có môi trường không tốt, có đãi ngộ không phù hợp,…

Dù bạn biết thực tế là vậy, nhưng nếu là người chuyên nghiệp không ai lại quá thẳng thắn như thế. Hãy bình tĩnh để đưa ra một lý do xin nghỉ việc qua mail phù hợp nhất. Hãy thể hiện tính chuyên nghiệp, sự hòa đồng thân thiện. Vì đó là những dấu ấn về thái độ cuối cùng đối với tổ chức, doanh nghiệp của bạn. 

Cấu trúc viết một mail xin nghỉ việc cực chuẩn

Hãy đảm bảo rằng mail xin nghỉ việc của bạn phải có những phần nội dung sau:

1. Phần thông tin mở đầu

Đây là phần thông tin quan trọng bao gồm tên người nhận hoặc nơi nhận đơn xin nghỉ việc của bạn. Như phân tích trước đó, bạn nên ghi rõ về thời gian sẽ rời khỏi công ty. Lưu ý là viết mail xin nghỉ việc cần đúng trọng tâm, không lan man, mơ hồ.

Ví dụ:

Kính gửi [Tên chức danh cấp trên/tổ chức],

Tôi/Em là…., tôi/em viết mail xin thống báo chính thức về việc tôi/em sẽ nghỉ việc tại công ty với vị trí [chức danh hiện tại]. Ngày làm việc cuối cùng của tôi/em là [ngày chính thức bạn rời công ty].

2. Phần lời chia sẻ cảm ơn

Đơn giản, không hoa mỹ – cầu kỳ. Bạn chỉ cần có những chia sẻ chân thành nhất đối với công ty. Thể hiện sự tri ân là điều bạn nên làm. Hãy biết ơn vì các cơ hội học tập, làm việc và truyền tải thông điệp đó thông qua mail xin nghỉ việc của bạn. 

Ví dụ:

Em xin cảm ơn quý công ty vì đã cho em cơ hội làm việc trong khoảng thời gian dài qua. Tại đây, em làm việc rất vui và học được nhiều thứ từ các anh chị dày dặn kinh nghiệm.  [Kể tên một trải nghiệm công việc thú vị mà bạn đã thử sức]. Em cảm ơn vì sự tín nhiệm của công ty đã dành cho em thông qua các dự án dài hạn. Thật sự em rất trân trọng vì cơ hội này. 

Tạo mẫu CV IT đẹp

3. Nội dung về sự bàn giao nhiệm vụ

Đây là phần khá trọng tâm. Vi thông qua phần này, nó sẽ phản ánh tính trách nhiệm của bạn đối với công việc của tổ chức. Hãy chủ động thống kê; và tập hợp các nguồn dự liệu để bàn giao công việc cho nhân sự mới một cách tốt nhất.

Đồng thời, thể hiện sự sẵn lòng giúp đỡ nhân sự mới khi họ cần thông tin về các nhiệm vụ trước đây. Tất nhiên là chỉ duy trì trong một giới hạn thời gian cho phép.

Ví dụ: 

Trong thời gian…. tới, tôi/em sẽ sớm sắp xếp lại các nhiệm vụ, hoàn thành tốt các công việc còn dàng dở cũng như bàn giao cho nhân sự mới. Tôi/em mong quý công ty sẽ thông tin đến tôi/em biết nếu tôi/em có thể giúp gì được cho công ty vào khoảng thời gian còn lại này.\

Gửi lời chúc tốt đẹp nhất đến với công ty, tôi/em xin cảm ơn. 

Trân trọng,

[Ký tên ghi tên của bạn]

Mẫu đơn xin nghỉ việc qua email dành cho bạn

Tiêu đề mail: THƯ XIN NGHỈ VIỆC_[TÊN CỦA BẠN]_ [VỊ TRÍ/CHỨC DANH]

Kính gửi:  Anh/chị [tên người nhận]

Em xin gửi email này để thông báo chính thức về vấn đề thôi việc/dừng công việc tại công ty với vị trí [tên vị trí/chức danh][lý do nghỉ việc]. Ngày làm việc cuối cùng của em sẽ là [ngày chính thức nghỉ]. Em rất lấy làm làm tiếc vì sẽ không còn làm việc tại [tên công ty] trong thời gian sắp tới.

Thực sự đây là quyết định rất khó khăn đối với em. Hiện tại sau khoảng thời gian dài làm việc, em nhận thấy mình đã có được những trải nghiệm thú vị, các kỹ năng chuyên sâu hơn từ công việc và môi trường nơi đây.  [Liệt kê một số điều mà bạn tâm đắc]. Em cảm thấy cảm thấy may mắn khi được làm việc cùng những đồng nghiệp thân thiện, đồng thời cũng rất biết ơn sự hỗ trợ và tạo điều kiện của cấp trên và đồng nghiệm để em có thể hoàn thành tốt công việc này. 

Trong thời gian tới, cụ thể là…., em sẽ cố gắng hoán tất sớm các công việc còn dang dở. Đồng thời em sẽ tập hợp các hồ sơ, phân loại để bàn giao; hướng dẫn lại cho nhân sự mới đảm nhận vị trí của mình. Ngoài ra, anh/ chị vui lòng báo cho em biết nếu em có thể giúp gì cho công ty trong thời gian chuyển giao công việc.

Em hi vọng quyết định này sẽ nhận được sự chấp thuận từ chị và cấp trên. Và một lần nữa em xin cảm ơn vì sự tín nhiệm của cấp trên và tố chức. Chúc mọi người có thật nhiều sức khỏe và công ty sẽ ngày càng phát triển.

Trân trọng,

Ký tên

[Tên của bạn]

Lời kết

Với những chia sẻ trên, TopDev hi vọng bạn sẽ có những thông tin bổ ích về cách viết mail xin nghỉ việc thế nào là hiệu quả. Chúc cho bạn sẽ có một email thật chuyên nghiệp và để lại những dấu ấn đẹp trong tổ chức của bạn.

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

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

Âm nhạc đã giúp tôi rèn luyện kỹ năng coding như thế nào?

luyện kỹ năng coding

Tác giả: Jessica Wilkins

Giới thiệu

Có thể bạn đang nghĩ, âm nhạc thì liên quan gì đến lập trình? Là một Professional Developer, tôi lại ý thức rất rõ về sự kết nối giữa việc học lập trình với âm nhạc trong việc luyện kỹ năng coding của mình. Cả hai đều đòi hỏi rất nhiều sự tập trung, kỷ luật và kiên trì để trở nên tuyệt vời hơn trong chuyên môn của mình. Dưới đây tôi sẽ chia sẻ với các bạn những đặc điểm mà âm nhạc và lập trình đều giống nhau trong quá trình luyện tập.

coding-vs-am-nhac
Coding với âm nhạc thì liên kết với nhau như thế nào?

Âm nhạc gắn kết với coding như thế nào?

Hãy cố gắng hết mình

Dù là với khi luyện tập cùng âm nhạc hay hay khi luyện kỹ năng coding, bạn đều cần phải nỗ lực hết mình nếu muốn đạt được kết quả tốt nhất. Hầu hết mọi người trong cuộc sống đều không có 24 giờ rảnh rỗi liên tục để làm bất cứ điều gì chúng ta muốn. Sẽ luôn có một cái gì đó xuất hiện và chúng ta phải giải quyết nó.

Thực tế phũ phàng là chúng ta phải giữ kỷ luật hoàn thành công việc để có thể trở thành những lập trình viên giỏi hơn. Vì vậy, khi bạn chuẩn bị kiếm cớ khác để trì hoãn, hãy nhớ hoàn thành nó bằng mọi cách!

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

Không chỉ đơn giản là luyện tập mỗi ngày

Bất cứ khi nào tôi cố gắng học một phần mới, tôi sẽ thất vọng vì nó không tốt hơn chút nào. Dù tôi có luyện bao nhiêu lần đi chăng nữa thì vẫn là một mớ hỗn độn. Nhưng tôi đã sớm nhận ra rằng chỉ xuất hiện và luyện tập là không đủ. Bạn phải thực hành thông minh.

Vì vậy, tôi đã học cách chia mọi thứ thành nhiều phần nhỏ, làm chậm máy đếm nhịp và làm việc trên đoạn văn đó cho đến khi nó đúng. Một khi tôi thay đổi thói quen luyện tập của mình, tôi bắt đầu trở thành một nhạc sĩ giỏi hơn nhiều.

  "Code dễ đọc" là như thế nào?
  10 mẹo nhỏ cho bạn để coding hiệu quả hơn!

Trong việc học coding, việc học vội vã qua một khóa học sẽ không khiến bạn trở thành một lập trình viên giỏi hơn. Trong một số trường hợp, bạn có thể hình thành một số thói quen xấu mà sau này khó bỏ. Tốt hơn là bạn nên giải quyết từng vấn đề một và giải quyết nó một cách từ từ hơn là vội vàng vượt qua tất cả chúng. Nếu bạn thực hành một cách thông minh, thì các khái niệm sẽ bắt đầu có ý nghĩa hơn.

Nhất quán là chìa khóa của thành công

Tôi là một đứa trẻ bắt đầu chơi piano từ năm 7 tuổi và thực sự đam mê nó trong vài năm đầu. Nhưng một khi tôi bắt đầu làm việc với những bài khó hơn, tôi lại mất dần động lực tập luyện. Tôi đã không luyện tập thường xuyên và kết quả là tôi không khá hơn chút nào. Các bài học của tôi kết thúc là một sự lãng phí hoàn toàn bởi vì chúng tôi chỉ học qua những thứ giống nhau tuần này qua tuần khác.

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

Với tất cả những lời quảng cáo về việc học cách coding tại nhà, rất nhiều người bắt đầu tham gia với sự hào hứng ban đầu. Họ sẽ trải qua các hướng dẫn và xây dựng các dự án nhỏ từ lớp học. Nhưng khi nhiều tháng trôi qua, mọi người bắt đầu mất động lực. Họ bắt đầu viết code ít thường xuyên hơn và cuối cùng mất hứng thú và bỏ cuộc.

Khi học cách viết code, bạn phải đưa ra một lịch trình nhất quán, nếu không bạn sẽ không bao giờ trở thành một lập trình viên thực thụ. Bạn sẽ luôn gặp khó khăn trong việc đấu tranh với các nguyên tắc cơ bản và không bao giờ có thể xây dựng các dự án phức tạp hơn. Bạn không cần phải dành 12 giờ mỗi ngày để thành công. Xây dựng một lịch trình phù hợp với bạn. Nếu bạn chỉ có 2 giờ mỗi ngày để dành cho việc học, thì hãy gắn bó với điều đó. Nhưng lặp lại chu kỳ làm 8 giờ một ngày và sau đó nghỉ hai tuần sẽ chỉ dẫn đến sự thiếu tiến bộ.

Nhất quán là chìa khóa để thành công dù là với bất cứ lĩnh vực nào.

kỹ năng coding
Hãy nỗ lực để trở thành môn chuyên gia trong lĩnh vực của mình

Hãy học những gì bạn chưa biết

Trong năm cuối đại học của tôi, người chỉ huy dàn nhạc gió của chúng tôi đã nói rằng “Hãy can đảm để làm những gì mà bạn không biết.” Hầu hết chúng tôi muốn học nhạc bằng cách mà chúng tôi đã quen thuộc là nghe hay trong phòng tập. Đó có lẽ là một cách để chúng ta cảm thấy dễ chịu và đánh đổi cái tôi của mình một chút.

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

Nhưng, nhạc trưởng của tôi đã đúng.

Nếu bạn không thử thách bản thân và khắc phục những điểm yếu của mình thì bạn sẽ không bao giờ phát triển như một nhạc sĩ.

Có quá nhiều thứ để học khi bạn mới bắt đầu với tư cách là một lập trình viên. Chỉ tập trung vào những thứ bạn thích thú thực sự rất hấp dẫn. Điều hợp lý là bạn muốn cảm thấy hài lòng về bản thân và thể hiện những gì bạn biết. Nhưng điều đó không cho bạn lý do để bỏ qua những gì bạn đang yếu kém. Nếu bạn biết mình kém về thuật toán, đừng bỏ qua chúng. Dành thêm thời gian để nghiên cứu và luyện tập thật nhiều để chúng trở nên dễ giải quyết hơn. Hoặc có thể bạn đang gặp khó khăn với đệ quy. Nó sẽ không biến mất chỉ vì bạn không thích nó.

Dù khó khăn trong lúc này nhưng bạn phải có kỷ luật ngồi xuống và rút ra những điều cần học.

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

Kết luận

Dường như có một sự kết nối rất rõ ràng giữa việc học lập trình với học âm nhạc. Hãy biết cách tận dụng những gì tốt nhất để luyện tập mỗi ngày và trở nên thông thái hơn với chuyên môn của mình.

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

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

Mã hóa mật khẩu trong Selenium Webdriver

Mã hóa mật khẩu trong Selenium Webdriver

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

Khi sử dụng automation để thực hiện tự động một việc nào đó, mà ở đó có sự xuất hiện của một số những thông tin nhạy cảm mà ta không muốn nó bị lộ thiên cho bàn dân thiên hạ thấy, vậy thì chúng ta phải làm như thế nào? Thông tin nhạy cảm ở đây có thể là thông tin password chẳng hạn :)) Tuy nhiên, nếu như bạn chỉ là thực hiện công việc test thông thường và không quan tâm lắm, hoặc không có các dữ liệu nhạy cảm thì có thể bỏ qua bài này nhé :))) Nhưng mình nghĩ là đã đọc đến đây rồi thì đọc nốt đi, biết đâu sau này lại cần dùng thì sao? :v

  Các kiểu “đợi chờ” trong Selenium Webdriver: Implicit wait, Explicit wait và Fluent wait
  JavaScript Executor trong Selenium Webdriver

Bởi vì Selenium thông thường thì sẽ không có khả năng che dấu mật khẩu và thậm chí kể cả IDE của Elipse cũng vậy. Cho nên người ta mới nghĩ ra một cách để có thể giúp kiểm soát việc hiển thị của các dữ liệu nhạy cảm bên ngoài môi trường kiểm thử (hoặc môi trường thực tế nào đó), đó là tạo một lớp để có thể thực hiện mã hóa (hoặc giải mã) dữ liệu khi thực thi.

Có hai cách để bạn có thể thực hiện mã hóa, ở đây mình ví dụ là mã hóa mật khẩu nhé.

Cách 1

Cách thứ nhất sử dụng thư viện java.util.Base64, bạn thực hiện mã hóa bằng cách sử dụng hàm mã hóa mặc định của BASE64 với cú pháp như sau:

static String password= "yourPassword";
public static String getDecodedpassword() {
   return new String(Base64.getDecoder().decode(decodepassword.getBytes()));
}

Cách này khá là đơn giản, nhưng đối với những password dài quá 12 ký tự và có những ký tự đặc biệt khi mã hóa sẽ bị quá độ dài có thể xử lý hiển thị được của BASE64, không hợp lệ đối với lý tự đặc biệt và theo mình thì đây cũng chính là điểm yếu của cách này. Chắc là không khuyến khích sử dụng cách này rồi.

Cách 2

Cách thứ 2 là sử dụng thư viện sun.misc.BASE64Encoder với thư viện này thì ta có thể thoải mái với bất kỳ loại password nào (bất kỳ password này là do mình nghĩ ra và nhập vào =)) ) Tương tự cách 1 chỉ khác import thư viện và hàm sử dụng một chút thôi.

static String decodepassword = "yourPassword@874";
public static String getDecodedpassword() {
   return new String(new BASE64Encoder().encodeBuffer(decodepassword.getBytes()));
}

Với cách thứ 2, ta không phải nghĩ về vấn đề độ dài của password hay các ký tự đặc biệt xuất hiện trong password nhập vào. Bên cạnh đó, ta cũng có thể tự tùy biến một hàm mã hóa, và hàm giải mã của nó kết hợp với 1 key (chìa khóa) để giải mã. Key này có thể là một chuỗi ký tự bất kỳ, bằng một vài kỹ năng cơ bản ta kết hợp chuỗi key này vào trong chuỗi password ban đầu rồi sau đó mới thực hiện mã hóa. Tất nhiên để giải mã ngược lại thì ta cũng cần phải có key chính xác đã được sử dụng ở phần mã hóa. Tùy nhu cầu mà bạn có thể lựa chọn cách phù hợp nhé :)) Chỉ có điều cách nào ngon thì sẽ phải ngồi code í, :))) – Không code thì chịu khó Google chắc là sẽ ra, à chắc chắn sẽ ra :v

Đấy, tóm lại là muốn bảo mật hơn thì tất nhiên phải dành thời gian :))) Các bạn có thể tham khảo link này để xem thêm việc biến tấu mật khẩu kết hợp với key để mã hóa, rồi sau đó thực hiện giải mã với key đã có nhé.

Mình nghĩ là đưa ra gợi ý đến đây cũng khá là chi tiết và đầy đủ thông tin rồi nhỉ. Các bạn đã sử dụng những cách nào rồi, hay có còn những cách nào khác không? Nếu có vui lòng chia sẻ cho mình và các bạn đọc khác cùng biết nữa nha. Hoặc có ý kiến đóng góp, trao đổi gì thì cũng đừng ngần ngại để lại bình luận phía dưới nhé!

Tham khảo:

Password Encryptor for Selenium Webdriver

https://developers.perfectomobile.com/pages/viewpage.action?pageId=21430626

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

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

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

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

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

Trên bàn phím máy tính, đặc biệt là các bàn phím dạng Full Size hay là bàn phím của Laptop thường được trang bị một cụm phím Media riêng. Nó thường được tích hợp luôn vào một trong các phím từ F1 đến F12 trên các mẫu bàn phím phổ thông.

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

Khi sử dụng máy tính thì hầu hết mọi người đều có nhu cầu giải trí bằng cách nghe nhạc, chơi game hoặc là xem phim, lúc đó những phím media này sẽ phát huy tác dụng tuyệt vời của nó.

Tuy nhiên, trong một vài trường hợp, khi bạn sử dụng các trình duyệt web mà đơn cử như là Google Chrome thì mặc định, Chrome sẽ chiếm quyết sử dụng các phím Media và chúng không thể sử dụng được chúng cho những phần mềm khác.

  30 tiện ích Chrome (extensions) cho Designer và Developer
  30 tiện ích Chrome cho designer và dev

Chính vì sự bất tiện này mà trong bài vài viết ngày hôm nay, mình sẽ chia sẻ với các bạn cách để ngăn Google Chrome chiếm trọn quyền sử dụng các phím Media trên bàn phím nha !

#1. Phím Media trên bàn phím là gì?

Ngăn Google Chrome sử dụng các phím Media trên bàn phím
Cụm phím media trên bàn phím gaming Corsair Vengeance K70

Phím Media, hay còn gọi là phím đa phương tiện bao gồm các phím như PausePlayNextPreviousMute và phím Tăng giảm âm lượng.

Những phím này thường được nằm tách riêng ra một góc đối với những bàn phím Gaming dạng Full size như chiếc Corsair Vengeance K70 bên trên, hoặc là tích hợp thẳng vào các phím F1 - F12 trên các bàn phím phổ thông.

Còn về chức năng thì quá rõ rồi, cái tên đã nói lên tất cả, nó giúp bạn có thể DừngĐổi nhanh bài hát đang nghe mà không cần phải mở phần mềm lên rồi dùng chuột để lựa chọn nữa và có thể dùng với mọi phần mềm trên tất cả các hệ điều hành.

Còn việc Google Chrome chiếm quyền sử dụng phím Media trên bàn phím là sao? Nếu bạn là người có thói quen vừa nghe nhạc bằng Spotify, SoundCloud hay là iTunes,… vừa xem phim hay xem video trên Youtube thì sẽ hiểu.

Lúc này các phím Pause, Play, Next… sẽ chỉ có tác dụng với bộ phim, video bạn đang xem trên Google Chrome mà thôi, còn các ứng dụng/ chương trình khác trên máy tính thì không sử dụng được.

Và lúc này, nếu bạn muốn chuyển nhạc thì bạn sẽ phải vào trực tiếp ứng dụng nghe nhạc đó để chuyển bài hát, tạm dừng bài hát… điều này khá là bất tiện.

Mà coi phim hay xem video trên Youtube thì ta thường ưu tiên dùng chuột chứ ai rảnh mà ngồi bấm mấy phím này phải không nào.

=> Đấy, chính vì lý do đó mà mình mới chia sẻ thủ thuật này với các bạn.

#2. Ngăn Google Chrome chiếm quyền sử dụng toàn bộ các phím Media trên bàn phím

Cách khắc phục thì vô cùng đơn giản, đầu tiên bạn hãy truy cập vào địa chỉ chrome://flags hoặc chrome:flag để mở trang quản lý những tính năng đang được thử nghiệm trên Google Chrome, cái này chắc nhiều bạn không lạ gì nữa rồi.

Google Chrome sử dụng được những phím media trên bàn phím là nhờ một flag có tên Hardware Media Key Handling, để khắc phục thì rất dễ thôi, bạn chỉ việc vô hiệu hóa flag này là được.

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

Thực hiện:

+ Bước 1: Trước hết bạn hãy dán từ khóa Hardware Media Key Handling để tìm kiếm và bạn sẽ chỉ thấy kết quả duy nhất như hình bên dưới.

Hoặc bạn có thể truy cập nhanh theo địa chỉ này:

chrome://flags/#hardware-media-key-handling

+ Bước 2: Mặc định thì flag này đang ở trạng thái Default tương đương với Enabled, bây giờ bạn hãy click vào Default và chọn lại thành Disabled để vô hiệu hóa flag này.

Ngăn Google Chrome sử dụng các phím Media trên bàn phím

+ Bước 3: Cuối cùng, cũng giống như khi chỉnh sửa Registry của Windows 10, bạn vẫn sẽ phải khởi động lại trình duyệt web bằng cách bấm vào nút Relaunch xuất hiện sau khi bạn thay đổi thiết lập, để những thay đổi này có hiệu lực.

Nhớ là lưu lại các trang web, nội dung quan trọng mà bạn đang làm việc trên trình duyệt web trước khi khởi động lại để tránh bị mất dữ liệu đáng tiếc nhé !

#3. Lời kết

Như vậy là mình đã vừa chia sẻ cho các bạn cách để khắc phục, ngăn Google Chrome chiếm trọn quyền sử dụng các phím Media trên bàn phím rồi đấy.

Đây là những phím rất hữu ích và bạn sẽ thường dùng đến nếu là một người hay nghe nhạc, xem phim… Hy vọng là bài viết này sẽ có thể giúp ích được cho các bạn. Đừng quên chia sẻ nếu thấy nó hay nhé.

Bài viết gốc được đăng tải tại blogchiasekienthuc.com
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Kiểm thử tự động – Tưởng không dễ mà dễ không tưởng

Kiểm thử tự động – Tưởng không dễ mà dễ không tưởng

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

Kiểm thử tự động – Automation Test

Kiểm thử tự động không phải là kiểm thử, nó chỉ là kiểm tra” Một ai đó đã nói như thế. Với mình, sau khoảng hơn 10 năm làm kiểm thử – cả thủ công và tự động, câu nói này không hề sai chút nào.

Hãy cùng thử nhìn qua các lợi ích mà nó mang lại:

  • Hỗ trợ kiểm thử qui hồi – Regression Test → Giảm thiểu thời gian và chi phí.
  • Hỗ trợ kiểm thử độ chịu tải của hệ thống → Làm cho việc kiểm thử mở rộng và đầy đủ.
  • Kịch bản chạy nhiều lần với nhiều bộ dữ liệu, điều kiện và môi trường khác nhau. → Tăng độ bao phủ của việc kiểm thử.
  • Kịch bản kiểm thử tốn quá nhiều thời gian và dễ bị lỗi của người kỹ sư → Tăng cường độ chính xác của việc kiểm thử.
  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  7 lãng phí trong kiểm thử phần mềm

Trong mọi tình huống, Automation Test chỉ tác dụng hỗ trợ cho kỹ sư kiểm thử tiến hành kiểm thử theo những kịch bản có sẵn, do kỹ sư kiểm thử đưa ra. (Ở đây, mình không bàn đến kiểm thử bằng AI nhé, chuyên ngành này vẫn đang được phát triển trong phòng thí nghiệm và – theo mình biết thì – chưa thực sự ứng dụng thực tế).

Kiểm thử tự động với kiểm thử thủ công

Về kỹ năng

Đối với kiểm thử thủ công, kỹ sư kiểm thử cần một số kỹ năng đặc biệt như: biết cân bằng, có mức độ tò mò cao, biết cách tìm/xác định lỗi/bug, có cái nhìn tổng thể, khả năng quan sát, sắp xếp mức độ ưu tiên, suy nghĩ độc lập, sáng tạo, vân vân và mây mây.

Ngược lại, đối với Automation Test chỉ yêu cầu một thứ: khả năng lập trình. Mà, trong một số trường hợp, khả năng lập trình cũng không cần thiết – nếu dự án của bạn dùng một công cụ không cần lập trình – codeless tool.

Về công việc

Công việc của kỹ sư kiểm thử thủ công sẽ bao gồm: đọc tài liệu mô tả các yêu cầu chức năng, lên kế hoạch kiểm thử, viết kịch bản kiểm thử, tiến hành kiểm thử (ghi nhận kết quả) và ghi nhận/báo cáo lỗi/bug (nếu có), làm báo cáo kiểm thử sau khi hoàn thành.

Công việc của kỹ sư kiểm thử tự động chỉ là: chuyển các kịch bản kiểm thử do kỹ sư kiểm thử thủ công đưa ra thành các đoạn mã kiểm thử tương ứng, đồng thời đảm bảo tính chính xác và ổn định của đoạn mã kiểm thử đó.


Với những yêu cầu kỹ năng và công việc hằng ngày như thế, so ra, việc kiểm thử tự động thực sự không khó như kiểm thử thủ công.

Bạn có cảm thấy như vậy không? Kiểm thử tự động thực ra không khó chút nào, kiểm thử thủ công mới thực sự là thử thách.

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 Developer hấp dẫn trên TopDev

Hướng dẫn sử dụng Nock để mock request APIs cho việc run Integration test

Hướng dẫn sử dụng Nock để mock request APIs cho việc run Integration test

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Trước khi tham khảo thông tin bài viết này, bạn cần biết về Integration test là gì? Và Nock là một giải pháp tốt trong việc mocking các request đến các APIs khi làm với NodeJS để trả ra expected bạn mong muốn.

  10+ tools và extensions tuyệt vời cho GraphQL APIs
  3 bước tối ưu hiệu năng React App bằng các API mới của React

I. Tại sao phải dùng Nock?

Khi chạy Integration test chúng ta khó có thể Injection vào function để mock như Unit test được. Vì thế việc gọi các APIs và trả ra dữ liệu mong muốn với phương thức Injection vào function thì khá khó khăn.

Việc mock vào HTTP request để các APIs trả ra dữ liệu thì khả quan hơn!

Ví dụ: Itegration có function gọi tới API của Amazon mà mock nó trả ra dữ liệu mình muốn.

Có rất nhiều package tương tự Nock như Pact, Chai, Sinon nhưng việc sử dụng thì mình thấy Nock hoạt động dễ dàng và cách dùng rất dễ hiểu!

Repo: https://github.com/nock/nock

NPM: https://www.npmjs.com/package/nock

II. Nock hoạt động như thế nào?

Nock hoạt động bằng cách ghi đè hàm http.request của Node. Ngoài ra, nó cũng ghi đè lên http.ClientRequest để đề cập đến các module sử dụng trực tiếp.

III. Cách sử dụng Nock để mock HTTP request hiệu quả.

Mình tham khảo hoàn toàn từ tài liệu của Nock cung cấp và kết hợp với Chai để tiến code Integration test.

Nock document: https://github.com/nock/nock#usage

Cách mà mình sử dụng Nock cho việc Integration test.

https://github.com/lechidung/test-source-sample-for-nodejs

'use strict';

const request = require('request');
const chai = require('chai');
const chaiHttp = require('chai-http');
const nock = require('nock');

const server = require('../../../src/app');
const {api} = require('../../../src/configs');
const dataProvider = require('./dataProvider/books');
const testCase = require('./testCase/books');
const RealDate = Date;

function mockDate (isoDate) {
    global.Date = class extends RealDate {
        constructor () {
            return new RealDate(isoDate)
        }
    }
}

describe('books Detail API Success', () => {
    before(() => {
        chai.use(chaiHttp);
    });

    beforeEach(() => {
        global.Date = RealDate;
        mockDate('2018-07-12T12:00:00z');

        // Mock CMS API get books Detail
        nock(api['BOOK_DETAIL'].host)
        .get(api['BOOK_DETAIL'].path)
        .query({
            url_key: 'book_code'
        })
        .reply(200, dataProvider.book_info);

        // Mock get IAM Data API
        nock(api['IAM'].host, {
            reqheaders: {
                'App-Auth': 'PemToken'
            }
        })
        .get(api['IAM'].path)
        .query({
            fields: 'login, reg, prem, iden'
        })
        .reply(200, dataProvider.IAMResult);

        // Mock Target User API
        let iamDataStr = JSON.stringify(dataProvider.IAMData);
        let iamDataBase64 = Buffer.from(iamDataStr).toString("base64");

        nock(api['TARGET_USER'].host)
        .get(api['TARGET_USER'].path)
        .query({
            cp_id: dataProvider.book_info.book_id,
            date: 20180712190000,
            iam_data: iamDataBase64
        })
        .reply(200, dataProvider.targetUser);
    });

    afterEach(() => {
        global.Date = RealDate;
    });

    testCase.forEach(v => {
        it(v.caseName, done => {
            // When
            chai.request(server)
            .get(v.path)
            .set(v.headers)
            .query(v.queryParameters)
            .end((err, res) => {
                // Then
                expect(res).to.have.status(v.expected.status);
                expect(res.body).to.deep.equal(v.expected.body);
                done();
            });
        });
    });
});
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Những lưu ý khi làm CV Online? Tổng hợp mẫu CV free cho Dev mới nhất 2024

làm cv online
làm cv online

Làm CV online không phải là điều đơn giản vì nó đòi hỏi ứng viên nắm được những bước căn bản. Hiểu thế nào là CV? Tìm những nguồn nào để làm cv online tốt nhất? CV có những điểm gì khác so với Cover Letter? Cùng TopDev tìm hiểu bài viết sau đây để biết cách lựa chọn và làm cv online hiệu quả. Đồng thời, cung cấp cho bạn những phân tích sâu về CV, Cover Letter.

Khi làm CV – Đâu là những điều đáng lưu ý

Hiểu rõ về CV và cách phân biệt CV vơi Cover Leter? 

Trước khi làm cv online, bạn cần hiểu CV là gì? CV là loại văn bản ngắn được cấu tứ theo một chuẩn format nhất định. Nó được trình bày trên một trang A4. Tính ngắn gọn, dễ hiểu và nhấn mạnh trọng tâm nội dung là điều người viết cần đặc biệt lưu ý khi viết CV.

Tùy theo từng loại CV IT gắn với các vị trí ứng tuyển cụ thể, các thông tin về cá nhận, học vấn – trình độ năng lực, kinh nghiệm, mục tiêu phát triển nghề nghiệp,.. của một ứng viên sẽ linh hoạt được thay đổi, bổ sung và tinh gọn sao cho phù hợp nhất với nhu cầu từng ứng viên, cũng như đòi hỏi từ phía nhà tuyển dụng.

Vậy thế nào là Cover Letter cho Dev?

Phân biệt Cover Letter là bước tiếp theo để bạn không bị nhầm lẫn định hướng khi làm cv online Cover Letter (hay còn gọi là Thư xin việc), là một loại văn bản được xây dựng dưới hình thức một trang. Cover Letter cho Dev được đánh dấu chuyên biệt cho lĩnh vực IT. Cụ thể là từng vị trí cụ thể hơn như Senior Developer, Freelancer IT,… Tùy thuộc vào từng vị trí mà cách truyền tải các thông tin về cá nhân, năng lực, trình độ, mục tiêu phát triển sẽ khác nhau. Đó là các thông tin ban đầu giúp ứng viên tạo ấn tượng quan trọng đến nhà tuyển dụng. 

Chất lượng của một Cover Letter cho Developer 

Làm cv online cần nắm bắt tốt các đặc tính về CV lẫn Cover Letter. Và chất lượng của một Cover Letter sẽ quyết định thành công kết quả ứng tuyển, chiếm từ 30 đến 50%. Điều đó đồng nghĩa, việc bạn đầu tư cho bản thân một Cover Letter hoàn hảo, chuyên nghiệp là điều đúng đắn.

Hãy cố gắng hoàn thiện Cover Letter của mình thật chỉn chu để đủ sức gây ấn tượng với nhà tuyển dụng. Đặc biệt, do tính cạnh tranh của thị trường tuyển dụng ngày một gia tăng, bạn không nên ỷ lại, quá tự tin. Cũng đừng xem thường các đối thủ vì trong tích tắt bạn có thể bị vượt qua. Đừng để bản thân mình “out” khỏi hành trình nghề nghiệp với sự thờ ơ đối với chính Cover Letter của mình.

Cover Letter có thể phản ánh cả hai mặt. CV cũng tương tự, đó cũng là một điểm bạn cần lưu ý khi làm cv online Một là bạn hoàn toàn là ứng viên phù hợp với vị trí. Hai là bạn không thuộc về vị trí đó, Chính đây cũng là bải học để bạn tự nhìn nhận về Cover Letter, những gì bản thân chia sẻ lẫn định hướng tương lai của mình. Việc xem xét, điều chỉnh sẽ giúp bạn hoạn thiện và phát triển bản thân mình nhiều hơn.

Những lưu ý cần lưu ý cần nắm bắt khi làm CV Online và Cover Letter cho Dev

Bám sát trọng tâm cấu trúc format và cách thức tổ chức nội dung

Ứng viên IT cần lưu ý về việc lựa chọn các định dạng phù hợp cho CV IT và Cover Letter cho Dev. Tùy thuộc vào từng vị trí Freelancer IT, tuyển dụng Data Analyst, Senior Developer. Các bạn cần hiểu rõ một CV và Cover Letter:

+ Gồm những nội dung cơ bản nào

+ Đâu là phần quan trọng cần triển trai chi tiết

Từ đó, bạn biết kiểm soát và chọn lọc nội dung phù hợp. Điều này giúp hồ sơ xin việc dễ dàng ghi điểm với nhà tuyển dụng hơn.

Bạn có thể linh động chuyển đổi các các phần nội dung cho hợp lý. Để tạo điểm nhấn trong CV của mình mình, hãy cân nhắc sắp xếp hợp lý. Quan trọng hơn nữa, đừng để cập đến các nội dung không liên quan đến vị trí bạn ứng tuyển.

Tính ngắn gọn – dễ hiểu của mẫu làm CV online

Cả CV và Cover Letter cần phải đảm bảo tính ngắn gọn, dễ hiểu. Lưu ý không nên viết quá dàn trải, thậm chí lan man. Văn phong dài dòng khiến thông điệp của ứng viên trở nên lủng củng, mất đi các giá trị. Vì thế, hãy sử dụng câu từ dễ hiểu, cách viết đơn giản để hồ sơ xin việc của bạn đạt hiệu quả hơn. 

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Nhà tuyển dụng cần nắm bắt nhanh những mô tả về ứng viên. Đó cũng chính là cơ sở họ xem xét tính quyết định đến việc chi tiết hóa nội dung tài liệu của bạn. Do vậy, hãy thật sự chăm chút cho bộ hồ sơ ứng tuyển của mình.

Tạo CV online miễn phí, nhanh chóng trên TopDev

Kỹ năng – Phần nội dung quan trọng đối với việc làm CV online

Chỉ cần 3-5s, nhà tuyển dụng có thể dễ dàng phân loại chất lượng CV IT của bạn. Nó ngắn hơn các loại văn bản dài như sơ yếu lý lịch cho IT,…Điều đó đồng nghĩa cơ hội để bạn tạo ấn tượng là hết sức cạnh tranh.

Nếu không biết tạo điểm nhấn, đặc biệt đối với các vị trí cao hơn như Senior Developer, CV của bạn sẽ bị quên lãng.

Phần kỹ năng là phần rất quan trọng. Nó chiếm phần trăm lớn sự kỳ vọng mà mọi nhà tuyển dụng tìm kiếm ở ứng viên. Do vậy, việc trình bày, chọn lọc các kỹ năng cũng cần phải thông minh và có chiến lược. Đừng để CV IT của bạn trở nên không có giá trị. Và tất nhiên, bạn sẽ bị out khỏi vòng phỏng vấn đấy!

Các lưu ý khi trình bày mục kỹ năng – Skills trong CV của bạn

Có thể bạn có rất nhiều kỹ năng. Thế nhưng, điều này không có nghĩa bạn có thể phô trương hết chúng vào trong làm CV online của mình. Với trường hợp là CV cho sinh viên IT mới ra trường, có thể bạn còn thiếu sót.

Tuy nhiên, khi apply các vị trí khác thì CV Junior Developer, Senior Developer, Mobile App Developer thì CV IT của bạn cần phải tập trung vào các kỹ năng chuyên sâu hơn. Vì vậy, hãy lưu tâm những tips sau đây:

Chi tiết hóa và thể hiện các kỹ năng tương ứng với vị trí công việc 

Mục đích quan trọng của phần kỹ năng là thuyết phục nhà tuyển dụng bạn phù hợp với vị trí ứng tuyển. 

Vì vậy, chỉ những kỹ năng quan trọng đến vị trí ứng tuyển thì mới nên hiện diện trong list kỹ năng CV. Ví dụ như đối với làm CV Developer, Senior Developer, bạn nên lựa chọn các kỹ năng chuyên sâu về công nghệ như các ngôn ngữ lập trình, viết code, và các kiến thức có liên quan.

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Có tính toán trong việc phân chia kỹ năng

Việc linh hoạt trong việc phân chia các kỹ năng có ý nghĩa rất quan trọng.

Hãy chia các kỹ năng của bạn thành từng các mục nhỏ ứng với các đặc trưng chuyên môn khác nhau. Senior Developer, bạn có thể liệt kê và phân chia các kỹ năng về ngôn ngữ lập trình; các nhóm kỹ năng về phần mềm. Chính việc phân loại giúp bạn hiểu rõ hơn về vị trí. Đồng thời, nhà tuyển dụng sẽ đánh giá cao hơn về năng lực phân tích của bạn.

Chọn lọc và nhấn mạnh kỹ năng quan trọng

Đây là cách ứng viên nhấn mạnh các kỹ năng quan trọng bằng cách lặp lại các kỹ năng. Tất nhiên, việc “rải” từ khóa về kỹ năng cần ứng viên phải khéo léo và tinh tế. Bạn có thể phân theo từng mục và giới hạn xuất hiện để đảm bảo các kỹ năng không bị trùng lặp quá nhiều lần.

Cụ thể bạn có thể liệt kê kỹ năng trong phần đầu – phần giới thiệu và phần kinh nghiệm làm việc. Từ khóa về kỹ năng rất quan trọng để nhà tuyển dụng kết luận đâu là điểm mạnh của bạn. Tuy vậy, tần suất hoàn hảo nhất của một kỹ năng chỉ nên từ 2-3 lần.

Ứng viên không nên quá lạm dụng. Đặc biệt, kỹ năng được lặp lại phải thật sự phản ánh chính xác năng lực của bạn. 

Độ dài khi làm CV online cho Dev – Liệu có quan trọng hay không?

CV có độ dài lý tưởng sẽ thể hiện mức độ phụ ứng giữa những trải nghiệm chuyên 

CV cho Dev dài 1 trang

Đối với CV cho sinh viên IT mới ra trường (CV IT student) thì CV một trang là sự lựa chọn hoàn hảo và an toàn nhất. Đơn giản vì họ chưa có nhiều kinh nghiệm. Họ còn “non” trong một môi trường IT khá cạnh trạnh. Đây cũng là thời điểm tốt để họ bắt đầu những trải nghiệm, tích lũy để nâng cấp cho CV của mình.

Liệu rằng làm CV online 2 trang sẽ khiến nhà tuyển dụng lắc đầu?

Nếu xét trong một phạm vi lý tưởng, mẫu CV IT tiếng việt sẽ có độ dài tiêu chuẩn 2 trang CV. Một khảo sát thực tế cho thấy đó là sự yêu thích của 91% nhà tuyển dụng. Đặc biệt, nhiều công ty ở Anh đã từ chối CV ít hơn 2 trang của các ứng viên với lý do CV họ chưa nhiều ấn tượng. Nguyên nhân được cho là chưa biết cách chọn lọc, hiểu rõ về các kỹ năng thế mạnh của bản thân.

Hãy thật sự quan tâm đến mẫu CV IT tiếng việt của bạn. Vì nhiều trường hợp đòi hỏi bạn viết CV IT tiếng Anh (CV English IT); hay khi bạn apply các vị trí đa dạng như App Mobile Developer, Senior Developer thì CV IT Developer cũng cần được đảm độ về độ dài song song với việc kết hợp lựa chọn các kỹ năng phù hợp.

CV Dev có thể 3 trang hoặc dài hơn 

Nói một cách thực tế, không một nhà tuyển dụng thích các ứng viên có CV quá dài. Tuy nhiên, nên nhìn nhận sâu hơn vì phạm vi sử dụng CV 3 trang vẫn được biết đến. 

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

CV 3 trang sẽ phù hợp với các nhà quản lý, giám đốc cấp cao, các học giả, nhà khao học khi muốn truyền tải các nội dung; thông điệp đính kèm với các ấn phẩm tài liệu, nghiên cứu của mình.

Giải pháp giúp tối ưu số lượng chữ trên CV cho Dev

Sau đây là một số tips có thể giúp bạn cải thiện mẫu CV IT tiếng việt của mình trở nên ngắn gọn hơn.

Ưu tiên các kỹ năng – kinh nghiệm có liên quan đến vị trí ứng tuyển 

Đây là mẹo nhưng cũng chính là một kỹ năng quan trọng khi viết CV. Thông minh trong việc chọn lọc thông tin về các kinh nghiệm. Ứng viên chỉ nên liệt kê các kỹ năng – trải nghiệm có liên quan đến vị trí ứng tuyển. Điều này giúp CV đạt chuẩn hơn, chuyên nghiệp hơn. Vì vừa đảm bảo tính khoa học, vừa truyền tải đúng các thông điệp.

Yếu tố dễ đọc – nắm bắt nhanh nội dung CV

Đừng quá dài dòng, thê lê nhiều con chữ! Điều đó chỉ khiến CV trở nên không điểm nhấn. Bạn nên rút gọn câu từ, sử dụng những từ ngữ đơn giản. Hoặc tương tư như CV Template IT, sơ yếu lý lịch cho dân IT, cover letter cho dev thì mẫu CV IT tiếng việt của bạn nên lượt bỏ đi những phần không thật sự quan trọng, cần thiết.

Quan tâm đến mặt hình thức cấu trúc CV

Kích thước cỡ chữ, font chữ trong mẫu CV IT tiếng Việt cũng là một yếu tố quan trọng. Đừng để font chữ quả to hoặc quá nhỏ. Cần lưu ý đến khoảng cách lề trang sao cho nhất quán. Điều này có ý nghĩa quan trọng vì chi phối trực tiếp đến định dạng bố cục thông tin được trình bày trên mẫu CV IT tiếng việt.

Tips giúp tối ưu việc làm CV Developer hiệu quả nhất

– Điểm lại những yếu tố cốt lõi tạo nên giá trị chính của CV: mục tiêu nghề nghiệp, kỹ năng, trình độ và kinh nghiệm chuyên môn của bạn.

– Phải nhớ: Tính ngắn gọn, súc tích, mạch lạc – dễ hiểu trong mẫu CV IT tiếng việt rất quan trọng. Vì đó tạo nên sức hút cho nhà tuyển dụng từ những ánh nhìn đầu tiên.

– Đừng để CV xin việc dài quá 2 trang .

– Kiểm soát thông tin, không nén quá nhiều thông tin trong CV của bạn. 

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

Nhà tuyển dụng cần nắm bắt nhanh những mô tả về ứng viên. Đó cũng chính là cơ sở họ xem xét tính quyết định đến việc chi tiết hóa nội dung tài liệu của bạn. Do vậy, hãy thật sự chăm chút cho bộ hồ sơ ứng tuyển của mình.

Cách viết mẫu CV free cho Dev với một số vị trí cụ thể

CV IT Administrator cực chuẩn

Thông tin liên hệ

Hãy cung cấp các thông tin về: 

  • Số điện thoại 
  • Email
  • Kênh liên hệ cá nhân (nếu có)

Mục tiêu nghề nghiệp

Mục tiêu này, bạn nên đưa ra các mục tiêu rõ ràng, tránh mơ hồ.

Ví dụ: Tôi nộp đơn vì mục đích: Có cơ hội trải nghiệm và phát triển nghề nghiệp tốt hơn. Tôi muốn làm việc tại … với vị trí IT Administrator và định hướng sắp tới, tôi hy vọng mình sẽ gặp gỡ các đối tác tiềm năng. Đồng thời, mục tiêu lâu dài tôi mong muốn trở thành một Administrator Manager. 

Nếu có thể, bạn hãy khéo kéo đưa vào một số thế mạnh: Một vài điểm nổi trội về bản thân

+ Kinh nghiệm làm việc (đề cập đến số năm kinh nghiệm)

+ Chứng chỉ chuyên ngành/kỹ năng mềm (nên có thông tin xác nhận) 

+ Các kỹ năng liên qua trực tiếp đến vị trí IT Administrator, các nền tảng kiến thức quan trọng từ các chương trình nghiên cứu

Trình độ học vấn

Liệt kê trường đại học hoặc các khoa học gần đây của bạn. Lưu ý, hãy đề cập đến các khóa học liên quan vị trí ứng tuyển. Điều này sẽ giúp CV IT của bạn thu hút hơn. Dù là CV IT tiếng anh hay tiếng việt, bạn cũng đang tạo ra lợi thế cho mình. Các khóa học liên quan về:

  • Quản trị mạng
  • Quản lý bảo mật
  • Thiết kế web
  • Hỗ trợ ứng dụng và hệ thống email

Kinh nghiệm làm việc

Trình bày những kinh nghiệm làm việc tại các công ty trước đó (ghi cụ thể thời gian). Vị trí/chức vụ đảm nhận và các task – nhiệm vụ) cụ thể bạn thực hiện. 

Một số vị trí liên quan nền tảng: System Engineer, IT Excutive, IT Helpdesk,…

Bạn ghi rõ nhiệm vụ nhưng cần đảm bảo không quá dài dòng. Thông qua từng trải nghiệm công việc, nhà tuyển dụng sẽ hiểu rõ hơn về sự định hướng sự nghiệp sắp tới của bạn. Freelancer IT cũng đánh giá kinh nghiệm quan trọng cuộc đua nghề nghiệp của bạn.

Kỹ năng

Liệt kê các kỹ năng bạn có và đánh dấu mức độ thể hiện ở từng kỹ năng. Đây là một số kỹ năng cần có trong CV IT Administrator. Tuy nhiên, bạn vẫn phải đảm đảm độ chân thật với năng lực thực tế.

  • Giao tiếp
  • Kỹ năng tư duy hệ thống/quản lý
  • Teamwork
  • Tin học văn phòng
  • Ngoại ngữ
  • Kỹ năng hỗ trợ dịch vụ

Chứng chỉ, hoạt động, giải thưởng và các sở thích

Đây là phần nội dung bạn sẽ tự linh động về chúng có xuất hiện trong CV IT Administrator của mình hay không? Nếu có các chứng chỉ hoặc các thành tích cá nhân, bạn có thể bổ sung vào CV. Bạn nên cân nhắc và lựa chọn các thông tin có liên quan trước khi đưa chúng vào “tấm vé” tuyển dụng của mình.

IT Programmer –  Mẫu CV free cho Dev đẹp nhất

Tên của bạn (và các thông tin cá nhân)

Ví dụ: Raina Angela Barbie

raina.anbie@gmail.com | 111-xxx-xxx| Texas, NY

Mục tiêu nghề nghiệp

Đây là mục khá quan trọng đối với CV ngành IT của bạn. Nhà tuyển dụng sẽ đánh giá mức độ hoạch định mục tiêu phát triển của bạn. 

Ví dụ: Học hỏi và nâng cao trình độ chuyên môn về lập trình JavaScript, C++. Mong muốn trở thành chuyên gia nghiên cứu các giải pháp phát triển; hỗ trợ và đào tạo các lập trình viên trẻ tuổi.

Kỹ năng

Một số kỹ năng bạn mà IT Programmer CV của bạn có thể cân nhắc lựa chọn là:

  • Tư duy định hướng, làm việc nhóm
  • Đa nhiệm, sáng tạo
  • Phân tích và giải quyết vấn đề
  • Kỹ năng giao tiếp nâng cao (đồng nghiệp, đối tác,…) 
  • Khả năng thích ứng và chịu áp lực

Kỹ năng chuyên sâu

Vị trí này đòi hỏi bạn cần có nhiều kinh nghiệm hơn. Vì thế, quá trình tạo CV IT tiếng anh hoặc tiếng việt cũng chính là cơ hội bạn đánh giá lại các kỹ năng của mình.

Dưới đây là các kỹ năng chuyên sâu mà cần có cho vị trí IT Programmer:

– Hệ thống máy tính: Mac OS X, DOS, Window,…

– Các ngôn ngữ lập trình: React JS, C++, HTML, Python, SharePoint,…

– Cơ sở dữ liệu: MS Access, Oracle 9.x, FileMaker Pro, FoxPro, MySQL

Trình độ học vấn

Do là vị trí đòi hỏi nhiều kinh nghiệm, ngoài việc trình bày nơi học tập (tốt nghiệp Cử nhân…., điểm GPA (nếu muốn đề cập), bạn thể chia ra các phần như:

Các khóa học có liên quan

+ Phát triển phần mềm (Software Development)

+ Coding cơ bản và nâng cao (Coding Basics, Advanced)

+ Quản lý dự án (IT Project Management)

+ An ninh Mạng (Cyber Security)

+ Quản lý bảo trì thiết bị (CMMS)

+ Xử lý sự cố (Troubleshooting)

Và các khóa học khác…

Dự án cộng đồng

Bạn nên trình bày các dự án có gắn liền với việc sử dụng chuyên một hay nhiều cơ sở dữ liệu hoặc các chuyên môn có liên quan. 

Ví dụ sử dụng FileMaker Pro để thiết kế các đơn nộp trực tuyến,…

Giải thưởng danh dự

Nói về các giải thưởng bạn/Team bạn đạt được nếu có.

Kinh nghiệm

Phần này tùy thuộc vào “tuổi nghề” mà bạn sở hữu. Hãy thông minh trong việc trình bày các kinh nghiệm có trong CV IT của mình. Nếu bạn là một freelancer IT, đừng ngần ngại chia sẻ trải nghiệm của mình vào việc làm CV online IT nhé! đơn xin nghỉ việc, kỹ năng giao tiếp

Gợi ý cho bạn là có thể chia sẻ các trải nghiệm theo từng giai đoạn:

– Thực tập sinh – Programmer Intern

– Giai đoạn trình độ được nâng cao và phát triển (có thể chạm đến mức độ là IT Specialist – Chuyên viên)

– Giai đoạn hợp tác và đại diện cho các khách hàng/đối tác lớn (nếu có)

Mỗi giai đoạn, bạn có thể trình bày:

+ Những nhiệm vụ bạn đã thực hiện một cách cụ thể

+ Các thay đổi tích cực qua số liệu

+ Những bài học đúc kết

Chứng chỉ

Liệt kệ ngắn gọn các chứng chỉ khoa học chuyên ngành cùa bạn nếu có.

Ví dụ: C++ Certified Associate Programmer, Java SE 8 Programmer,…

Tham khảo các mẫu CV free cho Dev hấp dẫn nhất 

cv online
M1 – CV đa nhiệm

 

làm cv online
M2 – CV đa nhiệm
làm cv online
M3 – CV đa nhiệm
làm cv online
Mẫu CV cổ điển
làm cv online
Mẫu CV cổ điển
làm cv online
M1 – CV Pro
làm cv online
M2 – CV Pro
làm cv online
M3 – CV Pro

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 Top Việc làm Developer trên TopDev

Giới thiệu Abstract Factory Pattern

Abstract Factory Pattern

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

Pattern thứ hai mà mình muốn giới thiệu chính là Abstract Factory. Nó có thể được hình dung như một nhà máy lớn, bên trong có các nhà máy nhỏ hơn sản xuất ra những loạt sản phẩm liên quan đến nhau.

Hãy lấy một hãng sản xuất ô tô làm ví dụ, chẳng hạn Hyundai. Họ có nhà máy, hoặc xưởng, chế tạo bánh xe: bánh của Azera, bánh của Sonata, bánh của Veloster, v.v… Đến lượt cửa xe, cũng có nhà máy chế tạo cửa Azera, cửa Sonata, cửa Veloster. Thân xe, động cơ, đèn, và các thành phần khác có những nhà máy chế tạo chúng.

  Design pattern là gì? Tại sao nên sử dụng Design pattern?
  Hướng dẫn sử dụng Factory trong Design Pattern

Vậy phải tổ chức việc sản xuất ấy như thế nào? Cùng theo dõi tiếp nhé!

Nếu mới làm quen với Design Pattern, có thể bạn sẽ muốn đọc bài tổng quan của mình tại đây hoặc bài về Singleton tại đây.

ABSTRACT FACTORY

Giống như ở bài trước về Singleton, bài này gồm 5 phần:

  • Ý tưởng chính
  • Vấn đề cần giải quyết
  • Cấu trúc
  • Code ví dụ
  • Lưu ý
  • Vài lời bình luận

Ý tưởng chính

  • Khai báo một interface với các phương thức tạo các đối tượng abstract.
  • Một hệ thống phân cấp với các “dòng xe” và các “bộ phận xe”.
  • Tránh sử dụng từ khoá new.

Vấn đề cần giải quyết

Khi bạn muốn phần mềm của mình có thể được triển khai trên nhiều nền tảng khác nhau, bạn phải tìm cách xử lý việc khởi tạo các đối tượng trên các nền tảng đó. “Nền tảng” ở đây có thể hiểu là hệ điều hành, cơ sở dữ liệu,… Trong ví dụ ở phần mở đầu, Azera, Sonata và Veloster chính là các nền tảng.

Tuy nhiên, nếu bạn xử lý chuyện này bằng những câu if ... else thì chẳng mấy chốc code của bạn sẽ thành một mớ bòng bong vì phần mềm sẽ dần nở to. Và đó là lý do mà Abstract Factory ra đời.

Cấu trúc

Ta cần có năm thành phần, đó là:

  • Abstract Platform: interface hoặc abstract class với các phương thức tạo ra các “sản phẩm”
  • Concrete Platforms: Khai báo cụ thể các “nền tảng” (PlatformOne, PlatformTwo trong hình)
  • Abstract Products: interface hoặc abstract class định nghĩa các loại “sản phẩm” (AbstractProductOne, AbstractProductTwo trong hình)
  • Concrete Products: Khai báo cụ thể các “sản phẩm” (ProductOnePlatformOne, ProductOnePlatformTwo, ProductTwoPlatformOne, ProductTwoPlatformTwo trong hình)
  • Client: Đối tượng sử dụng Abstract Platform và Abstract Product
Giới thiệu Abstract Factory Pattern

Với ví dụ về việc sản xuất xe, biểu đồ có thể trở thành như sau.

Giới thiệu Abstract Factory Pattern

Bạn cũng cần kiểm tra các tiêu chí dưới đây.

  • Hãy xem xét liệu việc độc lập với các “nền tảng” và việc khởi tạo các đối tượng có phải là vấn đề của hệ thống hiện tại hay không.
  • Làm rõ đâu là “nền tảng”, đâu là “sản phẩm”, và mối quan hệ giữa chúng.
  • Định nghĩa một factory (interface) với đầy đủ các phương thức khởi tạo từng sản phẩm.
  • Định nghĩa các lớp dẫn xuất của interface trên, đảm bảo đã “bao gói” các phương thức khởi tạo (ứng với việc gọi new).
  • Client không được dùng new mà phải dùng các phương thức mà bạn đã khai báo ở interface.

Code ví dụ

Dưới đây là code ví dụ về việc khởi tạo các loại CPU, MMU, viết bằng ngôn ngữ Java.

Các “sản phẩm” (CPU, MMU)
// class CPU
abstract class CPU {}

// class EmberCPU
class EmberCPU extends CPU {}

// class EnginolaCPU
class EnginolaCPU extends CPU {}

// class MMU
abstract class MMU {}

// class EmberMMU
class EmberMMU extends MMU {}

// class EnginolaMMU
class EnginolaMMU extends MMU {}
Các “nền tảng” cụ thể
// class EmberFactory
class EmberToolkit extends AbstractFactory {
    @Override
    public CPU createCPU() {
        return new EmberCPU();
    }

    @Override
    public MMU createMMU() {
        return new EmberMMU();
    }
}

// class EnginolaFactory
class EnginolaToolkit extends AbstractFactory {
    @Override
    public CPU createCPU() {
        return new EnginolaCPU();
    }

    @Override
    public MMU createMMU() {
        return new EnginolaMMU();
    }
}
“Nền tảng” trừu tượng
enum Architecture {
    ENGINOLA, EMBER
}

abstract class AbstractFactory {
    private static final EmberToolkit EMBER_TOOLKIT = new EmberToolkit();
    private static final EnginolaToolkit ENGINOLA_TOOLKIT = new EnginolaToolkit();

    // Returns a concrete factory object that is an instance of the
    // concrete factory class appropriate for the given architecture.
    static AbstractFactory getFactory(Architecture architecture) {
        AbstractFactory factory = null;
        switch (architecture) {
            case ENGINOLA:
                factory = ENGINOLA_TOOLKIT;
                break;
            case EMBER:
                factory = EMBER_TOOLKIT;
                break;
        }
        return factory;
    }

    public abstract CPU createCPU();

    public abstract MMU createMMU();
}
Client
public class Client { public static void main(String[] args) { AbstractFactory factory = AbstractFactory.getFactory(Architecture.EMBER); CPU cpu = factory.createCPU(); } }

Lưu ý

Creational patterns có thể kết hợp với nhau hoặc thay thế cho nhau. Và để quyết định dùng pattern nào hoặc kết hợp như thế nào, bạn phải xem xét trường hợp của mình.

Abstract Factory thường được kết hợp với Factory Method, đôi khi là cả Protoype nữa.

Abstract Factory có thể thay thế cho Facade để che giấu những lớp được đặc tả riêng cho từng “nền tảng”.

Phân biệt Abstract Factory và Builder. Trong khi Abstract Factory chú trọng việc khởi tạo những nhóm đối tượng có liên quan đến nhau (chiều ngang); thì Builder chú trọng vào việc tạo ra một đối tượng qua nhiều bước nối tiếp nhau, giống như một dây chuyền vậy (chiều dọc). Trường hợp của Abstract Factory, đối tượng được trả về ngay; còn trong trường hợp của Builder, đối tượng là kết quả của cả quá trình.

Thông thường, việc thiết kế hệ thống sẽ đi từ Factory Method (dễ hiểu, dễ tuỳ biến) thành Abstract Factory, Prototype, hoặc Builder (mềm dẻo hơn, phức tạp hơn) nếu như người thiết kế cảm thấy tính mềm dẻo là cần thiết.

Vài lời bình luận

Như đã nói ở trên, các creational pattern có thể thay thế cho nhau hoặc kết hợp với nhau tuỳ hoàn cảnh, và việc thiết kế có thể đi từ Factory Method đến Abstract Factory. Tức là bạn phải xem xét thật kỹ càng bài toán của mình để biết cần lựa chọn giải pháp nào, thay vì vội vàng lựa chọn.

Các pattern được đưa ra rõ ràng là đem lại cái lợi lớn cho các lập trình viên nhưng bạn không nên lệ thuộc vào chúng. Theo tôi, đừng bao giờ nên giả định rằng: “Chắc tương lai hệ thống sẽ phải thế này, thế kia” hay “Có lẽ sau này hệ thống cần phải mềm dẻo hơn, flexible hơn nên phải chọn Abstract Factory”. Code ít hơn bao giờ cũng tốt hơn.


Tham khảo

Abstract Factory Design Pattern, Source Making

Hướng dẫn Java Design Pattern – Abstract Factory, GP Coder

Một vài “trick” khi sử dụng Xpath và CSS selector trong Selenium

Một vài “trick” khi sử dụng Xpath và CSS selector trong Selenium

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

Bài viết này chia sẻ một số cách sử dụng Xpath và CSS selector để tìm một phần tử nào đó trong Selenium.  Bài này khá là hữu ích đối với mình, và mình cũng hi vọng sẽ giúp ích một phần nào đó cho các bạn.

Bên cạnh bài viết này các bạn cũng có thể tham khảo bài biết về các cách xác định locator của một phần tử web ở bài viết này nhé.

  JavaScript Executor trong Selenium Webdriver
  Selenium là gì? Giới thiệu chi tiết về Selenium Automation Testing

1. Theo iD

ID của một phần tử được định nghĩa viết theo cú pháp Xpath là “[@id=’idName’]” nhưng theo cú pháp CSS thì nó là “#idName”/

Ví dụ phần tử div có id là  ‘panel’ sẽ được diễn tả như sau:

  • Xpath: //div[@id=’panel’]
  • Theo CSS selector: css = div#panel

2. Theo Class:

Class của một phần tử được định nghĩa theo cú pháp Xpath là “[@class=’className’]” nhưng theo cú pháp CSS nó được định nghĩa là “.className”.

Ví dụ một phần tử div với class là ‘panelClass’ sẽ được diễn tả như sau:

  • Theo Xpath locator: //div[@class=’panelClass’]
  • Theo CSS selector: css=div.panelClass

Đối với những phần tử có nhiều class thì cần tách riêng những class đó bằng cách sử dụng dấu cách (“ “) trong Xpath, và sử dụng dấu chấm (“.”) trong CSS. Các bạn xem ví dụ phía dưới này nhé:

  • Theo Xpath locator: //div[@class=’panelClass1 panelClass2′]
  • Theo CSS selector: css=div.panelClass1.panelClass2

3. Một số thuộc tính khác

Để lựa chọn một phần tử theo một số thuộc tính bất kì nào đó của nó, (ví dụ: một phần tử div có thuộc tính name, hay thuộc tính type của một phần tử input) ta có như sau:

  • Với Xpath locator:  //div[@name=’continue’]  và //input[@type=’button’]
  • Với CSS selector:  css=div[name=’continue’] và css=input[type=’button’]

4. Phần tử con liền kề (direct child)

Một phần tử con liền kề của một phần tử được biểu thị bằng hai dấu gạch chéo xuôi “//” trong Xpath và dấu ngoặc lớn hơn (“>“) trong Css selector. Xem ví dụ dưới đây về phần tử “ul” có phần tử con liền kề là “li”

  • Với Xpath locator: //ul/li
  • Với CSS selector: css=ul > li

5. Child / subchild

Phần tử con hoặc phần tử “cháu” (phần tử con của phần tử con) được biểu thị bằng hai dấu gạch phải “//” trong Xpath, và dấu cách (“ “) trong CSS Selector. Dưới dây là ví dụ về một child/subchild “li” của phần tử cha “ul”

  • Với Xpath locator: //ul//li
  • Với  CSS selector: css=ul li

Các bạn lưu ý tránh nhầm lẫn giữa cách biểu diễn “ul li” và “ul > li” nhé!

6. nth Child:

Để tìm phần tử con thứ nth, theo cú pháp Xpath ta sẽ sử dụng “[n]”, theo CSS chúng ta sẽ biểu thị theo cú pháp “:nth-of-type(n)”. Các bạn tham khảo ví dụ phía dưới nhé:

Ta có phần tử có id =’drinks’ chứa 1 danh sách các loại đồ uống:

  1. Coffee
  2. Tea
  3. Milk
  4. Soup
  5. Soft Drinks

Để lấy ra đồ uống số 5 trong danh sách trên:

  • Theo Xpath: //ul[@id=’drinks’]/li[5]
  • Theo CSS: css=ul#drinks li:nth-of-type(5), cũng có thể sử dụng cú pháp khác là li:nth-child(5).

7. Cha của 1 phần tử – Parent of an element

Cha của một phần tử có thể được biểu diễn thông qua  ký tự “/..” trong Xpath và “:parent” trong CSS. Ví dụ dưới dây nếu bạn muốn tìm cha của danh sách các mục của class ‘blue’ thì:

  1. first
  2. second
  3. third
  4. fourth
  5. fifth
  • Theo Xpath: //li[@class=’blue’]/..
  • Theo CSS: css=li.blue:parent

8. Tìm anh em cùng cha(Next Sibling)

Next Sibling chính là những phần tử anh em cùng cấp với nhau thuộc cùng một phần tử cha nào đó. Tìm phần tử next sibling tức là lấy ra 1 phần tử tiếp theo sau một phần tử cụ thể nào đó khác, điều kiện là nằm trong cùng 1 cha.

Ví dụ bạn muốn chọn ra anh em của phần tử “li” ở vị trí thứ 2 trong danh sách có class “blue”:

  • Trong Xpath: //li[@class=’blue’]/../li[2]
  • Trong CSS selector: css=li.blue + li

Tương tự nếu ban jmuoons lấy phần tử thứ 3 trong danh sách ta có các biểu diễn theo cú pháp lần lượt như sau:

  • In Xpath locator: //li[@class=’blue’]/../li[3]
  • In CSS selector: css=li.blue + li + li

9. Tìm phần tử theo Text tương ứng với Text trong phần tử đó (Innertext)

Ta sẽ sử dụng một phương thức Javascript là methodcontains() để kiểm tra đoạn văn bản “text” bên trong một phần tử web. Ví dụ với một link có text là “Sign in”

  • Theo Xpath locator: //a[contains(text(), ‘Sign in’)] hoặc a//[contains(string(), ‘Sign in’)]
  • Theo CSS selector: css=a:contains(‘Sign in’)

10. Tìm phần tử dựa theo Sub-string tương ứng có trong phần tử đó (Match by Sub-string)

Đây là một cách khá là thú vị nhé! Với cách này ta sẽ kết hợp các chuỗi dựa vào một phần của chuỗi đó. Ví dụ như dựa vào tiền tố (Prefix), hậu tố (suffix) hoặc một dạng mẫu (sub-string) nào đó.

(*) Tìm theo sub-string (bộ mẫu) – Substring (partern)

Ví dụ về 1 phần tử ‘div’ với một ‘id’ và chứa đoạn text là “partern”

  • Với Xpath locator chúng ta sẽ cần sử dụng hàm contains() để kết hợp 1 sub-string:

//div[contains(@id,’pattern’)]

  • Với CSS selector ta sẽ sử dụng “*=” để kết hợp 1 sub-string:

css=div[id*=’pattern’]

(*) Tìm theo tiền tố – prefix

Với ví dụ 1 phần tử ‘div’ với một ‘id’ và đoạn text bắt đầu với đoạn text “prefixString”:

  • Theo Xpath locator ta cần sử dụng từ khóa “starts-with” để tìm prefix tương ứng:

//div[starts-with(@id,”prefixString”)]

  • Theo CSS selector ta sẽ sử dụng “^=”:

Css=div[id^=’prefixSring’]

(*) Tìm theo hậu tố

Tương tự với ví dụ bên trên, tìm phần tử div có id và đoạn text kết thúc là “suffixString”:

  • Theo Xpath locator, chúng ta sẽ sử dụng “ends-with” để tìm hậu tố tương ứng. Lưu ý một chút là method “ends-with()” là một chuẩn chỉ được sử dụng trong Xpath2.0, nó sẽ không chạy với Xpath1.0 (phân biệt hai phiên bản này các bạn tìm GG để rõ hơn nhé).

//div[ends-with(@id,”suffixString”)]

  • Theo CSS selector, ta sẽ cần sử dụng “$=”:

css=div[id$=’suffixString’]

Ta có thể tóm tắt thành một bảng tổng hợp thu gọn như này nha:

Match Substring Match Prefix Match Suffix
Xpath contains() starts-with() ends-with()
CSS *= ^= $=

 

Dịch từ bài gốc tại vananhtooo.wordpress.com

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

Xem thêm tuyển dụng lập trình CSS hấp dẫn trên TopDev

Quy trình phát triển phần mềm – mô hình xoắn ốc (The Boehm’s spiral model)

Quy trình phát triển phần mềm – mô hình xoắn ốc

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Mô hình xoắn ốc (Spiral model) có thể được xem là sự kết hợp giữa mô hình thác nước (Waterfall model) và mô hình mẫu (Prototype model) và đồng thời thêm phân tích rủi ro (Risk assessment).

  19 tips cho các kỹ sư phần mềm hữu ích trong 2024
  7 lãng phí trong kiểm thử phần mềm

Trong mô hình xoắn ốc, quy trình phát triển phần mềm được biểu diễn như một vòng xoắn ốc. Các phase trong quy trình phát triển xoắn ốc bao gồm:

  • Thiết lập mục tiêu: xác định mục tiêu cho từng pha của dự án.
  • Đánh giá và giảm thiểu rủi ro: rủi ro được đánh giá và thực hiện các hành động để giảm thiểu rủi ro.
  • Phát triển và đánh giá: sau khi đánh giá rủi ro, một mô hình xây dựng hệ thống sẽ được lựa chọn từ những mô hình chung.
  • Lập kế hoạch: đánh giá dự án và phase tiếp theo của mô hình xoắn ốc sẽ được lập kế hoạch.

Quy trình phát triển phần mềm – mô hình xoắn ốc (The Boehm’s spiral model)

Mô hình xoắn ốc cải tiến

  • Mô hình xoáy ốc là cải tiến của mô hình tuần tự và mẫu thử, them vào phân tích rủi ro.
  • Là quá trình lặp hướng mở rộng, hoàn thiện dần.
  • Lập kế hoạch: xác lập vấn đề, tài nguyên, thời hạn
  • Phân tích rủi ro: xem xét mạo hiểm, tìm giải pháp
  • Kỹ nghệ: phát triển một phiên bản của phần mềm( chọn mô hình thích hợp)
  • Đánh giá của khách: khách hang đánh giá phiên bản phát triển.

Kết quả đạt được

  • Sau mỗi lần tăng vòng thì có thể chuyển giao kết quả thực hiện được cho khách hành nên các chức năng của hệ thống có thể nhìn thấy sớm hơn.
  • Các vòng trước đóng vai trò là mẫu thử để giúp tìm hiểu thêm các yêu cầu ở những vòng tiếp theo.

Ưu điểm

  • Phân tích rủi ro dự án được đầy lên làm một phần thiết yếu trong quy trình xoắn ốc để tăng độ tin cậy của dự án.
  • Xây dựng dự án có sự kết hợp các mô hình khác vào phát triển (Thác nứơc, mô hình mẫu…)
  • Cho phép thay đổi tuỳ theo yêu cầu cho mỗi vòng xoắn ốc.
  • Nó được xem như là một mô hình tổng hợp của các mô hình khác.
  • Không chỉ áp dụng cho phần mềm mà còn phải cho cả phần cứng.
  • Một rủi ro nào đó không được giải quyết thì chấm dứt dự án.
  • Các vòng tròn được lặp để đáp ưng được những thay đổi của người dùng
  • Kiểm soát rủi ro ở từng giai đoạn phát triển.
  • Đánh giá tri phí chính xác hơn các phương pháp khác

Nhược điểm:

  • Phức tạp và không thích hợp với các dự án nhỏ và ít rủi ro.
  • Cần có kỹ năng tốt về phân tích rủi ro.
  • Yêu cầu thay đổi thường xuyên dẫn đến lặp vô hạn
  • Chưa được dùng rộng dãi như mô hình thác nước hay là mẫu.
  • Đòi hỏi năng lực quản lý

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

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

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

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

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

Trong phần trước thì mình đã cùng các bạn điểm qua 4 web framework là ReactJS, Angular, VueJS và Express rồi.

Ba trong số đó là các font-end framework nổi tiếng hiện nay và Express là một back-end framework cũng được dùng rất nhiều.

  10 Frameworks tốt nhất hiện nay cho PHP
  10 Java Web Framework tốt nhất

Tất cả đều liên quan đến một ngôn ngữ lập trình đó là JavaScript. Nếu bạn nào chưa đọc phần 1 thì các bạn có thể tham khảo tại đây nha: TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Vâng, và trong phần tiếp theo này mình sẽ chia sẻ với các bạn những back-end framework được dựa trên các ngôn ngữ lập trình khác và cũng đang rất “hot” hiện nay.

#5. Laravel

Laravel là một back-end framework ra mắt vào năm 2011, nó được viết dựa trên ngôn ngữ lập trình PHP.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Về cấu trúc Laravel được thiết kế theo mô hình MVC (Model – View – Controller). Laravel cũng là một open source với mục đích giúp cho việc viết code đơn giản, dễ dàng và bảo mật hơn.

Cho bạn nào chưa biết về kiến trúc MVC thì mình chia sẻ luôn vì nhiều framework được xây dựng dựa trên kiến trúc này.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

  • M là Model: Cấu trúc dữ liệu theo cách tin cậy và chuẩn bị dữ liệu theo lệnh của controller (Các lớp thực thể được viết bằng các ngôn ngữ lập trình như PHP, Java, Python…)
  • V là View: Hiển thị dữ liệu cho người dùng theo cách dễ hiểu dựa trên hành động của người dùng (HTML, CSS, JavaScript…)
  • C là Controller: Nhận lệnh từ người dùng, gửi lệnh đến cho Model để cập nhập dữ liệu, truyền lệnh đến View để cập nhập giao diện hiển thị.

Laravel sẽ phù hợp với dự án nào?

Chúng ta có thể sử dụng Laravel cho tất cả các dự án từ nhỏ tới lớn. Nhưng thường là các dựa án liên quan đến các trang thương mại điện tử.

Laravel được đánh giá là một trong những framework được cộng động lập trình viên PHP yêu thích nhất. Các bạn có thể tìm hiểu thêm về Laravel tại đây: https://laravel.com/

#6. Spring Framework

Các bạn lập trình viên Java chắc không còn xa lạ gì với những cái tên như SpringMVC, Spring Boot…

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Có thể nói Spring là một hệ sinh thái chứ không đơn thuần là một framework nữa, vì Spring cung cấp một bộ công cụ để bạn có thể giải quyết vấn đề mà không phải dùng thêm các công cụ khác.

Spring được xây dựng và phát triển dựa trên 2 nguyên tắc chính đó là: Dependency Injection và Aspect Oriented Programming.

Như mình đã nói Spring rất lớn, nó được chia thành nhiều modul khác nhau. Chúng ta có thể sử dụng một trong số các modul đó tùy thuộc vào dự án.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Một số dự án nổi bật của Spring có thể kể đến như:

    • Spring MVC được thiết kế dành cho việc xây dựng các ứng dụng nền tảng web.
    • Spring Security: Cung cấp các cơ chế xác thực (authentication) và phân quyền (authorization) cho ứng dụng của bạn.
  • Spring Boot là một framework giúp chúng ta phát triển cũng như chạy ứng dụng một cách nhanh chóng.
  • Spring Batch giúp chúng ta dễ dàng tạo các lịch trình (scheduling) và tiến trình (processing) cho các công việc xử lý theo mẻ (batch job).
  • Spring Social kết nối ứng dụng của bạn với các API bên thứ ba của Facebook, Twitter, Linkedin … (ví dụ đăng nhập bằng facebook, Google+ …).
  • Các bạn có thể tìm hiểu thêm về Laravel tại đây: https://spring.io/

#7. Django

Chúng ta đã đề cập đến các thư viện, framework liên quan đến JavaScript, Java, PHP và sẽ thật thiếu sót nếu không đề cập đến framework của Python.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Django được viết hoàn toàn dựa trên Python, có đầy đủ các thư viện hỗ trợ việc lập trình trình web.

Django được thiết kế theo mô hình MVC và được phát triển bởi Django Software Foundation đồng thời cũng là một open-source framework.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Đây chính là những tiêu chí mà Django hướng đến. Nếu bạn đã có kiến thức về Python và muốn đi theo hướng lập trình viên web thì Django là một lựa chọn hoàn hảo.

Các bạn có thể tìm hiểu thêm về Laravel tại đây: https://www.djangoproject.com/

#8. ASP.net

Tiếp theo, chúng ta sẽ cùng điểm qua một gương mặt được xây dựng và phát triển bởi Microsoft đó chính là ASP.net

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

ASP.NET trong đó: ASP là Active Server Pages và .NET là Network Enabled Technologies.

Các ứng dụng ASP.Net cũng có thể được viết bằng nhiều ngôn ngữ .Net như C#, VB.Net và J#

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Và đây chính là kiến trúc của công nghệ .NET nói chung và ASP.NET nói riêng.

Hiện nay, ngôn ngữ lập trình C# do Microsoft phát triển cũng đang rất được giới lập trình viên yêu thích. Nếu bạn có kiến thức về C# thì có thể tìm hiểu về các công nghệ .NET để phát triển các ứng dụng web.

Các bạn có thể tìm hiểu thêm về Laravel tại đây: https://dotnet.microsoft.com/apps/aspnet

#9. Ruby on Rails

Trước khi nói về framework Ruby on Rails thì chúng ta phải đề cập đến ngôn ngữ lập trình Ruby trước.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Ruby là ngôn ngữ thông dịch và hướng đối tượng. Ruby cung cấp nhiều mẫu hình lập trình, bao gồm lập trình hàm, hướng đối tượng, mệnh lệnh, phản xạ.

Các bạn có thể tìm hiểu về ngôn ngữ này tại đây: https://www.ruby-lang.org/en/

Quay lại với framework Ruby on Rails của chúng ta là một web framework mã nguồn mở, được thiết kế để phát triển các ứng dụng Ruby và cho phép chúng chạy như một trang web thực sự. Rails là cách gọi tắt của Ruby on Rails.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Các bạn có thể tìm hiểu thêm về Rails tại đây: https://rubyonrails.org/

#10. CakePHP

Cuối cùng mình muốn đề cập đến một framework nữa liên quan đến PHP, nhưng có lẽ nhiều bạn mới học có thể chưa biết đến.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Cũng vì PHP vẫn là một trong những ngôn ngữ khá là phổ biến hiện này. Trên các trang tuyển dụng hoặc các page tuyển dụng bạn sẽ không khó để tìm các vị trí liên quan đến PHP.

Cake PHP cũng được thiết kế theo mô hình MVC giống như đối thử Laravel của nó, có thể kể đến một vài điểm nổi bật của CakePHP như sau:

  • Kiến trúc MVC tiểu chuẩn giúp việc phát triển ứng dụng web dễ dàng
  • Tích hợp các thao tác thêm, sửa, xóa, cập nhật (CRUD) tương tác với cơ sở dữ liệu
  • Xử lý bảo mật an toàn …

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

Các bạn có thể tìm hiểu thêm về Rails tại đây: https://cakephp.org/

Lời Kết

Vậy là qua hai phần của bài viết thì mình đã cùng các bạn điểm mặt 10 web framework tốt nhất hiện nay (từ front-end cho đến back-end) rồi nhé.

Việc sử dụng framework để phát triển các ứng dụng trong thực tế là một yêu cầu gần như bắt buộc vì tính an toàn, tái sử dụng cũng như tốc độ phát triển và triển khai dự án.

Nếu bạn quan tâm đến mảng lập trình thì có thể chuẩn bị cơ bản thật vững ở một ngôn ngữ nào đó rồi học lên sử dụng các framework để hiểu được và biến đổi chúng linh hoạt.

Chúc các bạn học tốt và hẹn gặp lại các bạn trong các bài viết tiếp theo !

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

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

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

Những mẹo hay ho cho các Software Developers

mẹo cho software developer
Những mẹo hay ho cho các Software Developers

Tác giả: Simon Holdorf

Giới thiệu

Bắt đầu một dự án mới, một kế hoạch mới với các Software Developers luôn là việc thú vị và hấp dẫn. Tuy nhiên khi overload cũng là lúc chúng ta cảm thấy mệt mỏi và không thể hoàn thành công việc một cách tốt nhất. Chính vì thế, biết thêm một số mẹo hay ho khi làm việc giúp công việc mỗi ngày của các Software Developers trơn tru hơn.

software developer
Nắm bắt những cách làm việc hợp lí để nâng cao hiệu quả công việc

Những mẹo hay ho cho các Software Developers

Tìm cho mình một cố vấn phù hợp cho bản thân

Một trong những mẹo cho Software Developer hay ho nhất. Đây được xem là điều tốt nhất bạn có thể làm để trở thành một dev giỏi nhất là tìm cho mình một người cố vấn xuất sắc và phù hợp với bản thân. Một người cố vấn giỏi sẽ đưa ra lời khuyên hữu ích về mọi thứ, từ kiến ​​trúc đến thiết kế, và thậm chí cả cách cải thiện con đường sự nghiệp của bạn.

Xem tuyển dụng software developer đãi ngộ tốt trên TopDev

Một người không ở cùng công ty hoặc làm cùng vị trí có thể sẽ là người cố vấn tốt nhất cho bạn. Bạn có thể nói chuyện với họ và nhận lời khuyên của họ qua điện thoại, qua email hoặc chat. Một người cố vấn không nhất thiết phải làm việc tại công ty của bạn cũng như không phải là một dev sành sõi mà đơn giản chỉ là họ có thể giúp bạn đưa ra những ý kiến sáng suốt hơn.

Tìm một người hiểu về Software Developing và đã thành công trong sự nghiệp của họ mà bạn tôn trọng để nhờ sự giúp đỡ khi cần thiết là việc làm hữu ích.

  10 Công cụ Go-To Tech dành riêng cho các Software Developer
  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer

Học cách giao tiếp tốt

Trở thành một lập trình viên giỏi có nghĩa là bạn có thể giao tiếp hiệu quả với users và các dev khác. Trên thực tế, phần lớn những lập trình viên giỏi đều là những người có thể chia sẻ ý tưởng một cách hiệu quả và tốt nhất. Nếu bạn có thể trình bày ý tưởng của mình một cách rõ ràng và ngắn gọn, người khác sẽ muốn lắng nghe những gì bạn nói hơn. Vậy nên đây là mẹo cho Software Developer trở nên chuyên nghiệp hơn.

Nhưng giao tiếp không chỉ là nói chuyện. Đó cũng là việc lắng nghe những gì người khác nói. Các nghiên cứu chỉ ra rằng những người biết lắng nghe tốt sẽ thành công hơn trong sự nghiệp của họ so với những người nói tốt.

Vì vậy, bạn đừng bao giờ đánh giá thấp sức mạnh của một người biết lắng nghe, đặc biệt là khi làm việc với khách hàng hoặc các dev khác trong nhóm của bạn. Học cách lắng nghe có thể là vô giá, đặc biệt nếu bạn đang có kế hoạch làm việc với người khác.

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

Học cách sử dụng Google hiệu quả

Khi tôi bắt đầu làm việc với tư cách là một Software Developers, tôi nhớ rằng các đồng nghiệp của tôi luôn có thể chỉ cho tôi đúng hướng khi giải quyết vấn đề hoặc triển khai các tính năng. Đó là khi tôi bắt đầu sử dụng mọi thứ trên Google, tìm hiểu các công cụ và kỹ thuật mới.

Việc biết cách sử dụng Google hiệu quả không khiến bạn trở thành một lập trình viên mà nó sẽ giúp bạn có hiệu suất cao hơn với công việc mình đang làm. Hãy dành thời gian để tìm hiểu về tất cả các loại công cụ khác nhau để nếu một vấn đề xuất hiện đòi hỏi điều gì đó nằm ngoài phạm vi kinh nghiệm của bạn, bạn có thể nhanh chóng xác định xem nó có đáng để dành thời gian tìm hiểu hay không.

Xem thêm các tin đăng việc làm software developer trên TopDev

Bắt đầu luyện tập coding mỗi ngày

Ngay sau khi bạn đọc xong bài viết này, hãy bắt đầu coding đi nhé! Nghe có vẻ hiển nhiên, nhưng bạn phải bắt đầu viết code mỗi ngày. Đây có thể được xem là giải pháp hiệu quả nhất để bạn có thể làm việc tốt hơn và nâng cao kỹ năng của mình. Coding không chỉ là mẹo cho Software Developer mà là việc bắt buộc để nâng cao tay nghề và chuyên môn của bạn.

Coding mỗi ngày giúp các kỹ năng của bạn luôn nhạy bén, giúp bạn học ngôn ngữ và công nghệ mới, đồng thời cho phép bạn làm việc trên những thứ mà bạn quan tâm. Nếu nó không làm bạn hứng thú, hãy chuyển đổi nó bằng cách thay đổi ngôn ngữ hoặc dự án ít nhất một lần một tháng. Điều này sẽ giúp mọi thứ trở nên thú vị hơn và đảm bảo rằng bạn không bị mắc kẹt trong một cuộc chạy đua trong nhiều tháng liên tục.

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

software developer luyện tập
Software Developer nên có sự luyện tập kỹ càng

Rèn luyện kỹ năng thường xuyên

Điều này có thể nói dễ hơn làm, bởi vì việc tìm kiếm thời gian để thực hiện việc này có thể khá khó khăn trừ khi bạn là người cực kỳ kỷ luật hoặc có nhiều thời gian rảnh rỗi trong tuần. Dù thế nào đi nữa, nếu bạn muốn trở thành một Software Developers tài ba, thực hành sẽ giúp ích rất nhiều vì nó là mẹo cho Software Developer. Cách tốt nhất để làm điều này là có một số mục tiêu cho mỗi tuần tập trung vào việc cải thiện kỹ năng của tôi trong một số thứ mà tôi hiện đang gặp khó khăn. Có hai lợi ích chính cho việc này:

Bạn thấy mình đang tích cực làm việc để trở nên giỏi hơn những gì bạn làm, thay vì chỉ chăm chăm thực hiện những thay đổi nhỏ ở chỗ này và chỗ khác.

Nó cung cấp cho bạn một số mục tiêu và chỉ tiêu cụ thể dễ đo lường. Điều này giúp bạn xem tiến trình của mình và nhanh chóng cho bạn biết loại kỹ năng, công cụ hay công nghệ nào còn thiếu trong hộp công cụ của bạn. Rồi sau này, khi họ trở nên có liên quan trong một dự án trong thế giới thực, họ sẽ không còn xa lạ như mọi thứ xung quanh nữa!

Xem thêm Làm thế nào tôi trở thành một Software Developer tại Twitter?

Đừng ngại mắc lỗi

Không ai đạt được thành công ngay trong lần thử đầu tiên, vì vậy đừng cảm thấy tồi tệ khi bạn đang bị rối tung lên. Những người khác vẫn đang học hỏi! Điều cần thiết là học hỏi từ những sai lầm của bạn để bạn có thể tránh tái phạm trong tương lai và để bạn cũng có thể giúp những người khác học hỏi từ chúng.

Trên thực tế, nếu bạn mắc lỗi và sau đó sửa nó trước khi mọi người nhận ra, bạn đã học được gì? Nếu ai đó chỉ ra rằng có vấn đề với code bạn đã viết hoặc cho bạn biết cách cải thiện một lựa chọn thiết kế cụ thể, hãy cảm ơn họ vì đã phát hiện ra nó. Họ đang giúp đỡ bạn bằng cách chỉ ra điều gì đó cần cải thiện hoặc làm rõ.

  Cách viết CV dành cho Software Developer

Ngay cả khi họ sai về những gì cần sửa chữa, hãy đặt câu hỏi và thảo luận vấn đề với họ để làm rõ lý do tại sao họ nghĩ đó là một vấn đề. Hãy nhớ rằng chỉ vì ai đó không đồng ý với giải pháp của bạn không có nghĩa là nó sai – nó chỉ có nghĩa là họ có nhu cầu hoặc mong đợi khác với bạn.

Bài học kinh nghiệm chính ở đây là: cởi mở và sẵn sàng học hỏi!

Kết luận

Nắm bắt những mẹo và những kỹ năng này sẽ giúp bạn làm việc hiệu quả hơn với vai trò là một Software Developer. Hãy luôn khiêm tốn và sẵn sàng học hỏi để có thể trở thành một lập trình viên giỏi nhất trong lĩnh vực của mình.

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

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

Xem thêm việc làm lập trình hấp dẫn tại TopDev

Xây dựng truy vấn bằng Laravel Query Builder

Xây dựng truy vấn bằng Laravel Query Builder

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

Trong phần trước Làm việc với cơ sở dữ liệu trong Laravel bạn đã bắt đầu làm quen với việc thực hiện các câu truy vấn SQL dạng thô (raw SQL query), một khó khăn trong việc sử dụng các câu truy vấn này là việc truyền giá trị vào câu truy vấn. Các ứng dụng thực tế thường có các câu truy vấn rất phức tạp, nếu sử dụng raw SQL query sẽ rất khó khăn. Để giải quyết vấn đề này, Laravel đưa ra Laravel Query Builder giúp bạn có thể xây dựng bất kỳ câu truy vấn nào dù nó phức tạp đến đâu. Laravel Query Builder sử dụng PDO (PHP Data Object, hệ thống API có sẵn của PHP để kết nối đến các CSDL thông dụng), bản thân API PDO đã bảo vệ bạn trước các tấn công SQL Injection, do đó khi xử dụng Query Builder bạn không cần lo lắng xử lý dữ liệu trước khi chèn vào database.

Truy xuất dữ liệu từ database

Lấy toàn bộ các bản ghi từ một bảng

$users = DB::table('users')->get();

Sử dụng phương thức table() để trả về một instance query builder của một bảng, khi đó muốn lấy tất cả các bản ghi sử dụng phương thức get(). Phương thức get() trả về Illuminate\Support\Collection với mỗi bản ghi là một đối tượng StdClass trong PHP.

Lấy một bản ghi hoặc một cột trong bảng

$user = DB::table('users')->where('name', 'FirebirD')->first();

trả về một bản ghi, còn value() trả về một cột trong bảng

$email = DB::table('users')->where('name', 'FirebirD')->value('email');

Lấy nhiều cột trong bảng

$users = DB::table('users')->pluck('id', 'name');

@foreach ($users as $id => $name)
    {{ $name }} có mã số là {{ $id }}
@endforeach

Lấy giá trị tổng hợp từ kết quả truy vấn

Laravel Query Builder hỗ trợ nhiều các phương thức tổng hợp như sau:

  • min: giá trị nhỏ nhất
  • max: giá trị lớn nhất
  • avg: giá trị trung bình
  • count: tổng số bản ghi
  • sum: lấy tổng một trường nào đó của bảng.
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');

Các phương thức trong query builder

Select

select sử dụng để lựa chọn các cột trong một bảng:

$users = DB::table('users')->select('name', 'email as user_email')->get();

distinct() sử dụng để lọc và trả về các kết quả không bị trùng lặp

$users = DB::table('users')->distinct()->get();

Raw expression

Đôi khi bạn muốn có một thành phần của raw SQL query, có thể sử dụng DB::raw

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();

Mệnh đề where

Các mệnh đề where đơn giản với điều kiện =, >=, <=, <>, like

$users = DB::table('users')->where('votes', '=', 100)->get();
$users = DB::table('users')
                ->where('name', 'like', '%Kiên%')
                ->get();

Thậm chí có thể truyền một mảng điều kiện vào mệnh đề where

$users = DB::table('users')->where([
    ['active', '=', '1'],
    ['vote', '>', '50'],
    ['name', 'like', '%Kiên%'],
])->get();

Điều kiện trong một câu truy vấn có thể rất phức tạp khi kết hợp các mệnh đề where khác như: orWhere, whereBetween, whereNotBetween, whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, whereYear, whereColumn, whereExist. Các ví dụ cho từng kiểu mệnh đề where như sau:

// Ví dụ về orWhere
$users = DB::table('users')
                    ->where('vote', '>', 50)
                    ->orWhere('comment', '>', 50)
                    ->get();
// Ví dụ về whereBetween
$users = DB::table('users')
                    ->whereBetween('age', [18, 35])->get();
// Ví dụ về whereIn
$users = DB::table('users')
                    ->whereIn('id', [1, 2, 3])
                    ->get();
// Ví dụ về whereNull
$users = DB::table('users')
                    ->whereNull('vote')
                    ->get();
// Ví dụ về whereDate
$users = DB::table('users')
                ->whereDate('join_date', '2017-03-27')
                ->get();
//Ví dụ về whereDay
$users = DB::table('users')
                ->whereDay('join_date', '27')
                ->get();
// Ví dụ về whereMonth
$users = DB::table('users')
                ->whereMonth('join_date', '03')
                ->get();
//Ví dụ về whereYear
$users = DB::table('users')
                ->whereYear('join_date', '2017')
                ->get();
//Ví dụ về whereColumn
$users = DB::table('account')
                ->whereColumn([
                    ['working_balance', '=', 'last_balance'],
                    ['updated_at', '>', 'created_at']
                ])->get();
// Ví dụ về whereExist
DB::table('users')
            ->whereExists(function ($query) {
                $query->select(DB::raw(1))
                      ->from('orders')
                      ->whereRaw('orders.user_id = users.id');
            })
            ->get();
// Ví dụ nhóm các điều kiện trong mệnh đề điều kiện
DB::table('users')
            ->where('name', '=', 'FirebirD')
            ->orWhere(function ($query) {
                $query->where('vote', '>', 50)
                      ->where('role', '<>', 'superadmin');
            })
            ->get();

Thao tác với kết quả trả về

Sắp xếp kết quả trả về của truy vấn bằng phương thức orderBy()

$users = DB::table('users')
                ->orderBy('vote', 'desc')
                ->get();

Lấy ngẫu nhiên một bản ghi

$randomUser = DB::table('users')
                ->inRandomOrder()
                ->first();

GroupBy và having:

$users = DB::table('users')
                ->groupBy('account_id')
                ->having('account_id', '>', 100)
                ->get();
Insert một hoặc nhiều bản ghi vào CSDL
// Insert một bản ghi
DB::table('users')->insert(
    ['name' => 'Nguyễn Văn A', 'email' => 'anv@gmail.com', 'votes' => 0]
);
// Insert nhiều bản ghi
DB::table('users')->insert([
    ['name' => 'Nguyễn Văn A', 'email' => 'anv@gmail.com', 'votes' => 0],
    ['name' => 'Nguyễn Văn B', 'email' => 'bnv@gmail.com', 'votes' => 0],
    ['name' => 'Nguyễn Văn C', 'email' => 'cnv@gmail.com', 'votes' => 0],
    ['name' => 'Nguyễn Văn D', 'email' => 'dnv@gmail.com', 'votes' => 0],
]);

Có những trường hợp khi insert vào CSDL bạn cần lấy lại ID bản ghi để làm tham số cho các thao tác tiếp theo, sử dụng insertGetId

$user_id = DB::table('users')->insertGetId(
    ['name' => 'Nguyễn Văn A', 'email' => 'anv@gmail.com', 'votes' => 0]
);
echo 'User vừa đăng ký có id là' . $user_id;
Update dữ liệu trong CSDL

Sử dụng phương thức update(), ví dụ:

DB::table('users')
            ->whereYear('join_date', '2017')
            ->orWhere('vote', '>', 50)
            ->update(['generate_promote_code' => 1]);
Delete dữ liệu trong CSDL
DB::table('users')
              ->where('active', '=', 0)
              ->whereYear('join_date', '2015')
              ->delete();

Để xóa toàn bộ các bản ghi trong một bảng và thiết lập ID sinh tự động về 0 sử dụng lệnh truncate()

DB::table('users')->truncate();
  Các Laravel route tips giúp bạn cải thiện routing

Ví dụ sử dụng Laravel Query Builder

Xây dựng một số trang phục vụ các việc sau nhập thông tin sản phẩm, quản lý danh sách sản phẩm: xóa sản phẩm, sửa sản phẩm… Chúng ta cùng bắt đầu thực hiện nào!

Bước 1: Tạo bảng products trong database laravel-test đã tạo trong bài Làm việc với cơ sở dữ liệu trong Laravel.

Xây dựng truy vấn bằng Laravel Query Builder

Bước 2: Tạo một controller tên là ProductController, sử dụng Restful Resource Controller.

c:\xampp\htdocs\laravel-test>php artisan make:controller ProductController --res
ource
Controller created successfully.

Bước 3: Thêm resource route vào routes/web.php

Route::resource('product', 'ProductController', ['only' => [
    'create', 'store', 'edit'
]]);

Bước 4: Xử lý từng hành động trên sản phẩm Bảng route tương ứng cho từng hành động như sau:

Verb URI Action Route Name
GET /product index product.index
GET /product/create create product.create
POST /product store product.store
GET /product/{product_id} show product.show
GET /product/{product_id}/edit edit product.edit
PUT/PATCH /product/{product_id} update product.update
DELETE /product/{product_id} destroy product.destroy

Tạo mới sản phẩm:

Tạo view create.blade.php trong resources/views/fontend/product

@extends('layouts.default')

@section('title', 'Tạo sản phẩm')

@section('content')
    @if(isset($success))
    <div class="alert alert-success" role="alert">{{ $success }}</div>
    @endif
    @if(isset($fail))
    <div class="alert alert-danger" role="alert">{{ $fail }}</div>
    @endif

    {!! Form::open(array('url' => '/product', 'class' => 'form-horizontal')) !!}
      <div class="form-group">
         {!! Form::label('name', 'Tên sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-9">
            {!! Form::text('name', '', array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('price', 'Giá sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-3">
            {!! Form::text('price', '', array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('content', 'Nội dung sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-9">
            {!! Form::textarea('content', '', array('class' => 'form-control', 'rows' => 3)) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('image_path', 'Ảnh sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-9">
            {!! Form::text('content', '', array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('active', 'Active', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-3">
            {!! Form::checkbox('active', '', true) !!}
         </div>
      </div>  

      <div class="form-group">
         <div class="col-sm-offset-2 col-sm-10">
            {!! Form::submit('Tạo sản phẩm', array('class' => 'btn btn-success')) !!}
         </div>
      </div>
   {!! Form::close() !!}
@endsection

Thêm nội dung phương thức create trong ProductController

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    return view('fontend.product.create');
}

Tiếp đến chúng ta xử lý insert sản phẩm vào CSDL, nó sẽ nằm trong phương thức store của ProductController (xem bảng các route của product)

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name'       => 'required|max:255',
        'price'      => 'required|number',
        'content'    => 'required',
        'image_path' => 'required'
    ]);

    if ($validator->fails()) {
        return redirect('product/create')
                ->withErrors($validator)
                ->withInput();
    } else {
        // Lưu thông tin vào database, phần này sẽ giới thiệu ở bài về database
        $active = $request->has('active')? 1 : 0;
        $product_id = DB::table('product')->insertGetId(
            'name'       => $request->input('name'),
            'price'      => $request->input('price'),
            'content'    => $request->input('content'),
            'image_path' => $request->input('image_path'),
            'active'     => $active
            );
        return redirect('product/create')
                ->with('message', 'Sản phẩm được tạo thành công với ID: ' . $product_id);
    }
}

Để nhập sản phẩm ta vào đường dẫn http://laravel.dev/product/create

Xây dựng truy vấn bằng Laravel Query Builder

Danh sách sản phẩm:

Danh sách sản phẩm sẽ được xử lý trong phương thức index của ProductController, chúng ta thêm nội dung cho phương thức này như sau:

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    $products = DB::table('products')->get();
    return view('fontend.product.list')->with($products);
}

Tiếp đến chúng ta tạo một view để hiển thị danh sách sản phẩm tên là list.blade.php nằm trong thư mục resources/views/fontend/product

@extends('layouts.default')

@section('title', 'Danh sách sản phẩm')

@section('content')
    <table class="table table-bordered">
        <tr class="success">
            <th>ID</th>
            <th>Tên sản phẩm</th>
            <th>Giá sản phẩm</th>
            <th>Nội dung</th>
            <th>Ảnh sản phẩm</th>
            <th>Đăng bán</th>
            <th>Action</th>
        </tr>
        @foreach($products as $p)
        <tr>
            <td>{{ $p->id }}</td>
            <td>{{ $p->name }}</td>
            <td class="text-right">{{ number_format($p->price) }}</td>
            <td>{{ $p->content }}</td>
            <td>
                <img src="{{ Asset($p->image_path) }}" alt="{{ $p->name }}" width="120" height="120">
            </td>
            <td>
                @if($p->active)
                    <span class="text-success glyphicon glyphicon-ok"></span>
                @else
                    <span class="text-danger glyphicon glyphicon-remove"></span>
                @endif
            </td>
            <td>
                <a href="{{ '/product/' . $p->id . '/edit'}}"><span class="glyphicon glyphicon-pencil">Edit</span></a>
                <a href="{{ '/product/' . $p->id }}"><span class="glyphicon glyphicon-trash">Delete</span></a>
            </td>
        </tr>
        @endforeach
    </table>
@endsection

Kết quả khi chạy http://laravel.dev/product ta có danh sách các sản phẩm

Xây dựng truy vấn bằng Laravel Query Builder

Chỉnh sửa sản phẩm

Chúng ta sử dụng phương thức edit() trong ProductController để chỉnh sửa sản phẩm, nội dung phương thức này như sau:

 /**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
    $product = DB::table('products')->find($id);
    return view('fontend.product.edit')->with(compact('product'));
}

Tạo một view để chỉnh sửa sản phẩm resources/views/fontend/product/edit.blade.php với nội dung như sau:

@extends('layouts.default')

@section('title', 'Chỉnh sửa sản phẩm')

@section('content')
    @if(isset($success))
    <div class="alert alert-success" role="alert">{{ $success }}</div>
    @endif
    @if (count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    {!! Form::open(array('url' => '/product/' . $product->id, 'class' => 'form-horizontal', 'method' => 'put')) !!}
      <div class="form-group">
         {!! Form::label('name', 'Tên sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-9">
            {!! Form::text('name', $product->name, array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('price', 'Giá sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-3">
            {!! Form::text('price', $product->price, array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('content', 'Nội dung sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-9">
            {!! Form::textarea('content', $product->content, array('class' => 'form-control', 'rows' => 3)) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('image_path', 'Ảnh sản phẩm', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-9">
            {!! Form::text('image_path', $product->image_path, array('class' => 'form-control')) !!}
         </div>
      </div>

      <div class="form-group">
         {!! Form::label('active', 'Active', array('class' => 'col-sm-3 control-label')) !!}
         <div class="col-sm-3">
            {!! Form::checkbox('active', $product->active, true) !!}
         </div>
      </div>  

      <div class="form-group">
         <div class="col-sm-offset-2 col-sm-10">
            {!! Form::submit('Chỉnh sửa sản phẩm', array('class' => 'btn btn-success')) !!}
         </div>
      </div>
   {!! Form::close() !!}
@endsection

Phương thức update() của ProductController đảm nhận phần cập nhật nội dung sản phẩm, thêm code vào phương thức này như sau:

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
    $active = $request->has('active')? 1 : 0;
    $updated = DB::table('products')
        ->where('id', '=', $id)
        ->update([
            'name'       => $request->input('name'),
            'price'      => $request->input('price'),
            'content'    => $request->input('content'),
            'image_path' => $request->input('image_path'),
            'active'     => $active,
            'updated_at' => \Carbon\Carbon::now()
            ]);
    return Redirect::back()
        ->with('message', 'Cập nhật sản phẩm thành công')
        ->withInput(); 
}

OK, giờ chúng ta click vào Edit sản phẩm bất kỳ trong danh sách sản phẩm nó sẽ xuất hiện cửa sổ chỉnh sửa sản phẩm

Xây dựng truy vấn bằng Laravel Query Builder

Thay đổi thông tin và click Chỉnh sửa sản phẩm, sau đó vào lại trang danh sách sản phẩm http://laravel.dev/product chúng ta sẽ thấy nội dung đã thay đổi. Xóa một sản phẩm Thông thường các sản phẩm khi đã nhập vào hệ thống chúng ta sẽ không xóa đi mà chỉ cần không active nó lên là ok, do vậy phần này mình bỏ qua nhé, với lại cũng hơi lười tí.

  Cơ cấu xử lý request trong Laravel như thế nào?

Lời kết

Laravel Query Builder giúp chúng ta xây dựng ứng dụng thật nhanh chóng cho dù các câu truy vấn có phức tạp đến đâu chúng ta cũng xử lý rất dễ dàng. Trong ví dụ phần ảnh sản phẩm tôi tạm thời để theo kiểu copy bằng tay đường dẫn ảnh sản phẩm. Trong thời gian tới, khi nào rảnh tôi sẽ hướng dẫn bạn tích hợp CKEditor và CKFinder vào hệ thống giúp đưa vào nội dung phong phú vào và quản lý lựa chọn tài nguyên như ảnh, file dễ dàng hơn.

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

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

Xem thêm tuyển dụng laravel developer hấp dẫn trên TopDev

Concourse là gì?

Concourse là gì?

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Concourse là mã nguồn mở về CI/CD.

Vì đây là mã nguồn mở nên người phát triển có thể custom về bộ core CI/CD theo ý muốn. Và Concourse được xây dựng trên cơ chế đơn giản về resourcestasks và jobs. Việc sử dụng Concourse là một cách tiếp cận về  CI/CD tuyệt vời.

  Lập trình Concurrent cùng Semaphore
  Đồng thời (Concurrency) và song song (Parallelism) khác nhau như thế nào?

Configuration như Code

resources:
- name: booklit
  type: git
  source: {uri: "https://github.com/vito/booklit"}

jobs:
- name: unit
  plan:
  - get: booklit
    trigger: true
  - task: test
    file: booklit/ci/test.yml

Bạn có thể hiểu  pipeline như một Makefile phân tán, cấp cao hơn, chạy liên tục.

Mỗi mục trong resource là một phụ thuộc và mỗi mục trong các job mô tả một plan để chạy khi công việc được kích hoạt (bằng tay hoặc bằng một step có được).

Việc làm có thể phụ thuộc vào các nguồn lực đã passed các công việc trước đó. Chuỗi kết quả của công việc và tài nguyên là một biểu đồ phụ thuộc liên tục thúc đẩy dự án của bạn tiến lên, từ source code đến production.

HIển thị hoạt động

Concourse là gì?

Cấu hình pipeline của bạn sau đó được hiển thị trong giao diện người dùng web, chỉ cần một cú nhấp chuột để nhận được từ hộp màu đỏ (thất bại) để xem tại sao nó thất bại.

Hiển thị hoạt động cũng cung cấp một vòng phản hồi “gut check” – nếu nó có vẻ sai, có lẽ nó đã sai.

Kiểm soát mã nguồn CI

$ fly -t ci set-pipeline -p booklit -c pipeline.yml
$ vim pipeline.yml
$ fly -t ci set-pipeline -p booklit -c pipeline.yml
$ git add pipeline.yml
$ git commit -m "initial pipeline"

Tất cả quản trị được thực hiện bằng cách sử dụng Fly CLI. Lệnh fly set-pipeline đẩy cấu hình lên tới Concourse. Khi nó trông ổn, bạn có thể kiểm tra file để kiểm soát nguồn. Điều này giúp dễ dàng khôi phục nếu máy chủ Concourse của bạn bị down.

Reproducible, Debuggable Builds

$ fly -t ci intercept -j booklit/unit -s unit
root@2c15ff11:/tmp/build/0df9eea0# ps
    PID TTY          TIME CMD
    171 pts/1    00:00:00 bash
   1876 pts/1    00:00:00 ps
root@2c15ff11:/tmp/build/0df9eea0# ls
depspath  gopath
root@2c15ff11:/tmp/build/0df9eea0# █

Tất cả mọi thứ chạy trong container, đảm bảo một môi trường sạch sẽ trên mỗi lần chạy. Mỗi task chỉ định image riêng của nó, cho nó toàn quyền kiểm soát các dependencies, thay vì quản lý chúng trên các workers.

fly intercept sẽ đưa bạn vào một trong các build của các containers, có thể hữu ích cho việc debugging.

Lặp lại cục bộ nhanh chóng

~/booklit $ fly -t ci execute -c ci/test.yml
executing build 1 at http://localhost:8080/builds/1
initializing
booklit: 4.74 MiB/s 0s
running gopath/src/github.com/vito/booklit/ci/test
fetching dependencies...
installing ginkgo...
running tests...
█

The fly execute command executes a task as a one-off build, with your local changes. This will run your code in exactly the same way it would run in your pipeline, without you having to repeatedly push broken commits until it works. Achieve the fabled green build #1!

When a job fails, you can also use fly execute with -jflag to run with the same inputs as the failed job. You can then replace an input with your local changes with -i to test if your fix is valid.

Lệnh fly execute thực thi một task như một bản dựng một lần, với các thay đổi cục bộ của bạn. Điều này sẽ chạy code của bạn theo cách chính xác giống như cách nó sẽ chạy trong pipeline của bạn, mà bạn không phải liên tục đẩy các commit bị hỏng cho đến khi nó hoạt động. Đạt được huyền thoại build màu xanh #1!

Khi một job thất bại, bạn cũng có thể sử dụng fly execute với cờ-j để chạy với cùng các inputs như failed job. Bạn có thể thay thế một input bằng các thay đổi local của bạn bằng -i để kiểm tra xem bản sửa lỗi của bạn có hợp lệ không.

Mang lại tích hợp của riêng bạn

resource_types:
- name: slack
  type: docker-image
  source:
    repository: quay.io/ahelal/bender
    tag: latest

resources:
- name: slack-deploy
  type: slack
  source:
    slack_token: ((slack_token))
    channel: "admin"
    grammar: "dang! deploy it now!"

jobs:
- name: prod-deploy
  plan:
  - get: slack-deploy
    trigger: true
  - # ...

Concourse không có một hệ thống plugin phức tạp. Thay vào đó, nó có một sự trừu tượng mạnh mẽ duy nhất.

Phần resources của một pipeline liệt kê các Resources , là các vị trí bên ngoài trừu tượng nơi pipeline của bạn sẽ theo dõi các thay đổi, tìm nạp từng chút từ và đẩy từng chút đến.

Ví dụ, một resource với kiểu git tham chiếu đến git repository, resource này sẽ được clone trong một get step và push đến trong put step. Đằng sau hậu trường, Concourse sẽ liên tục run git fetch để tìm kiếm các commit mới mà các jobs có thể muốn trigger.

Về cốt lõi, Concourse không biết gì về Git. Nó đi kèm với một loại resource git ra khỏi hộp, nhưng bạn có thể dễ dàng đưa chính bạn vào pipeline của bạn. Các loại resource được triển khai dưới dạng image chứa các scripts – sử dụng docker-image, chúng có thể được tìm nạp từ Docker registry.

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

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

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