Home Blog Page 45

Top 5 câu hỏi phỏng vấn Devops Engineer thường gặp và cách trả lời

Top 5 câu hỏi phỏng vấn Devops Engineer hay nhất và cách trả lời

Những kỹ năng và tố chất nào cần có khi tham dự hoặc ứng tuyển phỏng vấn Devops Engineer? Với vai trò là Senior Devops Engineer, bạn chịu trách nhiệm phát triển và quản lý cơ sở hạ tầng công nghệ của công ty.

Điều này bao gồm giám sát, triển khai các hệ thống phần mềm, đảm bảo tính ổn định của hệ thống, khả năng vận hành. Ngoài ra bạn còn phải đáp ứng tính bảo mật cho toàn hệ thống. Giám sát và nâng cao hiệu quả sử dụng của hệ thống.

Bài viết này liệt kê 5 câu hỏi phỏng vấn, ở phần đầu tiên các câu hỏi chủ yếu liên quan tới kĩ thuật và các khái niệm liên quan tới vị trí Devops Engineer. Tuy nhiên, để trở thành Senior Devops Engineer và ứng tuyển thành công, bạn cũng cần rèn luyện các kỹ năng khác. Cụ thể như kỹ năng giao tiếp, giải quyết vấn đề, xử lý sự cố và làm việc nhóm.

Phỏng vấn devops engineer Không có Devops Engineer như anh món ăn các chú liệu có ngon được không?. LOL

Bắt đầu ngay và luôn cho nóng.

1. Virtual Private Cloud (VNet) là gì?

Câu hỏi đầu tiên phỏng vấn Devops Engineer liên quan tới khái niệm. Cụ thể ở đây là Virtual Private Cloud (VNet). Cái này hẳn là anh em nào đã từng làm hoặc từng tìm hiểu về vị trí Devops Engineer đã nghe tới. Vậy VPC là gì?

Các nhà cung cấp dịch vụ Cloud như AWS, Google Cloud, Azure cho phép Devops Engineer kiểm soát chi tiết trên mạng máy tính bao gồm các thành phần và tài nguyên. Trong Azure, họ dùng khái niệm VNet, với Google Cloud Enginer và AWS lại gọi là VPC.

1.1 Amazon

With Amazon Virtual Private Cloud (Amazon VPC), you can launch AWS resources in a logically isolated virtual network that you’ve defined. This virtual network closely resembles a traditional network that you’d operate in your own data center, with the benefits of using the scalable infrastructure of AWS. Amazon VPC cho phép khởi chạy các tài nguyên AWS trong một mảng ảo độc lập được bạn định nghĩa trước đó. Mạng ảo này gần giống với mạng truyền thống sử dụng để vận hành cơ sở dữ liệu, nhưng với lợi thế riêng là có thể mở rộng theo kiến trúc của AWS

1.2 Google Cloud

Phía Google Cloud lại định nghĩa VPC rõ ràng hơn như sau:

You can think of a VPC network the same way you’d think of a physical network, except that it is virtualized within Google Cloud. A VPC network is a global resource that consists of a list of regional virtual subnetworks (subnets) in data centers, all connected by a global wide area network. VPC networks are logically isolated from each other in Google Cloud. Bạn có thể tưởng tượng rằng VPC network giống với mạng vật lý thông thường, ngoại trừ mạng này được ảo hoá trong Google Cloud. Mạng VPC là tài nguyên toàn cầu bao gồm danh sách các mạng con ảo trong khu vực. Tất cả được cái nối bởi một mạng rộng cấp độ toàn cầu. Các bạn VPC độc lập lẫn nhau trong Google Cloud.

Phỏng vấn devops engineer

Một số câu hỏi anh em có thể chuẩn bị thêm:

  • Anh em xây dựng Hybrid Cloud như thế nào?
  • Làm cách nào để hạn chế giao tiếp giữa các Kubernetes Pods?
  DevOps là gì? Cần học gì để trở thành DevOps

2. CNI là gì? Làm sao sử dụng CNI trong Kubernetes

Câu hỏi thứ hai phỏng vấn Devops Engineer vẫn liên quan tới khái niệm. Cụ thể ở đây là CNI (Container Network Interface).

The Container Network Interface (CNI) is an API specification that is focused around the creation and connection of container workloads. CNI là đặc tả API tập trung chính vào tạo và kết nối workloads của 2 hoặc nhiều container.

CNI có hai lệnh chính là add (thêm) và delete (xoá). Cấu hình này được chuyển vào dưới dạng dữ liệu JSON. Khi plugin CNI được thêm vào, một cặp thiết bị ảo (virtual device pair) sẽ được tạo và kết nối giữa các Pod và Host. Sau đó, khi IP và routes đã được thiết lập, thông tin sẽ trả về máy chủ API Kubernetes.

Phỏng vấn devops engineer

Ở các phiển CNI sau này, một tính năng quan trọng được thêm vào, đó là khả năng kết nối giữa các CNI plugins.

$ mkdir -p /etc/cni/net.d
$ cat >/etc/cni/net.d/10-mynet.conf <<EOF
{
	"cniVersion": "0.2.0",
	"name": "mynet",
	"type": "bridge",
	"bridge": "cni0",
	"isGateway": true,
	"ipMasq": true,
	"ipam": {
		"type": "host-local",
		"subnet": "10.22.0.0/16",
		"routes": [
			{ "dst": "0.0.0.0/0" }
		]
	}
}
EOF
$ cat >/etc/cni/net.d/99-loopback.conf <<EOF
{
	"cniVersion": "0.2.0",
	"name": "lo",
	"type": "loopback"
}
EOF

Một số câu hỏi khác anh em cũng có thể chuẩn bị:

  • Container giao tiếp với nhau như thế nào trong Kubernetes?
  • Giải thích về IaC và Configuration Management

  8 Bước Trong Lộ Trình Trở Thành DevOps Engineer

3. CI và CD khác nhau như thế nào?

Câu hỏi thứ 3 phỏng vấn Devops Engineer tưởng dễ với nhiều anh em. Nhưng để nêu được tất cả sự khác nhau giữa CI và CD đòi hỏi anh em cần tổng hợp lại kiến thức. Kinh nghiệm làm việc thực tế cũng có thể đem vào để trả lời những câu hỏi như thế này.

Đầu tiên là CI

CI stands for “continuous integration” and CD is “continuous delivery” or “continuous deployment.” CI là viết tắt của “tích hợp liên tục” và CD là “phân phối liên tục” hoặc là “triển khai liên tục”.

3.1 Continuous integration

CI là một quy trình được phát triển nhằm tự động hoá việc phát triển và xây dựng phần mềm. Với CI, các development team có thể merge source liên tục hằng ngày, kiểm thử và kiểm tra các tính năng trước khi đem tới cho end user.

Mục tiêu chính của CI là cung cấp giải pháp nhất quán, cho phép kiểm thử, triển khai liên tục. Cứ đẩy code lên là CI hoạt động. Đối với CI, ở một số giai đoạn từ development qua tới production vẫn có thể có tác động của con người. Một số công đoạn cần phải được duyệt hoặc được kiểm tra bằng tay.

3.2 Continuous deployment

CD – Continuous deployment goes one step further than continuous delivery. With this practice, every change that passes all stages of your production pipeline is released to your customers. There’s no human intervention, and only a failed test will prevent a new change to be deployed to production. CD (triển khai liên tục) là một bước tiến hơn của CD (phân phối liên tục) . Với phương pháp này, mọi thay đổi vượt qua các bước (stages) trong production pipeline sẽ trực tiếp đưa tới khách hàng cuối (end user hoặc customer). Không có sự can thiệp nào của con người và chỉ 1 test fail thôi cũng sẽ dừng việc triển khai lên môi trường production.

Phỏng vấn devops engineer

Một số câu hỏi anh em có thể chuẩn bị thêm:

  • Bạn biết những deployment pattern nào?

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

4. Centralized logging solution là gì?

Câu hỏi thứ 4 phỏng vấn Devops Engineer liên quan tới logging, thứ thường xuyên được sử dụng với Devops Engineer.

Logging solutions sử dụng để theo dõi tình trạng (health) của hệ thống. Các event (sự kiện), chỉ số (metrics) sẽ được ghi lại cụ thể. Với các tình trạng bất ổn hoặc bất thường của hệ thống. Từ những dữ liệu đã có sẵn, ghi lại thông qua hệ thống cảnh bảo.

Quay trở lại với Centralized logging (log tập trung). Thông thường các giải pháp open source logging như Elasticsearch-Kibana-Logstash (EKL) sử dụng cơ chế stack để lưu trữ log. Thông thường bao gồm 3 phần:

  • Storage component (Elasticsearch) – Thành phần lưu trữ
  • Log hoặc metric (số liệu), thường là Logstash hoặc Fluentd. Phần này chịu trách nhiệm cập nhật một lượng lớn dữ liệu. Thêm xoá sửa hoặc lưu trữ metadata.
  • Trực quan hoá (visualization) là giải pháp trực quan hoá số liệu hoặc thông tin đã được lưu trữ. Cung cấp cái nhìn trực quan, trực tiếp với các số liệu đã có. Dễ dàng cho người quản lý, bảo hành và bảo trì hệ thống.

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

Devops Engineer

5. Bạn thành thạo những ngôn ngữ lập trình nào?

Câu hỏi cuối cùng phỏng vấn Devops Engineer tuy không liên quan tới các khái niệm thường hay sử dụng nhưng lại là câu hỏi thường được hay hỏi.

Bản thân là Devops Engineer điều cần thiết là anh em phải biết và thành thạo ít nhất là một ngôn ngữ lập trình. Có các kiến thức nền về ngôn ngữ lập trình giúp anh em dễ dàng tìm ra lỗi. Ngoài ra việc tuỳ biến cũng trở nên dễ dàng hơn.

Đơn cử như Jenkins sử dụng core nền là Java. Python hay PowerShell cũng là ngôn ngữ anh em có thể cân nhắc học. Việc nắm bắt kiến thức nền về ngôn ngữ lập trình cũng giúp cho anh em học và triển khai các ứng dụng dễ dàng hơn. Bản thân CI, CD không khó, nhưng tuỳ vào từng ngôn ngữ, cách thức build source hay cách thức triển khai của từng loại ngôn ngữ sẽ có điểm khác nhau. Chính vì vậy, giỏi hoặc hiểu biết về ngôn ngữ lập trình nào anh em cứ thoải mái show ra.

Devops Engineer

Một số câu hỏi anh em có thể chuẩn bị:

  • Bạn giao tiếp với các thành viên khác trong development team như thế nào?
  • Bạn có kinh nghiệm làm việc với large code base không?
  • Bạn có kinh nghiệm làm việc với automation deployment tools nào?

6. Tham khảo thêm phỏng vấn Devops Engineer

Nếu băn khoăn về lộ trình trở thành Devops Engineer, anh em có thể tham khảo thêm

Chúc anh em phỏng vấn devops engineer thành công tốt đẹp.

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

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

Xem thêm: 

Xem thêm việc làm IT tại TopDev!

Tổng hợp câu hỏi phỏng vấn vị trí IT HelpDesk và cách trả lời

Tổng hợp câu hỏi phỏng vấn IT HelpDesk và cách trả lời hay nhất

IT HelpDesk là một bộ phận trong tổ chức có nhiệm vụ hỗ trợ, tư vấn, cài đặt,… các phần mềm kỹ thuật, setup các thiết bị phần cứng như máy tính, máy in,… đảm bảo quá trình hoạt động của hệ thống được hiệu quả. Với vai trò quan trọng như vậy, các tổ chức, công ty luôn yêu cầu cao cùng chế độ đãi ngộ tốt dành cho các ứng viên IT HelpDesk. Bài viết hôm nay chúng ta cùng nhau điểm qua những câu hỏi phỏng vấn vị trí IT HelpDesk thường gặp nhé.

BIOS là gì? UEFI khác gì BIOS

BIOS là gì?

BIOS – Basic Input/Output System là hệ thống thông tin đầu vào/đầu ra cơ bản; nó là một nhóm lệnh được lưu trữ trên một chip firmware nằm trên bo mạch chủ (mainboard) của máy tính.

Chức năng của BIOS là kiểm soát các tính năng cơ bản của máy tính như kết nối và chạy driver cho các thiết bị ngoại vi, đọc trật tự ổ cứng để khởi động các hệ điều hành, hiển thị tín hiệu màn hình,… Khi máy tính được khởi động, BIOS sẽ “đánh thức” từng linh kiện và kiểm tra xem linh kiện có hoạt động hay không. 

UEFI là Unified Extensible Firmware Interface – giao diện firmware mở rộng hợp nhất. UEFI được xem là sự thay thế với BIOS trên hầu hết các máy tính hiện nay. Bản chất UEFI là một hệ điều hành tối giản được lưu trữ trong thư mục /EFI/ của bộ nhớ non-volatile (đảm bảo dữ liệu không bị mất, hỏng khi mất điện). UEFI có trợ giúp sử dụng chuột, các đồ họa như biểu đồ nhiều màu sắc và không bị hạn chế về bộ nhớ, số lượng phân vùng,… như BIOS truyền thống.

Hãy nói về sự khác biệt giữa RAM và ROM

ROM viết tắt của Read Only Memory – bộ nhớ chỉ đọc là loại bộ nhớ không khả biến dùng trong các máy tính hay hệ thống điều khiển mà trong vận hành bình thường của hệ thống thì dữ liệu chỉ được đọc ra mà không được phép ghi vào. ROM trong máy tính chứa dữ liệu chương trình giúp máy tính khởi động được ghi từ trước và được giữ lại keercar khi máy tính tắt nguồn.

RAM viết tắt của Random Access Memory – bộ nhớ truy cập ngẫu nhiên là loại bộ nhớ tạm thời, cho phép lưu trữ và truy xuất dữ liệu trong thời gian ngắn. Không giống như ROM, khi máy tính bị tắt thì toàn bộ dữ liệu chứa trong bộ nhớ RAM sẽ mất. RAM có tốc độ đọc ghi dữ liệu nhanh hơn nhiều lần so với ROM, dung lượng của RAM cũng thường tính theo đơn vị Gigabyte (GB) còn ROM chỉ thường chứa vài Megabyte (MB) dữ liệu. 

  Mô Tả Công Việc IT HelpDesk & Những Điều Cần Biết Với Vị Trí Này

Phân biệt định dạng FAT32 và NTFS

FAT32 và NTFS

FAT32 và NTFS là 2 định dạng ổ cứng phổ biến hiện nay chủ yếu trên các thiết bị chạy hệ điều hành Windows. FAT32 có mặt từ phiên bản Window95 sử dụng không gian địa chỉ 32bit hỗ trợ kích thước phân vùng tối đa là 2TB. NTFS viết tắt của New Technology File System là hệ thống file tiên tiến hơn rất nhiều so với FAT32. Không gian địa chỉ trong NTFS là 64bit, khắc phục được những hạn chế về số lượng cluster độc lập với dung lượng đĩa cứng. Ngoài ra định dạng NTFS có khả năng chịu lỗi, hỗ trợ bảo mật, phân quyền và mã hóa tập tin tốt hơn nhiều so với FAT32. Mặc dù vậy thì định dạng FAT32 vẫn thường được sử dụng nhờ khả năng tương thích với nhiều phần cứng, thiết bị ngoại vi khác chưa hỗ trợ NTFS.

Từ năm 2006, một bản cải tiến của FAT32 là exFAT được ra mắt, tương thích với nhiều hệ điều hành khác nhau từ Windows, MacOS và hạn chế được nhiều lỗi so với định dạng FAT32 cũ.

Blue Screen of Death (BSOD) là gì? Phương án xử lý lỗi này

Blue Screen of Death hay lỗi màn hình xanh là một sự cố khi mà phần cứng gặp lỗi, ví dụ như RAM, HDD, VGA,… không hoạt động, hoặc không được cung cấp nguồn điện hay nhiệt độ quá nóng. Một trường hợp khác có thể gây ra lỗi BSOD là khi trình điều khiển thiết bị (driver) gặp lỗi, xử lý sai lệnh hay bị các phần mềm xâm phạm trái phép.

Về cơ bản thì khi gặp lỗi màn hình xanh, bạn sẽ không thao tác được gì với hệ thống và chỉ chờ đợi việc khởi động lại thiết bị. Nếu lỗi BSOD xảy ra thường xuyên nhiều lần, có một số phương án xử lý lỗi như sau:

  • Vệ sinh phần cứng, đảm bảo các thành phần trong máy tính được kết nối chắc chắn và hoạt động đúng. Ngoài ra nếu trong quá trình hoạt động mà nhiệt độ của máy quá cao thì có thể xử lý thay keo tản nhiệt dành cho CPU, thêm xử lý làm mát cho thiết bị.
  • Cài đặt lại trình điều khiển driver của các thiết bị ngoại vi cần thiết.
  • Sử dụng các phần mềm anti-virus đảm bảo thiết bị của bạn không bị tấn công bởi virus và malware.
  • Có thể cài đặt lại hệ điều hành và các phần mềm nếu cần hay Restore (khôi phục) thiết bị về thời điểm trước khi xảy ra lỗi.

Xem thêm tuyển dụng IT Helpdesk lương cao trên TopDev

Phân biệt 2 loại cổng giao tiếp Serial Port và Parallel Port 

Serial Port và Parallel Port 

Port hay cổng là một giao diện vật lý kết nối máy tính với các máy tính khác hoặc thiết bị đầu vào/đầu ra phần cứng. Có 2 loại cổng giao tiếp phổ biến là cổng nối tiếp (Serial Port) và cổng song song (Parallel Port).

Cổng nối tiếp gửi và nhận dữ liệu một lần tại một thời điểm bằng cách sử dụng một cặp dây, trong khi đó cổng song song gửi và nhận dữ liệu nhiều bit cùng một lúc bằng cách sử dụng nhiều dây; nhờ đó mà cổng song song nhanh hơn các cổng nối tiếp. Mặc dù vậy cổng song song cần nhiều đường để truyền dữ liệu hơn vì thế sẽ tốn chi phí và có thể mất dữ liệu trong truyền thông ở khoảng cách xa.

  IT Helpdesk Cần Học Gì Để Làm Tốt Chuyên Môn Của Mình?

Web Hosting là gì? Phân loại Web Hosting Server

Web Hosting là dịch vụ cho thuê không gian trên máy chủ (Server) để lưu trữ, xử lý dữ liệu Website trên Internet. Server của nhà cung cấp dịch vụ Hosting sẽ có IP riêng và đường truyền cấu hình cao nên hoạt động một cách ổn định với bảo mật tốt. Server sẽ chạy xuyên suốt vì thế đảm bảo việc hoạt động liên tục cho Website của bạn.

Có một số loại Web Hosting Server phổ biến:

  • Shared hosting (hosting chia sẻ): Website của bạn sẽ được lưu trữ chung với các trang Web khác trên cùng một server; cùng chia sẻ tài nguyên như CPU hay RAM. Việc chia sẻ giúp loại này có chi phí thấp hơn tuy nhiên hạn chế là việc Website của bạn có thể bị ảnh hưởng từ những Web khác một cách khó kiểm soát hết được.
  • Cloud hosting (hosting đám mây): Ưu điểm của việc sử dụng hosting đám mây là khả năng mở rộng cao, chi phí phải trả sẽ phụ thuộc vào nhu cầu lưu trữ của bạn. Mặc dù vậy thì hạn chế là việc quản lý phụ thuộc hoàn toàn vào nhà cung cấp dịch vụ Cloud, việc bảo mật cũng như các vấn đề hỗ trợ sẽ cần cân nhắc tùy theo mục đích sử dụng.
  • Managed hosting/Dedicated server (hosting/máy chủ chuyên dụng) là dịch vụ cho thuê máy chủ (server) chuyên dụng và phần cứng dành riêng cho khách hàng, không chia sẻ cho bất kỳ ai. Đây là dịch vụ tốn kém chi phí và đòi hỏi có nhân sự chuyên môn để quản lý.
  • VPS hosting (máy chủ ảo) là một máy ảo được một dịch vụ lưu trữ Internet bán dưới dạng dịch vụ. Khách hàng có quyền truy cập superuser vào hệ điều hành và cài mọi phần mềm trên đó. Sử dụng VPS giúp bạn tiết kiệm chi phí nhiều hơn so với máy chủ chuyên dụng, lượng băng thông và phần cứng phụ thuộc vào gói bạn trả. Dù vậy vẫn sẽ có những rủi ro nhất định phụ thuộc vào nhà cung cấp dịch vụ.

Xem việc làm IT helpdesk TPHCM đãi ngộ tốt trên TopDev

Hãy giải thích cách VPNs hoạt động

VPN viết tắt của Virtual Private Network hay mạng riêng ảo là một mạng riêng tư để kết nối các máy tính của các công ty, tập đoàn hay các tổ chức thông qua mạng Internet công cộng. VPN được sử dụng để truyền dữ liệu một cách an toàn và ẩn danh, hoạt động bằng cách ẩn địa chỉ IP của người dùng và mã hóa dữ liệu để chỉ người được cấp quyền nhận dữ liệu mới có thể đọc được.

Kết nối VPN chuyển hướng các gói dữ liệu từ máy của bạn tới một máy chủ từ xa khác trước khi gửi chúng cho các bên thứ ba qua Internet. Cách thức hoạt động VPN như sau:

  • VPN tạo ra đường hầm dữ liệu bảo mật giữa máy cục bộ của bạn và một máy chủ VPN khác ở cách xa bạn. Khi truy cập mạng, máy chủ VPN này trở thành nguồn chung cho tất cả dữ liệu của bạn. Nhà cung cấp dịch vụ Internet (ISP) của bạn và các bên thứ ba khác sẽ không thể xem nội dung lưu lượng Internet của bạn nữa.
  • Giao thức VPN như IPSec làm nhiễu dữ liệu của bạn trước khi gửi chúng qua đường hầm dữ liệu. IPSec là một bộ giao thức bảo mật giao tiếp thông qua giao thức Internet (IP) bằng cách xác thực và mã hóa mỗi gói IP của một dòng dữ liệu. Dịch vụ VPN hoạt động như một bộ lọc khiến dữ liệu của bạn không thể đọc được ở một đầu và chỉ giải mã ở đầu bên kia giúp ngăn ngừa việc sử dụng dữ liệu trái phép.

Kết bài

Trên đây là những câu hỏi mà bạn sẽ có thể gặp phải trong buổi phỏng vấn vị trí IT HelpDesk của mình. Đây là vị trí liên quan nhiều đến phần cứng cũng như đòi hỏi kinh nghiệm về việc thiết lập, xây dựng hệ thống mạng, server. Hy vọng bài viết hữu ích dành cho bạn, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

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

Top 5 câu hỏi phỏng vấn IT Pre sales hàng đầu

câu hỏi phỏng vấn IT Pre sales

Phỏng vấn IT Pre sales liệu có phải chỉ liên quan tới bán bán và bán. Doanh số, doanh số và doanh số?

IT Pre sales là vị trí thường xuyên làm việc và tiếp xúc với khách hàng, vị trí này chịu trách nhiệm phát triển chiến lược cho công ty để bán hàng. Ngoài xúc tiến bán hàng cho khách hàng tiềm năng mới, vị trí này cũng đảm nhận việc tăng trưởng bán hàng cho các sản phẩm đã có công ty.

IT Pre sales Ôi vị trí này thì đập chai. hơn mấy ông Engineer nhiều. Một IT Pre sales cho biết

IT Pre sales cũng là vị trí cầu nối giữa khách hàng và nhóm phát triển, xây dựng mối quan hệ với khách hàng và làm việc với nhóm phát triển (development) để tìm cách đáp ứng nhu cầu của khách hàng.

Vậy phỏng vấn IT Pre sales cần chú ý những gì. Cùng tìm hiểu qua 5 câu hỏi phỏng vấn IT Pre sales phổ biến dưới đây!

1. Những kỹ năng nào là quan trọng đối với IT Pre sales?

Câu hỏi đầu tiên phỏng vấn IT Pre sales liên quan tới góc nhìn cá nhân. Giúp nhà tuyển dụng có thể đánh giá được góc nhìn cá nhân ứng viên. Ở câu hỏi này bạn có thể thoải mái bộc lộ quan điểm của cá nhân.

Một số câu trả lời có thể tham khảo: Tôi nghĩ kỹ năng quan trọng nhất đối với IT Pre sales là kỹ năng giao tiếp và giải quyết vấn đề. Giao tiếp là điều tối quan trọng bởi vị trí này đòi hỏi giao tiếp nhiều với khách hàng. Trường hợp khách hàng có yêu cầu những vấn đề phức tạp, bằng cách giao tiếp và trả lời, tôi có thể giải thích cho khách hàng.

IT Pre sales

Ngoài ra, việc giao tiếp tốt còn gây dựng mối quan hệ lâu dài và tốt đẹp đối với khách hàng, để khách hàng có thể tin tưởng vào chuyên môn của cá nhân tôi.

Giải quyết vấn đề cũng quan trọng không kém vì nó cho phép xác định chính xác yêu cầu của khách hàng, đưa ra các giải pháp phù hợp với những nhu cầu đó. Cuối cùng là kiến thức kĩ thuật, giúp trả lời chính xác, đem giải pháp cụ thể cho khách hàng.

Các loại câu hỏi này, anh em có thể chuẩn bị thêm:

  • Kinh nghiệm của bạn ở vị trí IT Pre Sales?
  • Làm sao bạn thuyết phục khách hàng cho một giải pháp đắt tiền hơn dự định của khách?

  Câu hỏi phỏng vấn Solution Architect không nên bỏ lỡ
 

2. Làm sao để bạn luôn cập nhật kiến thức?

Câu hỏi phỏng vấn thứ hai cho vị trí IT Pre sales liên quan tới cập nhật kiến thức mới. Ở vị trí tiếp xúc khách hàng, kiến thức về xu hướng và công nghệ mới là điều tất yếu. Nếu khách hàng muốn một giải pháp tốt, thường họ sẽ không bỏ qua những xu hướng và công nghệ mới nổi.

Điển hình như AI, nếu khách hàng muốn trao đổi về AI, bạn phải làm sao để có kiến thức, có khả năng trình bày được điểm mạnh và điểm yếu của AI ở thời điểm hiện tại.

Câu trả lời tuỳ thuộc và cá nhân từng ứng viên. Nhưng anh em có thể tham khảo qua ý trả lời sau đây. Tôi đã tìm ra được cách để luôn cập nhật kiến thức mới trong ngành. Tham dự hội thảo, tham dự các buổi event trao đổi về công nghệ mới. Thường xuyên đọc các bài báo phân tích và đánh giá về công nghệ mới. Ngoài ra, follow các kênh nói về công mới trên mạng xã hội cũng là cách hay để luôn cập nhật kiến thức mới trong ngành.

Một số câu hỏi anh em có thể chuẩn bị:

  • Trường hợp khách hàng hỏi bạn về một công nghệ bạn chưa biết gì, bạn sẽ trả lời thế nào?
  • Nếu không chắc chắn về công nghệ khách hàng đưa ra, bạn sẽ trả lời như thế nào?

3. Một lần thuyết phục khách hàng

Câu hỏi số 3 phỏng vấn IT Pre sales liên quan tới một hoặc vài lần thành công. Tất nhiên câu hỏi không phải chỉ giới hạn như ví dụ trong câu hỏi này nha anh em.

Bạn hãy cho biết một lần bạn thuyết phục khách hàng mua một sản phẩm hoặc dịch vụ đắt hơn so với dự định ban đầu của khách hàng.

Câu hỏi này nhấn mạnh vào khả năng thuyết phục và trình bày giải pháp cho khách hàng. Rõ ràng mà nói dân sales thì bán được hàng giá cao là tốt, nhưng ở đây anh em cần nhấn mạnh vào việc trả tiền cho sản phẩm hoặc dịch vụ đắt tiền hơn đáp ứng được nhu cầu của khách hàng. Ở góc nhìn ngược lại, sản phẩm rẻ tiền hơn có thể chỉ có cái lợi trước mắt, không đáp ứng được nhu cầu sau này.

  5 câu hỏi phỏng vấn Project Manager nhà tuyển dụng hay hỏi nhất

IT Pre sales

Anh em lưu ý rằng cần phải phân tích chuyên sâu và thuyết phục được khách hàng rằng việc chi trả cho thứ đắt tiền hơn là xứng đáng. Đáp ứng được nhu cầu của khách, ví dụ như báo cáo, tích hợp thống kê hoặc sao lưu backup dữ liệu.

Một số câu hỏi anh em có thể chuẩn bị:

  • Nếu khách hàng có trải nghiệm không tốt về sản phẩm trước của công ty. Làm sao bạn có thể tiếp cận bán hàng cho họ?
  • Nếu khách hàng muốn thêm tính năng vào sản phẩm bạn đang bán, bạn sẽ làm gì?

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

4. Bạn có kinh nghiệm nói chuyện trước đám đông không?

Câu hỏi thứ 4 phỏng vấn IT Presales thiên về các kĩ năng mềm khác ngoài kỹ năng bán hàng. Trong giới IT, phần mềm, việc tham gia hội thảo, hội nghị đông người không có gì là quá xa lạ. Câu hỏi này nhà tuyển dụng muốn đánh giá thêm về kỹ năng mềm.

Cụ thể ở đây là kỹ năng giao tiếp và thuyết trình trước đám đông. Việc này đôi khi không đơn giản đâu nha. Sales gặp vài khách thì ok, nhưng ra trước đám đông thì không nói được câu nào.

IT Pre sales Thuyết trình trước đám đông là một kỹ năng quan trọng

Một số câu trả lời có thể đưa ra tuỳ vào kinh nghiệm cá nhân của anh em, nhưng có thể tham khảo ý sau. Nhấn mạnh cơ hội đã thuyết trình trước đám đông, cụ thể là các công ty nhỏ hoặc các công ty Fortune 500. Bài thuyết trình của tôi luôn được nghiên cứu kỹ lưỡng và điều chỉnh để đáp ứng được nhu cầu của khách hàng.

Tôi cảm thấy thoải mái khi thuyết trình trước đám đông. Tự tin trình bày toàn bộ tính năng cốt lõi của sản phẩm.

5. Bạn biết gì về sản phẩm công ty?

Câu hỏi cuối cùng phỏng vấn IT Pre sales là câu hỏi khá phổ biến khi tham gia phỏng vấn vị trí này. Thông thường, ứng viên cần tìm hiểu trước một số sản phẩm của công ty. Bởi có hứng thú và có tìm hiểu trước các sản phẩm công ty sẽ là điểm cộng lớn trong mắt nhà tuyển dụng.

Hơn nữa, nếu thật sự có hứng thú với sản phẩm công ty, khả năng bạn thành công ở vị trí IT Pre sales trong công ty sẽ cao hơn. Thế nên lời khuyên cho anh em là nên tìm hiểu qua các sản phẩm chủ lực, cũng như các sản phẩm chưa bán chạy ở công ty mà mình chuẩn bị phỏng vấn. Tìm hiểu sản phẩm, công nghệ làm ra sản phẩm, những yếu tố nào giúp họ cạnh tranh.

Tốt hơn nữa thì tìm hiểu cả điểm mạnh, điểm yếu của sản phẩm công ty đối thủ.

Một số câu hỏi có thể chuẩn bị:

  • Những sản phẩm nào của công ty bạn nghĩ có thể cải tiến?
  • Bạn nghĩ sản phẩm nào của công ty có doanh số cao nhất?. Tại sao?

6. Tìm hiểu thêm về IT Pre sales

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

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

Xem thêm:

Xem thêm nhiều việc làm IT hấp dẫn, lương cao tại TopDev!

Viết clean code: Code “đẹp trai” và code “xấu gái” có gì hay ho?

Viết clean code: Code “đẹp trai” và code “xấu gái” có gì hay ho?

Bài viết được sự cho phép của tác giả Sơn Dương

Trong sự nghiệp viết code, bạn sẽ nhận ra là bất kỳ ngôn ngữ nào, sẽ luôn có những good code – tạm gọi là code “đẹp trai” và bad code – tạm gọi là code “xấu gái”. Cả hai loại code này đều có thể chạy đúng logic. Nhưng những code “xấu gái” lại gây ra một vấn đề lớn khi maintain dự án. Dưới đây là một số kinh nghiệm viết clean code cho dự án.

Lập trình viên có nên trau chuốt khi viết code?

Trên thực tế, bất kể chương trình của bạn có chạy tốt tới đâu, vào một thời điểm nhất định nào đó sẽ có người nhúng tay vào việc đọc hoặc thay đổi lại code của bạn.

Có thể là thêm tính năng mới, sửa bug hoặc đơn giản chỉ là đọc để hiểu rõ “đứa con” của bạn hoạt động như thế nào.

Ngược lại, sẽ có lúc bạn cũng phải làm điều tương tự với code của những người khác. Cuộc đời mà!

Mọi chuyện sẽ thuận lợi hơn nếu bộ code dễ đọc và dễ hiểu, hay nói cách khác là code phải “đẹp trai”.

Bạn có tưởng tượng được tầm quan trọng của code chất lượng cao? Vậy hãy lật ngược vấn đề khi nghĩ tới hậu quả mà code “xấu gái” có thể mang tới. Đó chính là sự tổn thất về tiền bạc, nhân lực và sự lãng phí thời gian để đọc hiểu, sửa chữa những đoạn code vô cùng “xấu gái”.

Bạn viết một đoạn code và sau đó đoạn code đó được sử dụng ở rất nhiều nơi trong dự án. Do đó việc cung cấp những thông tin cần thiết về đoạn code của bạn thực sự rất quan trọng cho chính bạn và cả đồng nghiệp của bạn.

Có không ít lần mình bắt gặp các đồng nghiệp tán phét với nhau về việc họ không thể nhớ nổi đoạn code hay logic mà họ đã viết chỉ mấy ngày trước đó.

Đối với một đoạn code “xấu gái”, bạn sẽ phải mất nhiều thời gian hơn để tìm được đáp án cho câu hỏi “mình đã làm cái quái gì vào lúc đó nhỉ?

Một số lời khuyên viết clean code gọn gàng, mạch lạc

#1. Hãy viết “còm men” một cách khoa học

Viết clean code

Hầu hết các ngôn ngữ hiện nay đều hỗ trợ viết comment trong code. Comment giúp cho các đoạn code trở nên dễ hiểu và thuận lợi hơn cho việc bảo trì dự án sau này.

Những dòng comment sẽ được đánh giá cao khi chỉ ra được tại sao phải viết code như thế này thay vì chỉ mô tả đoạn code này làm nhiệm vụ gì. Bởi vì người ta đọc code là người ta đã hiểu code làm gì rồi đâu cần giải thích lại.

Việc comment cũng cần phải ngắn gọn và xúc tích nhất có thể, đừng dài dòng lê thê như viết văn bởi vì người đọc đã quá buồn ngủ khi đọc code rồi.

#2. Nhớ viết code thụt dòng đúng chuẩn (Indention)

#3. Chuẩn hóa file Readme’s

Sẽ là rất phức tạp nếu bạn có một project cần tiêu tốn hàng giờ để mò cài đặt môi trường và triển khai. Đây chính là lúc cần đến Readme như một vị cứu tinh.

Tốt nhất bạn nên viết một đoạn giới thiệu ngắn gọn về dự án trước khi mô tả phần code. Một Readme có cấu trúc như tại đây

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

#4. Luôn đặt tên hàm, tên lớp theo chuẩn (Naming Conventions)

Rất nhiều lần chúng ta bắt gặp một class với cái tên ApiManager – cái tên chẳng hề thể hiện được mục đích rõ ràng của lớp đó.

Bạn nên tham khảo quy tắc đặt tên bằng cách search trên Google từ khóa “best coding practice“.

Điều này giúp bạn phân biệt được khi nào và ở đâu một biến sẽ ra khỏi phạm vi chỉ bằng việc nhìn vào một block code.

Tất cả tên của lớp hay hàm(method, function) đều phải có ý nghĩa. Đọc là hiểu tác dụng chính của nó, ngoại trừ những đối tượng tạm thời (ví dụ như tên biến trong vòng for :

for(int i = 0; i< length; i++)
Một cái tên tốt là cái tên mà khi đọc lên nó chứa đựng đầy đủ thông tin về công dụng cũng như cách sử dụng và điều này chỉ có thể làm được nếu tuân thủ nguyên tắc “single responsibility”.

#5. Hạn chế tối đa Magic Numbers

Magic Numbers tức là bạn tự định nghĩa một hằng số và chương trình sẽ chỉ chạy đúng với hằng số đó.

Không ai có thể biết được tại sao con số đó được chọn lựa. Không ai THỰC SỰ biết được những con số đó ảnh hưởng đến chương trình như thế nào. Ngoại trừ việc thay đổi chúng, đồng nghĩa với phá vỡ logic mọi thứ.

Những con số ma thuật đó đều chẳng tốt đẹp gì cả. Vì vậy, hãy né chúng ngay để tự cứu lấy mình!

Mình lấy một ví dụ với đoạn code sau:

if(a < 8 && b < 8 && c < 8){
    do_something();
}

Ta thấy lệnh so sánh giá trị 3 biến a,b,c với số 8 tồn tại 2 vấn đề.

  • Thứ nhất: số 8 trong trường hợp này trở thành “magic number“. Khi bạn đọc qua đoạn code này, chắc chắn bạn không biết 8 đang biểu diễn cho cái gì. Đối với tác giả đoạn code này thì đó là thời gian làm việc ban ngày của công nhân – 8 tiếng đồng hồ và chắc chỉ mình tác giả đoạn code này thực sự biết điều đó
  • Thứ hai: số 8 được lặp lại 3 lần ở các phép so sánh. Như vậy, khi cần thay đổi giá trị 8 thành 7 hoặc tăng lên 12 chẳng hạn, ta sẽ phải đi dò từng vị trí mà 8 xuất hiện… Rất bất tiện và dễ phát sinh lỗi.

vì vậy để viết code clean hơn, ta nên phẫu thuật chỉnh hình nó thành như sau:

// Số giờ làm việc trong ngày của công nhân
final int WORK_HOURS = 8;

if(a < WORK_HOURS && b < WORK_HOURS && c < WORK_HOURS){
    do_something();
}

#6. Một số quy tắc khác

Và thật ra còn hàng trăm hàng ngàn thứ khác để giúp code chúng ta trở nên đẹp đẽ hơn. Viết clean code cho đẹp là cả một quá trình. Để tóm lại thì mình có một số ý sau.

  • Code đẹp là một code được tổ chức tốt. Đừng để code của bạn trở thành đống lộn xộn, mà giới developer hay gọi là “spaghetti code”.
  • Code đẹp là code phải được comment đầy đủ. Comment tại sao lại viết code như thế, thay vì code đó chạy như thế nào. Tốt hơn hết là nên có ví dụ về cách sử dụng.
  • Code đẹp không phải là code “thông minh”. Code “thông minh” đến mức người đọc không thể hiểu nổi. Thì dù có chạy đúng logic vẫn là code “ngu”. Vì vậy, nên code thật đơn giản và rõ ràng, đọc phát hiểu liền.
  • Code đẹp cần được thực hiện từ các đơn vị tính toán nhỏ nhất. Tức là mỗi hàm chỉ làm một việc thôi, để nó có thể tái sử dụng nhiểu nhất có thể.

Kết luận

Trên đây là toàn bộ những chia sẻ của mình về kinh nghiệm viết clean code. Hi vọng nó sẽ giúp các bạn tránh được những bug tiềm tàng.

Với những lưu ý kể trên, hãy cùng cố gắng để trở thành cha đẻ của những code “đẹp trai” nhất trong mắt tất cả mọi người.

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

Xem thêm:

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

Git là gì mà lại giúp bạn và cả team làm việc tốt hơn?

Git là gì mà lại giúp bạn và cả team làm việc tốt hơn?

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

I. Từ vấn đề cho tới GIT là gì

1.1 Vấn đề

Chúng ta cùng tìm hiểu vấn đề thông qua một ví dụ do mình bịa ra như sau:

Bình và Sơn làm chung một dự án website thương mại điện tử, sau khi nhận yêu cầu, Bình và Sơn chia nhau công việc. Cách làm việc là mỗi khi có ai code xong một phần tính năng, thì sẽ copy code của mình gửi cho người kia thông qua USB để ghép vào dự án chung.

Thời gian đầu, code chưa có gì phức tạp, Bình và Sơn vẫn trao đổi code của mình qua USB bình thường. Nhưng sau một thời gian, code trở nên phức tạp, Bình và Sơn liên tục gặp sai sót trong quá trình copy code qua lại cho nhau, và tốn thời gian để giải quyết các sai sót đó. Vì không nghĩ đến điều này, nên dự án của Bình và Sơn bị thất bại do quá hạn deadline.

Tuy là ví dụ hư cấu, nhưng trong thực tế vẫn có các tình huống tương tự như vậy xảy ra, và trong cuộc đời của mỗi developer, thì hầu hết mọi người đều từng có một lần trao đổi và ghép code qua USB như vậy.

Quay trở lại với ví dụ về Bình và Sơn, dự án thất bại là do quá hạn deadline, mà nguyên nhân sâu xa là do cách làm việc không tốt. Khi copy code qua lại với nhau như vậy, việc xảy ra sai sót cũng là điều dễ hiểu vì:

  • Sẽ rất khó để ghép code, khi cả 2 người cùng sửa trên một file, và còn khó hơn khi hai người cùng sửa trên một dòng.
  • Code có thể bị “rơi rụng” (copy thiếu) trong lúc ghép code.
  • Với những tính năng nhiều code, thì thời gian ghép code có thể mất cả ngày.

Thực tế, khi làm việc theo cách của Bình và Sơn (hay cách nào tương tự vậy) thì còn có nhiều hạn chế khác bên cạnh các hạn chế kể trên:

  • Khó khăn khi bổ sung thêm người mới vào code cùng, càng nhiều người làm thì tỉ lệ sai sót càng cao.
  • Tốn thời gian để giải quyết các sai sót không đáng có.
  • Khó làm việc độc lập.

Vậy giải pháp cho các vấn đề trên là gì? Chính là GIT

1.2 Git là gì?

Để tìm hiểu GIT là gì, trước tiên mình muốn bạn biết về VCS là gì trước.

VCS – Version Control System (Hệ thống quản lý phiên bản). Cái tên VCS đã phần nào nói lên tính năng của hệ thống này, VCS sẽ lưu lại toàn bộ mã nguồn và ghi chép đầy đủ trạng thái thay đổi của các file, với từng trạng thái thay đổi mỗi file, đều được log lại thành một phiên bản.

Ví dụ dự án A có 10 thay đổi, thì VCS sẽ log lại thành 10 phiên bản khác nhau, và bạn có thể xem lại các phiên bản này.

Lưu ý: VCS ám chỉ một dạng hệ thống, chứ không phải tên một hệ thống cụ thể.

GIT đơn giản là một hệ thống thuộc dạng VCS. Tức là ngoài GIT ra vẫn còn nhiều hệ thống khác tương tự như GIT. Nhưng ngày nay, khi nói tới VCS, người ta chỉ hình dung tới GIT, vì GIT có một số đặc điểm nổi bật hơn các VCS khác. Tuy nhiên dưới góc độ của một người mới bắt đầu tìm hiểu về VCS nói chung và GIT nói riêng, mình cho rằng bạn sẽ không quan tâm tới việc so sánh GIT với các VCS khác, nên mình xin phép không đề cập tới phần này. Chúng ta tạm thời khẳng định với nhau rằng “GIT là lựa chọn thích hợp nhất cho một VCS trong thời điểm hiện tại“.

  Các vai trò trong một team phát triển phần mềm

  Tech Lead là gì? Nhiệm vụ, vai trò của Tech Lead trong team

1.3 Vai trò của GIT trong phát triển phần mềm

Ngày nay, bất kỳ dự án phần mềm nào cũng nên áp dụng GIT, vì GIT giúp giải quyết một số vấn đề quan trọng sau:

Là nơi lưu trữ source code
Hãy tưởng tượng GIT là một “đám mây” lưu trữ như Google Drive, Dropbox, tuy nhiên GIT được thiết kế riêng để lưu trữ source code.

Quản lý phiên bản source code
Hãy tưởng tượng bạn đang phát triển một sản phẩm có rất nhiều người sử dụng. Vì sản phẩm có nhiều người dùng, nên yêu cầu tính ổn định phải cực kỳ cao. Vì yêu cầu tính ổn định cao, nên bạn không được phép code trực tiếp vào phiên bản source code đang chạy ổn định, mà phải code vào một phiên bản khác – gọi là phiên bản dev. Trong lúc bạn đang code ở phiên bản dev, thì phiên bản chạy ổn định vẫn có các cập nhật hằng ngày. Vậy vấn đề gặp phải là làm sao để có thể phát triển được nhiều phiên bản source cùng lúc. Thì với GIT, việc phát triển nhiều phiên bản cùng lúc vô cùng dễ dàng, việc code thêm ở phiên bản này sẽ không ảnh hưởng tới code ở phiên bản khác.

Có thể merge code (ghép code) từ nhiều người
Đây chính là một trong những lý do quan trọng nhất khiến người ta sử dụng VCS nói chung và GIT nói riêng. Với GIT, việc merge code từ nhiều người có thể diễn ra tự động, nếu trong quá trình merge code mà có xảy ra xung đột (mà GIT gọi là conflict) thì GIT sẽ cảnh báo để chúng ta biết.

Blame code (vui thôi nhé)
Giả sử bạn phải sửa code của người khác, khi đọc code, bạn phát hiện một đoạn code ngu kinh khủng, bạn muốn tìm xem ai là người code đoạn này để chửi cho bõ tức. Thì GIT có thể cho bạn biết đó là kẻ nào.

Tham khảo Job FrontEnd HOT trên TopDev!

1.4 Làm việc với GIT như thế nào

Một số khái niệm

Để biết cách làm việc với GIT, mình sẽ chỉ bạn mấy khái niệm cơ bản trong GIT trước:

  • Repository (hay nhiều người gọi tắt là repo): Là nơi lưu trữ source code, mỗi repository sẽ đại diện cho một dự án. Repository sẽ chia làm 2 loại, là Local repository và Remote repository.
  • Local repository: Là repository được đặt trên máy tính của bạn.
  • Remote repository: Là repository được đặt trên GIT server.
  • Init repository: Là thao tác khởi tạo một Local repository.
  • Clone: Là thao tác nhân bản một Remote repository thành Local repository trên máy của bạn.
  • Branch (Nhánh): GIT quản lý các phiên bản source dưới dạng cây có nhiều nhánh, mỗi nhánh là một phiên bản. Các nhánh có thể được tách ra, hoặc ghép vào nhau. Branch trong GIT được chia làm 2 loại, là branch master (nhánh chính) và các branch khác do bạn tạo ra trong quá trình làm việc.
  • Branch master: Là nhánh đầu tiên khi khởi tạo một GIT repository, branch master thường là nơi chứa source code đang chạy ổn định.
  • Checkout: Là thao tác chuyển qua chuyển lại giữa các branch. Khi nói “checkout master branch”, nghĩa là chuyển sang nhánh master.
  • Pull (kéo): Là thao tác đồng bộ code từ Remote repository xuống Local repository.
  • Commit: Là thao tác “xác nhận” một sự thay đổi của code. Thường thì mỗi tính năng sau khi được hoàn thiện sẽ thực hiện một commit.
  • Push (đẩy): Là thao tác đồng bộ code từ Local repository lên Remote repository.
  • Merge: Là thao tác ghép code lại với nhau.
  • Conflict: Là sự xung đột khi merge code.

Cách làm việc với GIT

Phần này mình sẽ trình bày một số thao tác và đặc điểm cơ bản khi áp dụng GIT trong dự án:

  • Git được cài đặt sẵn trên Linux và hỗ trợ các hệ điều hành phổ biến, bạn có thể download GIT miễn phí ở đây.
  • GIT nên được sử dụng trên Command Line thay vì các phần mềm hỗ trợ GIT trên GUI.
  • GIT có thể có nhiều Remote repository và Local repository. Remote repository sẽ đặt ở trên GIT server, còn Local repository đặt trên máy của bạn. Remote repository và Local repository sẽ được liên kết với nhau.
  • GIT quản lý tất cả các sự thay đổi như: thêm file mới, sửa file, xóa file, chmod thư mục,… bất kỳ điều gì làm thay đổi source code đều được GIT quản lý.
  • Khi bạn code, bạn sẽ code trên trên Local repository. Sau khi code xong tính năng, bạn thực hiện thao tác commit để xác nhận sự thay đổi của code.
  • Để đẩy các commit từ Local repository lên Remote repository, bạn sử dụng thao tác push. Các thành viên khác trong team muốn cập nhật các code mới do bạn bổ sung, thì thực hiện thao tác pull để đồng bộ code từ Remote repo về Local repo của họ.
  • Khi pull code từ Remote repo về Local repo sẽ xảy ra thao tác merge code. Nếu không bị conflict code giữa Local repo và Remote repo, việc merge code sẽ diễn ra tự động, nếu xảy ra conflict, GIT sẽ thông báo cho bạn biết.
  • Nếu bạn muốn khởi tạo một Local repo từ Remote repo thì sử dụng thao tác clone.
  • Branch master đang hoạt động ổn định, bạn không muốn code trực tiếp trên branch master, thì từ nhánh master bạn có thể tạo ra một nhánh khác – tạm gọi là nhánh xxx. Nhánh xxx lúc này chứa toàn bộ code của nhánh master, bạn có thể thoải mái thực hiện các thao tác commit, push, pull trên nhánh này mà không làm ảnh hưởng tới nhánh master. Khi tính năng trên nhánh xxx hoạt động ổn định, bạn có thể yên tâm merge code ở nhánh xxx vào nhánh master.

II. Git với Github

Chắc sẽ có nhiều bạn bị nhầm lần giữa GIT và Github.

Thực ra GIT và Github vốn không thể so sánh với nhau, vì GIT là tên một hệ thống, còn Github là tên một đơn vị cung cấp dịch vụ GIT. Có thể hiểu nhanh rằng GIT và Github cũng tương tự như Porn và Pornhub vậy.

GIT vs Github, and porn vs pornhub
GIT vs Github, and porn vs pornhub

 

Như mình đề cập ở trên, git có 2 dạng repository là Local repo được đặt trên máy của các lập trình viên, và Remote repo được đặt trên GIT server. Điều này có nghĩa là, để sử dụng GIT, thì việc cài đặt GIT trên máy tính của bạn là chưa đủ, bạn cần phải có một server đóng vai trò như một GIT server nữa, và Github là đơn vị cung cấp GIT server miễn phí bạn.

Thực tế thì Github còn có nhiều tác dụng hơn là cung cấp GIT server miễn phí. Với cộng đồng lập trình viên nói chung, Github còn giống như một mạng xã hội. Có điều mạng xã hội này show project thay thì show status hay show ảnh, nút like được thay bằng nút star, phần comment thì được thay bằng issues 

III. Cách sử dụng GIT cơ bản

Phần này mình sẽ hướng dẫn các bạn cách sử dụng GIT, cụ thể chúng ta sẽ sử dụng dịch vụ GIT miễn phí của Github – Một trong những nền tảng cung cấp dịch vụ GIT phổ biến nhất hệ mặt trời.

Trước tiên hãy đảm bảo máy tính của bạn đã cài đặt GIT, bạn có thể kiểm tra bằng cách thực hiện lệnh git --version trong terminal.

git --version

Nếu thấy xuất hiện thông tin phiên bản của GIT, thì có nghĩa là máy tính của bạn đã cài đặt. Ngược lại, bạn phải download và cài đặt GIT vào máy trước khi thực hiện các bước sau đây.

3.1 Đăng ký tài khoản Github.com

Bạn truy cập vào https://github.com/join, điền thông tin vào form để đăng ký tài khoản.

Đăng ký tài khoản Github.com
Ảnh chụp giao diện đăng ký tài khoản github.com (chụp ngày 27/06/2020)

Github sẽ yêu cầu bạn xác thực tài khoản qua email, thế nên hãy để ý mail box của bạn nhé.

Sau khi đăng ký xong, hãy đăng nhập vào Github để chuẩn bị cho bước tiếp theo.

3.1 Tạo repository đầu tiên

Sau khi đăng nhập, bạn tìm nút “New repository” như hình.

Đăng ký tài khoản Github.com
Ảnh chụp giao diện trang chủ của github.com (chụp ngày 27/06/2020)

 

Nhấp vào “New repository”, bạn sẽ được chuyển tới trang tạo repository như hình.

Đăng ký tài khoản Github.com
Ảnh chụp giao diện tạo repository trên github.com (chụp ngày 27/06/2020)

 

Điền các thông tin cần thiết rồi nhấn “Create repository”, trong đó:

  • Repository name: Tên repository của bạn, bạn nên nhập dạng “ten-repository”
  • Description: Nhập mô tả về repository của bạn, thông tin này để trống cũng được.
  • Public hay Private: Public thì bất kỳ ai cũng có thể xem và clone repo của bạn, Private thì chỉ có bạn hoặc những người bạn cho phép mới có thể thực hiện các thao tác đó. Ở đây bạn hãy chọn Public dễ thao tác hơn, chúng ta sẽ tìm hiểu về Private repo sau.

Sau đó, bạn sẽ được chuyển tới trang chi tiết repository như hình.

Đăng ký tài khoản Github.com

Vậy là bạn đã tạo thành công một GIT repository.

Đừng vội hoảng loạn với các dòng lệnh khó hiểu mà Github gợi ý cho bạn trong trang này nhé, hãy bình tĩnh đọc chúng và bạn sẽ hiểu thôi.

Cụ thể là bạn vừa tạo xong một Remote repository mới tinh chưa có code, và Github đang gợi ý cho bạn một số cách để đẩy những file đầu tiên lên Remote repository này. Theo như Github gợi ý, thì bạn có 3 cách:

  • Cách 1: Tạo một Local repository trên máy tính của bạn, liên kết nó với Remote repository này, tạo commit đầu tiên rồi đẩy commit đó lên nhánh master.
  • Cách 2: Nếu bạn có sẵn một Local repository, thì chỉ cần liên kết nó với Remote repository này, và đẩy các commit lên master.
  • Cách 3: Import từ một repository khác.

Ở đây mình sẽ thực hiện theo Cách 1. Bạn mở CLI lên và chạy lần lượt các lệnh sau (Hãy đế ý tới phần mình chú thích sau mỗi lệnh nhé).

mkdir my-local-repository # Tạo một thư mục có tên là "my-local-repository"
cd my-local-repository # Di chuyển vào thư mục vừa tạo
echo "# first-repository" >> README.md # Tạo một file README.md với nội dung "# first-repository"
git init # Khởi tạo một GIT Local repository
git add README.md # Thêm file README.md vào commit
git commit -m "first commit" # Xác nhận sự thay đổi
git remote add origin https://github.com/phambinhnet/first-repository.git # Link tới remote repository
git push -u origin master # Đẩy code lên nhánh master

Khi chạy lệnh git push ..., git sẽ yêu cầu bạn nhập username và password.

Sau khi chạy xong, tại trang chi tiết Repository trên Github, bạn tải lại trang sẽ thấy kết quả như hình:

Đăng ký tài khoản Github.com

Vậy là bạn đã thực hiện thành công thao tác push code từ Local repository lên Remote repository.

Nếu Local repository của bạn tiếp tục có sự thay đổi và bạn muốn đồng bộ (push) nó lên Remote repository, thì bạn cũng chỉ cần thực hiện lại các bước:

git add <tên file, tên thư mục, . hoặc *> # Thêm các sự thay đổi vào commit
git commit -m "ghi chú về sự thay đổi"
git push origin master

Chi tiết hơn về các lệnh git addgit commitgit push thì mình sẽ trình bày ở phần tiếp theo.

3.2 Add, status, pull, commit, push

git add

Một commit có thể bao gồm nhiều sự thay đổi, để thêm sự thay đổi vào commit, bạn sử dụng lệnh git add pattern. Trong đó, pattern có thể là:

  • Đường dẫn tới một file hoặc thư mục
  • Sử dụng pattern là * nếu bạn muốn add tất cả sự thay đổi trong thư mục hiện tại (bao gồm cả các thư mục con).
  • Sử dụng pattern là . nếu bạn muốn thêm tất cả sự thay đổi

git status

Lệnh git status cho phép bạn xem trạng thái của Local repository hiện tại, như có những file nào mới, có file nào bị chỉnh sửa, có file nào bị xóa,…

Thường thì trước khi sử dụng lệnh git add, mình sẽ chạy một lần lệnh git status để xem Local repo có những sự thay đổi nào, từ đấy mới biết đường mà add.

git commit

Lệnh git commit cho phép bạn xác nhận các sự thay đổi sau khi chúng đã được add. Cấu trúc của một lệnh git commit thường là như sau:

git commit -m "Mô tả về sự thay đổi"

Sau khi chạy xong lệnh git commit, mình cũng thường chạy lại lệnh git status thêm một lần nữa để xem có commit thiếu sự thay đổi nào không, cũng như để đảm bảo là đã commit thành công.

git push

Lệnh git push được sử dụng để đẩy các commit từ Local repo lên Remote repo.

Sau khi commit, thì các code thay đổi vẫn nằm tại Local repo, để đẩy chúng lên Remote repo thì bạn phải sử dụng lệnh git push. Đầy đủ câu lệnh này lên là:

git push origin branch

Trong đó origin là tên remote repository (tên các remote repo cũng thường là origin luôn), còn branch là nhánh muốn đẩy lên. Giả sử mình muốn đẩy các commit lên nhánh master thì mình sẽ chạy lệnh như sau:

git push origin master

git pull

Lệnh git pull được sử dụng để đồng bộ Remote repository về Local repository. Đầy đủ câu lệnh nên là:

git pull origin branch

Với origin và branch được mô tả giống như lệnh git push. Giả sử mình muốn đồng bộ Remote repo từ nhánh master về Local repo thì mình sẽ sử dụng lệnh sau:

git pull origin master

3.3 Branch, checkout

Phần này khá ngắn gọn thôi.

GIT quản lý các phiên bản source qua khái niệm branch, mặc định mỗi GIT repo sẽ có sẵn một branch là branch master.

Để tạo một branch mới, trước tiên bạn cần xác định là branch mới này sẽ được tách ra từ branch nào. Ví dụ mình tạo một branch mới được tách ra từ branch master thì mình sẽ thực hiện các lệnh như sau:

git checkout master # Chuyển qua nhánh master
git checkout -b ten_branch # Tạo branch mới đồng thời chuyển qua branch vừa tạo

Việc tách nhánh để làm việc sẽ khiến bạn quản lý sự thay đổi tốt hơn, cũng như giảm thiểu sai sót. Vì sau khi tách nhánh, bạn có thể thoải mái chỉnh sửa code trên nhánh vừa tách mà không lo ảnh hưởng tới các nhánh khác. Bạn có thể xem hình sau để hiểu rõ hơn (mỗi một chấm xanh là đại diện cho một commit).

git
Nhánh trên git được tổ chức dưới dạng cây

Ở hình trên, bạn thấy nhánh new_feature được tách ra từ nhánh master, trên nhánh new_feature có 2 commit. Trước khi nhánh new_feature được merge vào master, nếu 2 commit kia có lỗi thì cũng sẽ không ảnh hưởng tới nhánh master.

IV. Lời kết

Đây là một bài viết dài và có nhiều kiến thức, nếu bạn có đọc một lần mà vẫn chưa hiểu thì cũng là chuyện bình thường. Cá nhân mình biết GIT từ thời năm 2 sinh viên, nhưng mãi cho tới khi ra trường và đi làm mới hiểu thật sự về cách làm việc với GIT. Nếu bạn cảm thấy khó hiểu, thì mình có một vài gợi ý sau:

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

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

Những bài viết liên quan:

5 câu hỏi phỏng vấn Project Manager nhà tuyển dụng hay hỏi nhất

5 câu hỏi phỏng vấn Project Manager nhà tuyển dụng hay hỏi nhất

Project Manager, nghe thôi đã thấy quyền lực, phỏng vấn Project Manager yêu cầu những kiến thức gì?

Dưới đây là top 5 câu hỏi được đánh giá là mới và thường xuyên được sử dụng trong các buổi phỏng vấn vị trí quản lý dự án. Các câu hỏi dưới đây có đề cập thêm một số câu hỏi liên quan, ứng viên có thể chuẩn bị thêm, tạo tiền đề cho buổi phỏng vấn thành công tốt đẹp.

phỏng vấn Project ManagerTrời ơi, cuối cùng cũng có một requirement từ Project Manager

Tuy nhiên, vị trí Project Manager sướng hơn nhiều

phỏng vấn Project Manager

Bắt đầu ngay thôi nào!

1. Giới thiệu bản thân và các dự án đã quản lý

Câu hỏi đầu tiên phỏng vấn Project Manager là câu hỏi giới thiệu bản thân. Đây là câu hỏi phổ biến cho rất rất nhiều các vị trí tuyển dụng. Tuy nhiên đối với vị trí quản lý dự án, việc giới thiệu bản thân là vô cùng quan trọng.

Đối với nhà tuyển dụng, câu hỏi này giúp ứng viên thoải mái, tạo cơ hội cho ứng viên có thể trình bày những kinh nghiệm hiện có của mình.

Trả lời cho câu hỏi này, ứng viên cầu lưu ý trả lời ngắn gọn về kinh nghiệm bản thân, nên tập trung vào những ý chính. Tập trung vào vị trí Project Manager đã trải qua trước đó.

Về các dự án và kinh nghiệm quản lý các dự án trước đó. Ứng viên có thể nêu tổng quan bao gồm loại hình dự án, độ lớn của team, đặc thù của dự án. Dự án thành công hoặc kết thúc như thế nào. Điều tâm đắc khi trải qua dự án.

phỏng vấn Project Manager

Các câu hỏi có thể chuẩn bị thêm:

  • Làm sao bạn giữ cho động lực của team luôn ở trạng thái tốt?
  • Làm thế nào bạn đánh giá độ ưu tiên cho từng task?
  • Kích cỡ team size có ảnh hưởng tới thành công của dự án không?

  Project Manager là gì? Công việc của Project Manager
  Mẫu bảng mô tả công việc Project Manager

2. Những tools nào bạn sử dụng để quản lý dự án?

Câu hỏi số hai phỏng vấn Project Manager liên quan tới kinh nghiệm sử dụng tools quản lý dự án. Đối với các vị trí khác trong team như lập trình viên, QC/QA. Việc sử dụng tools nào đôi khi không quá quan trọng.

Tuy nhiên, đối với vị trí Quản lý dự án, kinh nghiệm sử dụng tools để quản trị dự án là thông tin quan trọng đối với nhà tuyển dụng. Việc sử dụng thành thạo các công cụ quản lý dự án phần mềm là một điểm cộng lớn.

phỏng vấn Project Manager

Trả lời cho câu hỏi này, ứng viên cần nêu những ưu điểm nổi bật, kinh nghiệm sử dụng từng loại công cụ. Ngoài ra, ứng viên cũng có thể nêu ra các thủ thuật, các tính năng chính thường sử dụng đối với từng loại công cụ.

Một số câu hỏi ứng viên có thể chuẩn bị trước:

  • Bạn thường trực quan hoá thông tin hay dữ liệu liên quan tới dự án bằng cách nào?
  • Các loại biểu đồ nào thường được sử dụng?
  • Bạn có kinh nghiệm nào tự động hoá hoặc có phương án để giảm bớt công sức thu thập thông tin từ dự án không (đề cập tới automation)

Nhiều tin tuyển dụng Project Manager lương cao trên TopDev, ứng tuyển ngay!

3. Bạn đã quản lý team remote chưa?

Câu hỏi thứ 3 phỏng vấn Project Manager là câu hỏi cập nhật mới nhất về phát triển phần mềm sau đại dịch Covid. Nếu như cách đây vài năm, việc làm việc remote team chưa phổ biến thì sau đại dịch, việc quản lý team remote trở nên phổ biến hơn.

Câu hỏi này nhằm đánh giá thêm về kinh nghiệm, cũng như khả năng thực tế của người quản lý dự án khi làm việc với team remote, vốn là công việc có tính chất khó khăn hơn so với team offline.

phỏng vấn Project Manager

Để trả lời cho câu hỏi này, người quản lý dự án cần nêu các kinh nghiệm làm việc, nêu những khó khăn gặp phải:

  • Làm sao để đảm bảo tiến độ cho dự án?
  • Những khó khăn gì khi làm việc với team remote?
  • Làm sao để gắn kết team trong trường hợp team làm remote?

Câu trả lời có thể khác nhau tuỳ kinh nghiệm của từng ứng viên, tuy nhiên cần nêu bật khó khăn khi làm với team remote. Những giải pháp sáng tạo để làm việc với team remote thành công.

Một số câu hỏi có thể chuẩn bị cho phần này:

  • Bạn đã làm việc với team bao gồm nhiều thành viên ở nhiều quốc gia chưa?
  • Bạn đã làm việc với những hình mẫu team nào?

4. Phong cách leader bạn mong muốn trở thành là gì?

Câu hỏi thứ 4 phỏng vấn Project Manager liên quan tới suy nghĩ về định hướng, hướng đi về tương lai của Project Manager. Câu hỏi này khá quan trọng vì tầm nhìn và góc nhìn ở vị trí Project Manager rất quan trọng với nhà tuyển dụng.

Cần nhấn mạnh là phong cách và con đường để tiến xa hơn cho vị trí Project Manager là không cố định, không có đúng hay có sai, tất cả là hướng đi mà mỗi cá nhân tự lựa chọn cho riêng mình.

Phong cách của project manager ở đây có thể được trả lời dựa trên một vài gợi ý dưới đây:

  • Trường hợp không hỏi ý kiến các thành viên trong team, làm sao để cả team vẫn tin tưởng sự lựa chọn của bạn?
  • Làm sao bạn giải quyết xung đột ở cương vị là quản lý dự án
  • Bạn có cảm thấy sự xuất hiện của bạn gây ra áp lực cho team? Nếu có, bằng cách nào để giảm áp lực cho team?
  • Phong cách giao tiếp của bạn với team như thế nào? Có điều gì cần lưu ý khi giao tiếp với team không?

phỏng vấn Project Manager

Đây là câu hỏi mở và đề cao ý kiến cá nhân, vì vậy ứng viên thoải mái trả lời câu hỏi dựa trên góc nhìn của chính mình. Phong cách mỗi người là khác nhau.

Một số câu hỏi có thể chuẩn bị trước:

  • Khi có tin không tốt về dự án, bạn truyền đạt tới team của mình như thế nào?
  • Trường hợp có thay đổi về requirement của dự án, nếu thay đổi lớn, bạn xử lý hoặc truyền đạt thông tin đó cho team như thế nào?

5. Những thử thách gặp phải trong dự án và cách giải quyết

Câu hỏi thứ 5 phỏng vấn Project Manager đề cập tới kinh nghiệm cá nhân của bản thân ứng viên. Câu hỏi này nhằm xác định chính xác kinh nghiệm của ứng viên, bởi khi trải qua càng nhiều dự án, chắc chắn trải qua không ít những khó khăn.

Ngoài ra, việc nêu ra các thử thách, khó khăn gặp phải trong dự án cũng giúp nhà tuyển dụng có cái nhìn rõ ràng hơn khi tuyển dụng. Đảm bảo rằng bạn là người có thể vượt qua khó khăn trong quá trình làm việc.

Câu trả lời được xem là tốt nhất là sử dụng phương pháp STAR (STAR methods). Phương pháp này chia tình huống thành 5 loại:

  • S – Situation: Phân tích tình huống hiện tại đang gặp phải (ví dụ team có 2 người bị ốm, hoặc bị covid).
  • T – Task: Giải thích cách bạn muốn giải quyết tình huống. Ví dụ: mục tiêu của bạn là đảm bảo rằng bạn vẫn có thể hoàn thành dự án đúng hạn.
  • A – Action: Lên danh sách các hành động, các phương án giải quyết. Ví dụ như yêu cầu trợ giúp từ nhóm khác, nhờ sự trợ giúp từ các thành viên khác.
  • R – Result: Kết quả đạt được khi áp dụng phương pháp STAR.

phỏng vấn Project Manager

Một số câu hỏi khác có thể chuẩn bị:

  • Những tố chất nào bạn cho là quan trọng đối với vị trí quản lý dự án?
  • Bạn gặp phải dự án nào thất bại?. Nguyên nhân thất bại của dự án đó?

6. Tham khảo thêm về phỏng vấn Project Manager

Để chuẩn bị tốt khi phỏng vấn Project Manager, ứng viên có thể tham khảo thêm thông tin dưới đây!

Cảm ơn bạn đã dành thời gian đọc bài – Thank you for your time – Happy coding!

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

Xem thêm:

Xem thêm nhiều việc làm IT hấp dẫn, lương cao tại TopDev

ReactJS và React Native: Những điểm giống và khác nhau cơ bản

Bài viết được sự cho phép của tác giả Sơn Dương

Hiện nay có nhiều bạn mới bắt đầu học về React Native và đều có những băn khoăn về hai khái niệm: ReactJS và React Native. Hai thằng này có tên gần giống nhau, liệu có phải là cùng một lò sinh ra không? Các viết code và cơ chế hoạt động có giống nhau không?..v.v

Hôm nay, mình sẽ cùng nhau khám phá ReactJs và React Native giống và khác nhau chỗ nào nhé!

Giới thiệu React.js và React Native

React.js (hay còn được gọi là React) là một thư viện JavaScript mã nguồn mở được sử dụng rộng rãi để xây dựng các giao diện người dùng (UI) cho ứng dụng web. React.js cho phép các nhà phát triển xây dựng các thành phần giao diện người dùng có thể tái sử dụng và quản lý trạng thái ứng dụng một cách hiệu quả. Với khả năng render nhanh chóng nhờ sử dụng Virtual DOM, React.js đã trở thành lựa chọn hàng đầu cho việc phát triển các ứng dụng web hiện đại, nơi yêu cầu hiệu suất cao và khả năng mở rộng tốt.

Giới thiệu React.j

Trong khi đó, React Native là một framework phát triển ứng dụng di động đa nền tảng, cũng được phát triển dựa trên cùng một triết lý và cú pháp của React.js. Tuy nhiên, thay vì render ra HTML như React.js, React Native render ra các thành phần giao diện native, cho phép các nhà phát triển xây dựng ứng dụng di động với hiệu suất gần như native cho cả iOS và Android. Điều này có nghĩa là bạn có thể sử dụng JavaScript để phát triển các ứng dụng di động mà không cần phải viết mã riêng biệt cho từng hệ điều hành.

Giới thiệu React Native

Lịch sử ra đời của ReactJS và React Native

ReactJS ra đời khi nào?

ReactJS được phát triển bởi Facebook và lần đầu tiên ra mắt vào năm 2011. Lịch sử của ReactJS bắt đầu từ một vấn đề mà Facebook phải đối mặt vào thời điểm đó. Khi Facebook Ads ngày càng mở rộng và có thêm nhiều tính năng mới, các kỹ sư của Facebook nhận ra rằng việc liên tục cập nhật và thay đổi UI đã làm chậm tiến trình phát triển. Các thay đổi và cập nhật theo từng tầng nội dung buộc các nhà phát triển phải thiết kế lại toàn bộ ứng dụng, dẫn đến việc tiến độ phát triển bị trì hoãn.

Trong bối cảnh đó, một kỹ sư của Facebook là Jordan Walke đã tìm ra giải pháp bằng cách sử dụng XHP (một thư viện component HTML cho PHP) để tạo ra một nguyên mẫu đầu tiên của ReactJS, được gọi là FaxJS. Năm 2011, ReactJS chính thức được sử dụng để phát triển timeline của Facebook, đánh dấu một bước nhảy vọt quan trọng trong việc cải tiến UI và quản lý các cập nhật trên ứng dụng web.

Năm 2012, khi Facebook mua lại Instagram, ReactJS cũng được sử dụng để phát triển timeline của Instagram. Điều này cho thấy tiềm năng to lớn của ReactJS trong việc cải thiện trải nghiệm người dùng và tốc độ phát triển ứng dụng.

Lịch sử ra đời React Native

Cùng với sự thành công của ReactJS, vào năm 2012, Mark Zuckerberg, CEO của Facebook, đã phát biểu: “Sai lầm lớn nhất mà chúng tôi mắc phải với tư cách là một công ty là đặt cược quá nhiều vào HTML thay vì native“. Phát biểu này phản ánh sự hạn chế của các ứng dụng dựa trên HTML5 trong việc cung cấp trải nghiệm người dùng mượt mà và hiệu suất cao như các ứng dụng native.

Từ nhận thức đó, nhu cầu phát triển một framework mới để xây dựng các ứng dụng di động với hiệu suất native nhưng vẫn giữ được tính linh hoạt của JavaScript đã trở thành một lẽ tất yếu. Và đó là cách mà React Native ra đời.

Với sự ra đời của React Native, các lập trình viên giờ đây có thể xây dựng các ứng dụng di động hiệu suất cao mà không cần phải viết hai mã nguồn riêng biệt cho iOS và Android, giúp tiết kiệm thời gian và công sức.

ReactJS và React Native hoạt động như thế nào?

Cả ReactJSReact Native đều mang đến những cách tiếp cận khác nhau để phát triển ứng dụng, mặc dù chúng chia sẻ chung một nền tảng là React. Tuy nhiên, cơ chế hoạt động đằng sau mỗi công nghệ này là khá khác biệt, phù hợp với các mục đích sử dụng cụ thể của chúng.

ReactJS: Sử dụng Virtual DOM

ReactJS: Sử dụng Virtual DOM

ReactJS sử dụng Virtual DOM để tạo ra trải nghiệm người dùng (UX) tuyệt vời. DOM (Document Object Model) là một giao diện lập trình cần thiết, đại diện cho một tài liệu web và nội dung của nó. Khả năng của các thư viện và framework trong việc quản lý DOM có tác động lớn đến cách chúng được sử dụng và hiển thị cuối cùng.

Virtual DOM là một cải tiến đáng kể của ReactJS. Đây là một đại diện ảo của DOM thực. Khi một trạng thái của ứng dụng thay đổi, Virtual DOM tạo ra một bản sao ảo của DOM thực, sau đó so sánh với DOM hiện tại để tìm ra những thay đổi. Thay vì cập nhật toàn bộ DOM, chỉ các phần bị thay đổi mới được cập nhật. Điều này giúp tăng tốc độ xử lý, cải thiện hiệu suất và mang đến trải nghiệm người dùng tốt hơn so với việc cập nhật trực tiếp trên DOM thực.

Ví dụ:

function tick() {
  const element = (
    <div>
      <p>Hello World</p>
    </div>
  );
  ReactDOM.render(element, document.getElementById('root'));
}

setInterval(tick, 1000);

Giải thích:

  • tick() là một hàm tạo ra một phần tử React với nội dung “Hello World”.
  • ReactDOM.render() dùng để render phần tử này vào trong DOM thực tại vị trí có ID là 'root'.
  • setInterval(tick, 1000) sẽ gọi hàm tick() mỗi giây một lần, giúp cập nhật nội dung “Hello World” liên tục.

React Native: Sử dụng Native APIs

Trong khi đó, React Native hoạt động dựa trên các Native APIs để render các thành phần giao diện người dùng. React Native sử dụng Java APIs để render các thành phần trên Android, và Objective-C để viết các thành phần iOS. Nhờ vào việc này, React Native có thể tận dụng các giao diện native, đảm bảo hiệu suất gần như ứng dụng native cho cả hai nền tảng iOS và Android.

Phần còn lại của mã ứng dụng được viết bằng JavaScript, cho phép tùy chỉnh và chia sẻ mã giữa các nền tảng, tối ưu hóa khả năng tái sử dụng thành phần và chia sẻ mã. Điều này giúp giảm đáng kể thời gian và công sức phát triển khi xây dựng các ứng dụng đa nền tảng.

Một điểm khác biệt quan trọng là React Native không sử dụng CSS và HTML như ReactJS. Thay vào đó, các nhà phát triển phải tạo style sheets trong JavaScript để định kiểu cho các thành phần của React Native. Mặc dù cú pháp của các style sheets này có thể trông giống như CSS, nhưng chúng thực chất không hoàn toàn giống nhau. Thêm vào đó, các thẻ HTML thông thường như <div> trong ReactJS được thay thế bằng <view> trong React Native, và <p> trong ReactJS được thay thế bằng <text> trong React Native.

Ví dụ viết một ứng dụng đơn giản với React Native để hiển thị nội dung “Hello World”:

import React, { Component } from 'react';
import { Text, View } from 'react-native';

export default class HelloWorldApp extends Component {
  render() {
    return (
      <View>
        <Text>Hello World</Text>
      </View>
    );
  }
}

Giải thích:

  • import React, { Component } from 'react';import { Text, View } from 'react-native';: Import các thư viện cần thiết.
  • HelloWorldApp là một class component kế thừa từ Component.
  • render() trả về các thành phần UI: ViewText. View tương tự như div trong HTML và Text tương tự như p trong HTML.
  • Ứng dụng sẽ hiển thị “Hello World” dưới dạng text trên màn hình thiết bị di động.

Tuyển dụng React Native lương cao!

4 điểm khác nhau lớn nhất giữa ReactJS và React Native

Sứ mệnh của hai thư viện ReactJs và React Native

ReactJS là một thư viện Javascript được tạo bởi Facebook nhằm giải quyết các vấn đề performance và khả năng tương thích cho các ứng dụng web. Tức là ReactJs là một thư viện front-end dành cho các ứng dụng web.

ReactJS ra đời vào năm 2011, nó đã mang đến một triển vọng mới về rendering pages điều sẽ tạo ra sự linh động và trải nghiệm responsive.

Còn React Native thì sao?

React Native là một framework dùng để phát triển các ứng dụng cho mobile (Cụ thể là Android và IOS). được phát hành sau ReactJS 4 năm, sau khi ReactJS đã tràn ngập khắp giới lập trình web.

ReactJS và React Native chỉ có một điểm tương đồng, còn lại là khác nhau hoàn toàn.

Đó chính là Javascript!

Để trở thành React Native developer có trình độ, bạn phải có một số lượng kiến thức chuyên sâu về JavaScript ES6. Bởi vì ReactJS là cốt lõi của React Native, hiểu biết về cái cũ là chìa khóa cho cái mới.

Tạo một dự án mới

Với ReactJS, developer cần phải lựa chọn các module tốt nhất và cần thiết nhất trước khi bắt đầu một dự án.

Trong khi React Native cung cấp mọi thứ cần thiết. Bạn có thể viết ngay một ứng dụng bằng React Native chỉ với một dòng command. Điều này làm cho người mới chuyển sang học React Native đỡ khó khăn rất nhiều.

HTML – điểm khác biệt lớn

React Native không sử dụng HTML để hiển thị giao diện ứng dụng(lý do đơn giản là nếu sử dụng HTML thì React Native có khác gì tạo web app rồi nhúng vào webview không? tốc độ sẽ lại chậm như rùa ^_^)

Thay vào đó, React Native cung cấp các component hoạt động cũng tương tự, và hầu hết chúng có thể được biến đổi thành các phần tử tương đương trong HTML

Ví dụ:

<View>  tương đương với <div>
<Text> biến thành <span> và <p>.

Do đó, các thư viện được sử dụng với ReactJS không thể sử dụng trong React Native. React Native không sử dụng thẻ CSS hoặc sử dụng chúng theo cách khác, tương tự như Flexbox.

Gestures và animations

React Native cung cấp một thư viện tương tự như Velocity.js có tên là Animated. Nó còn cung cấp LayoutAnimation, nhưng chỉ có iOS mới hỗ trợ tốt.

Để tương tác với cử chỉ của người dùng, React Native đã cung cấp PanResponder. Khi áp dụng nó vào một View, bạn có thể kích hoạt xử lý các sự kiện touch của người dùng

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

So sánh ưu nhược điểm của React và React Native

Dưới đây là bảng so sánh về ưu và nhược điểm của ReactJS và React Native:

Ưu nhược điểm của React

Ưu điểm Nhược điểm
Hiệu suất cao: Sử dụng Virtual DOM giúp tăng hiệu suất và giảm thời gian cập nhật UI. Hiệu suất thấp hơn native: Dù nhanh, nhưng hiệu suất vẫn thấp hơn so với các ứng dụng native, đặc biệt với các tác vụ phức tạp.
Hỗ trợ SEO tốt: Tối ưu hóa cho SEO, giúp trang web dễ dàng được Google index. Quản lý DOM phức tạp: Với các ứng dụng lớn và nhiều thành phần UI, việc quản lý DOM có thể trở nên phức tạp.
Dễ dàng học hỏi: Dễ học đối với người quen thuộc với JavaScript, nhanh chóng áp dụng. Không hỗ trợ CSS hoàn toàn: Kết hợp CSS nhưng không hỗ trợ đầy đủ, gây khó khăn trong việc định kiểu phức tạp.
Tái sử dụng mã: Component có thể tái sử dụng giữa các dự án, tiết kiệm thời gian phát triển. Không phù hợp cho ứng dụng di động: Chủ yếu dành cho phát triển web, không phải là lựa chọn tốt cho phát triển ứng dụng di động.
Cộng đồng lớn: Có cộng đồng rộng lớn với nhiều tài liệu, thư viện và công cụ hỗ trợ. Thời gian tải ban đầu: Với ứng dụng lớn, thời gian tải ban đầu có thể kéo dài do cần tải nhiều component.
Phát triển nhanh: Các công cụ như create-react-app giúp khởi động dự án dễ dàng.

Ưu nhược điểm của React Native

Ưu điểm Nhược điểm
Hiệu suất gần native: Thành phần UI native được biên dịch trực tiếp thành mã native, cung cấp hiệu suất cao như ứng dụng native. Hiệu suất hạn chế với tác vụ phức tạp: Gần đạt hiệu suất của native, nhưng có thể gặp giới hạn với tác vụ phức tạp hoặc yêu cầu đồ họa cao.
Tái sử dụng mã giữa các nền tảng: Có thể tái sử dụng mã và chia sẻ giữa iOS và Android. Hỗ trợ native không đầy đủ: Không hỗ trợ đầy đủ tất cả các thành phần native, đôi khi cần mã native hoặc thư viện bên thứ ba.
Phát triển đa nền tảng: Cho phép phát triển ứng dụng cho cả iOS và Android từ cùng một mã nguồn. Không hỗ trợ HTML/CSS: Không sử dụng HTML và CSS, phải tạo style sheets trong JavaScript, đôi khi khó tùy chỉnh giao diện như CSS thuần.
Cộng đồng hỗ trợ mạnh mẽ: Cộng đồng React Native phát triển nhanh với nhiều tài liệu và thư viện hỗ trợ. Debug và testing phức tạp: Cần kiểm tra cả mã JavaScript và mã native, có thể phức tạp hơn so với phát triển web.
Nhanh chóng phát triển ứng dụng di động: Các công cụ như Expo giúp khởi động và phát triển dễ dàng. Thời gian học tập dài hơn: Yêu cầu kiến thức về lập trình native như Java, Swift để tối ưu hóa và mở rộng ứng dụng.

Tóm lại

Cả ReactJS và React Native đều là những công cụ tuyệt vời để xây dựng và chuyển đổi nhanh UI phức tạp từ phiên bản cũ sang phiên bản mới. Điều này không khó cho những ai thích JavaScript. Tuy nhiên bạn cần nhớ là:

  • React Native là một framework trong khi ReactJS là một thư viện JavaScript
  • React Native không sử dụng HTML
  • ReactJS và React Native đều dựa trên component-based
  • Bạn có thể viết các native mobile components trong React Native để tạo cảm giác là ứng dụng này thực sự dành cho thiết bị di động.

Ngoài ra, bạn có thể sử dụng hầu hết các công cụ dành cho ReactJS trong khuôn khổ React Native. Ví dụ: Công cụ Chrome Dev để hiển thị console logs hay inspecting để kiểm tra các yêu cầu mạng hoặc Redux DevTools để kiểm tra trạng thái của Redux store.

Bạn đã phân biệt được ReactJS và React Native chưa? Hãy cho mình biết ý kiến của bạn về hai “anh em cùng cha này ” nhé? 

Bài viết do đội ngũ TopDev biên soạn và tham khảo từ vntalking.com

Đừng bỏ lỡ việc làm IT mới nhất trên TopDev!

Xem thêm:

Database Administrator là gì? Làm thế nào để trở thành một DBA giỏi?

Database Administrator là gì? Làm thế nào để trở thành DBA giỏi?

Trong thời đại số hóa ngày càng phát triển như hiện nay, dữ liệu được coi là tài sản vô giá của các tổ chức và doanh nghiệp. Vì thế, việc quản lý và bảo vệ dữ liệu trở thành một nhu cầu cấp thiết. Đó là lý do vì sao vai trò của Database Administrator (DBA) ngày càng trở nên quan trọng. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết hơn về vai trò của DBA, các nhiệm vụ và kỹ năng cần thiết để trở thành một DBA thành công.

Thế nào là một Database Administrator (DBA)?

Database Administrator

Database Administrator (DBA) là một chuyên gia quản trị cơ sở dữ liệu, có trách nhiệm quản lý và bảo vệ cơ sở dữ liệu của một tổ chức hoặc doanh nghiệp. Các nhiệm vụ của một DBA bao gồm thiết kế, triển khai, vận hành, bảo trì, sao lưu và khôi phục cơ sở dữ liệu. DBA cũng phải đảm bảo tính toàn vẹn, an ninh và hiệu suất của cơ sở dữ liệu, đồng thời là người đóng vai trò quan trọng trong việc hỗ trợ các ứng dụng và người dùng cuối sử dụng dữ liệu.

Công việc cụ thể của một Database Administrator

Công việc của một Database Administrator (DBA) bao gồm nhiều tác vụ khác nhau, ví dụ như:

  • Thiết kế cơ sở dữ liệu: DBA phải thiết kế cấu trúc cơ sở dữ liệu, lựa chọn các phương thức lưu trữ và cấu hình hệ quản trị cơ sở dữ liệu (DBMS) phù hợp với nhu cầu của tổ chức.
  • Triển khai cơ sở dữ liệu: DBA phải cài đặt và cấu hình hệ quản trị cơ sở dữ liệu, tạo ra các bảng, quan hệ, chỉ mục và khóa để đảm bảo tính toàn vẹn và hiệu suất của cơ sở dữ liệu.
  • Vận hành cơ sở dữ liệu: DBA phải đảm bảo rằng cơ sở dữ liệu luôn hoạt động một cách ổn định và hiệu quả. Điều này bao gồm quản lý bộ nhớ đệm, giám sát tài nguyên và xử lý các sự cố kỹ thuật.
  • Bảo trì cơ sở dữ liệu: DBA phải thực hiện các tác vụ bảo trì như kiểm tra, sửa chữa và tối ưu hóa cơ sở dữ liệu. Nó cũng bao gồm việc tạo sao lưu và khôi phục cơ sở dữ liệu, cập nhật phần mềm và bảo mật.
  • Tối ưu hóa hiệu suất: DBA phải tối ưu hóa hiệu suất của cơ sở dữ liệu bằng cách tối ưu hóa câu lệnh truy vấn, sử dụng các chỉ mục phù hợp và điều chỉnh cấu hình hệ thống.
  • Giám sát và báo cáo: DBA phải giám sát và báo cáo về hiệu suất, sử dụng tài nguyên và các sự cố trong cơ sở dữ liệu. Việc này giúp DBA phát hiện các vấn đề sớm và đưa ra giải pháp để giải quyết chúng.
  • Hỗ trợ người dùng: DBA phải hỗ trợ người dùng trong việc truy cập và sử dụng cơ sở dữ liệu một cách hiệu quả. Điều này bao gồm giải đáp các câu hỏi, đào tạo người dùng và cung cấp các hướng dẫn sử dụng.

  Top 10 Hệ quản trị cơ sở dữ liệu (DBMS) phổ biến

Database Administrator cần có những kỹ năng gì?

Database Administrator skills
Nguồn ảnh: https://www.freelancermap.com/blog/what-does-database-administrator-do/

Để trở thành một Database Administrator (DBA) giỏi, bạn cần phải có những kỹ năng sau đây:

  • Kiến thức về cơ sở dữ liệu: DBA cần phải hiểu về cấu trúc cơ sở dữ liệu, các phương thức lưu trữ, mô hình quan hệ và ngôn ngữ truy vấn SQL.
  • Kiến thức về hệ thống và mạng: DBA cần phải hiểu về hệ thống máy tính, hệ điều hành, mạng và bảo mật để có thể thiết lập và quản lý các máy chủ và mạng kết nối cơ sở dữ liệu.
  • Kỹ năng quản lý dự án: DBA cần phải có khả năng quản lý dự án để có thể lập kế hoạch, triển khai và vận hành cơ sở dữ liệu một cách hiệu quả.
  • Kỹ năng giải quyết vấn đề: DBA cần phải có khả năng phân tích và giải quyết các vấn đề kỹ thuật trong cơ sở dữ liệu, từ việc sửa lỗi đến tối ưu hóa hiệu suất.
  • Kỹ năng lập trình: DBA cần phải hiểu về các ngôn ngữ lập trình để có thể tùy chỉnh và viết các công cụ và chương trình để quản lý cơ sở dữ liệu.
  • Bên cạnh đó, một Database Administrator cần phải thông thạo nhiều ngôn ngữ truy vấn, bao gồm: PL/SQL, SQL/XML (ngôn ngữ truy vấn có cấu trúc), OQL (ngôn ngữ truy vấn đối tượng), CQL (ngôn ngữ truy vấn Cassandra).

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

Muốn trở thành DBA nên bắt đầu từ đâu?

Nếu bạn muốn theo nghề DBA, có một số bước cơ bản để bắt đầu:

  • Học tập kiến thức cơ bản về cơ sở dữ liệu: Bạn cần phải nắm vững kiến thức về cơ sở dữ liệu, bao gồm các khái niệm về lưu trữ, truy xuất, sửa đổi và xóa dữ liệu. Bạn có thể bắt đầu học tập qua các khóa học trực tuyến, các sách và tài liệu về cơ sở dữ liệu.
  • Học SQL: SQL là ngôn ngữ truy vấn cơ sở dữ liệu phổ biến nhất, vì vậy hãy học và luyện tập kỹ năng sử dụng SQL để truy vấn, sửa đổi và xóa dữ liệu.
  • Tìm hiểu về các hệ quản trị cơ sở dữ liệu (DBMS): Các hệ quản trị cơ sở dữ liệu như MySQL, Oracle, SQL Server, PostgreSQLMongoDB là các công cụ quan trọng mà DBA sử dụng hàng ngày.
  • Học các kỹ năng liên quan đến quản lý dữ liệu: Bạn cần phải biết cách sao lưu dữ liệu, phục hồi dữ liệu và bảo vệ dữ liệu khỏi sự tấn công và mất mát.
  • Tham gia các khóa học và chứng chỉ về DBA: Các khóa học và chứng chỉ liên quan đến DBA như Oracle Certified Associate, MCSA: SQL Server, và MongoDB Certified DBA sẽ giúp bạn nắm vững các kỹ năng và kiến thức cần thiết để trở thành một DBA chuyên nghiệp.
  • Tìm kiếm các cơ hội thực tập hoặc làm việc: Hãy tìm kiếm các cơ hội thực tập hoặc làm việc liên quan đến DBA để có thể thực hành và tích lũy kinh nghiệm.

  ORM và SQLAlchemy — ‘chiếc đũa thần’ trong quản trị cơ sở dữ liệu

Những bước trên là những bước cơ bản để bắt đầu theo đuổi nghề DBA. Tuy nhiên, để trở thành một DBA chuyên nghiệp, bạn cần phải tiếp tục học tập, rèn luyện kỹ năng và tích lũy kinh nghiệm trong lĩnh vực này.

Cơ hội nghề nghiệp của Database Administrator

Cơ hội nghề nghiệp của Database Administrator

Với sự phát triển nhanh chóng của công nghệ thông tin và dữ liệu ngày nay, vai trò của Database Administrator (DBA) ngày càng trở nên quan trọng hơn bao giờ hết. Vì vậy, cơ hội nghề nghiệp của DBA cũng rất tiềm năng và hấp dẫn.

Nếu lựa chọn theo đuổi Database Administrator, bạn có thể làm các công việc sau đây:

  • Quản lý cơ sở dữ liệu cho các doanh nghiệp: Đây là công việc chính của DBA, nơi họ phải quản lý và bảo vệ cơ sở dữ liệu của doanh nghiệp.
  • Tư vấn về cơ sở dữ liệu cho các công ty: DBA có thể làm việc như một chuyên gia tư vấn để giúp các công ty thiết lập và vận hành hệ thống cơ sở dữ liệu.
  • Giảng dạy và đào tạo: DBA có thể trở thành giáo viên hoặc huấn luyện viên để giảng dạy các kỹ năng về cơ sở dữ liệu cho sinh viên hoặc nhân viên trong các doanh nghiệp.
  • Phát triển phần mềm quản lý cơ sở dữ liệu: DBA có thể phát triển các công cụ quản lý cơ sở dữ liệu để giúp đỡ các DBA khác trong việc quản lý cơ sở dữ liệu.
  • Tham gia vào các dự án liên quan đến Big Data: Với sự gia tăng của Big Data, DBA có thể tham gia vào các dự án liên quan đến phân tích dữ liệu, khai thác dữ liệu, và cải tiến hiệu suất của cơ sở dữ liệu.
  • Quản lý cơ sở dữ liệu đám mây: Với sự phát triển của công nghệ đám mây, DBA cũng có thể trở thành một chuyên gia về quản lý cơ sở dữ liệu đám mây cho các doanh nghiệp.
  • Nghiên cứu và phát triển mới: DBA có thể tham gia vào các dự án nghiên cứu và phát triển mới trong lĩnh vực cơ sở dữ liệu, đặc biệt là liên quan đến các công nghệ mới như Blockchain hay Machine Learning.

Tóm lại

Database Administrator là người chịu trách nhiệm quản lý và bảo vệ cơ sở dữ liệu cho các tổ chức, và đó là một công việc quan trọng trong môi trường kinh doanh hiện đại. Điều này đòi hỏi DBA phải có nhiều kỹ năng và năng lực, từ kiến thức kỹ thuật sâu rộng đến khả năng phân tích, giải quyết vấn đề, và giao tiếp hiệu quả.

Ngoài ra, cơ hội nghề nghiệp của DBA rất đa dạng và tiềm năng, từ quản lý cơ sở dữ liệu cho các doanh nghiệp đến tham gia vào các dự án liên quan đến Big Data hay cơ sở dữ liệu đám mây. Với sự phát triển không ngừng của công nghệ thông tin và dữ liệu, nghề DBA đang trở thành một trong những nghề hot trong ngành công nghệ thông tin, và cơ hội nghề nghiệp của DBA sẽ chỉ tiếp tục tăng lên trong tương lai.

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

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

Câu hỏi phỏng vấn Solution Architect không nên bỏ lỡ

Câu hỏi phỏng vấn Solution Architect không nên bỏ lỡ

Solution Architect là một vị trí rất quan trọng trong các tổ chức, công ty phần mềm hay phát triển sản phẩm, đóng vai trò quyết định đến sự thành công của một dự án hay một sản phẩm. Vị trí Solution Architect thường đòi hỏi kinh nghiệm làm việc ở trong ngành từ trên 5 năm cùng với những kiến thức chuyên sâu liên quan đến kiến trúc hệ thống và các nguyên tắc thiết kế. Hôm nay chúng ta cùng nhau điểm qua những câu hỏi phỏng vấn mà nhà tuyển dụng thường hỏi cho vị trí Solution Architect nhé.

Solution Architect là gì?

Solution Architect

Solution Architect (SA) hay kiến trúc sư giải pháp phần mềm là người có vai trò đưa ra giải pháp, tính năng của sản phẩm phục vụ và đáp ứng theo yêu cầu của khách hàng. Đối với một sản phẩm phần mềm luôn có những yêu cầu về mặt chức năng (functional) và phi chức năng (non-funtional); SA sẽ phải đưa ra giải pháp dành cho kiến trúc nhằm đáp ứng được các yêu cầu trên, đồng thời còn phải khả thi với các yếu tố về chi phí, công nghệ, con người phù hợp với tổ chức của mình.

Trong quá trình phát triển dự án, SA ban đầu cũng tham gia vào giai đoạn lấy yêu cầu từ khách hàng; tiếp đó là công việc đưa ra giải pháp từ những yêu cầu trên. Quá trình thực thi dự án, Solution Architect cũng tham gia vào quá trình phân tích nghiệp vụ như một BA (Business Analyst). Đối với những dự án phức tạp và quy mô lớn, có thể nói SA đóng vai trò quan trọng ảnh hưởng đến sự thành công trong suốt quá trình phát triển của sản phẩm.

Nhiệm vụ của một Solution Architect là gì?

Một Solution Architect sẽ có những nhiệm vụ như dưới đây:

  • Tham gia phân tích nghiệp vụ và đề xuất điều chỉnh nghiệp vụ nếu cần nhằm tăng giá trị, tính khả thi của sản phẩm, dự án hay phần mềm.
  • Đưa ra các giải pháp kiến trúc có thể đáp ứng được các yêu cầu về tính năng và phi tính năng của sản phẩm và khách hàng.
  • Tham gia triển khai phát triển sản phẩm từ phần lõi (core), những phần xử lý phức tạp hay đưa ra các prototype về code cho team phát triển.
  • Chuyển giao lại cho Team phát triển về giải pháp, công nghệ hay kiến trúc của hệ thống.
  • Xử lý các vấn đề khó phát sinh liên quan đến kiến trúc, giải pháp trong quá trình phát triển hay vận hành.

  Trở thành Solution Architect có khó không?

  Đâu là điểm khác biệt giữa Solution Architect và Software Architect?

Phương pháp thiết kế hướng miền Domain Driven Design là gì?

Domain Driven Design (DDD) là một cách tiếp cận để phát triển những phần mềm thông qua sự kết nối chặt chẽ giữa việc triển khai ứng dụng với sự phát triển của mô hình kinh doanh

Cụ thể là:

  • Đặt trọng tâm dự án vào nghiệp vụ chính (domain) và các logic của nghiệp vụ.
  • Mô hình hóa là trọng tâm, nền tảng cho các thiết kế phức tạp để khách hàng cùng lập trình viên đều có thể hiểu được vấn đề.
  • Các vấn đề chung được xác định và giải quyết nhờ sự cộng tác giữa nhóm phát triển và các chuyên gia nghiệp vụ.

Giải thích về nguyên tắc SOLID

nguyên tắc SOLID
Nguồn https://javascript.plainenglish.io/solid-principle-in-react-11272c41b529

SOLID là viết tắt của 5 nguyên tắc thiết kế trong công nghệ phần mềm giúp làm cho các thiết kế hướng đối tượng trở nên dễ hiểu, linh hoạt và dễ bảo trì hơn. 5 nguyên tắc bao gồm:

  • Single responsibility principle: Mỗi class chỉ nên giữ 1 trách nhiệm duy nhất
  • Open/closed principle: Có thể mở rộng 1 class thoải mái, nhưng không được sửa đổi bên trong class đó
  • Liskov Substitution principle: trong một chương trình, các object của class con có thể thay đổi class cha mà không làm thay đổi tính đúng đắn của chương trình
  • Interface Segregation principle: Thay vì dùng một interface lớn, ta nên tách thành nhiều interface nhỏ cho từng mục đích cụ thể
  • Dependency Inversion principle: Các module cấp cao không nên phụ thuộc vào modules cấp thấp mà cả 2 nên phụ thuộc vào abstraction

Tham khảo thêm các vị trí tuyển dụng Solution Architect lương cao tại Topdev

Nêu một số nguyên tắc thiết kế phần mềm khác mà bạn biết

Một số nguyên tắc thiết kế phần mềm thường được áp dụng hay kết hợp trong dự án:

  • Nguyên tắc YAGNI: You Aren’t Gonna Need It – chỉ cần tập trung xây dựng chức năng để giải quyết vấn đề hiện tại, vấn đề mà khách hàng cần giải quyết mà không cần lãng phí thời gian vào một chức năng “Có thể sử dụng đến”
  • Nguyên tắc KISS: Keep It Simple Stupid – Mục tiêu trọng tâm trong thiết kế là sự đơn giản và rõ ràng; cần tránh những thứ phức tạp không cần thiết.
  • Nguyên tắc DRY: Don’t Repeat Yourself – Đừng lặp lại bất cứ một đoạn mã, đoạn code nào mà hãy đóng gói nó thành những phương thức riêng để khi nào cần thì chỉ cần gọi tên nó ra.

So sánh kiến trúc Monolith và Microservice

So sánh kiến trúc Monolith và Microservice

Monolith và Microservice là 2 loại kiến trúc phần mềm (thông thường áp dụng cho Web) phổ biến hiện nay. 

  • Monolith hay kiến trúc một khối là mẫu thiết kế xây dựng hệ thống thành một đơn vị phần mềm không thể chia tách; thông thường sẽ bao gồm cơ sở dữ liệu (databases), giao diện người dùng (frontend) và ứng dụng phía máy chủ (backend). Tất cả các thành phần của phần mềm được hợp nhất và tất cả các chức năng của phần mềm được quản lý ở một nơi.
  • Microservice là mẫu kiến trúc xây dựng hệ thống từ các component đảm nhiệm từng vai trò cụ thể khác nhau, liên kết giữa các component này khá lỏng lẻo (loose coupling). Các components có thể được phát triển, kiểm thử, deploy, cập nhật,… một cách độc lập mà không ảnh hưởng đến các component khác. Ngoài ra các components có thể được phát triển, xây dựng bằng các ngôn ngữ lập trình, công nghệ riêng mà không bị ràng buộc từ hệ thống chung.

Trong thực tế dự án, Monolith thường được lựa chọn cho các dự án nhỏ và vừa nhờ tính đơn giản từ việc phát triển và bảo trì. Đối với các dự án lớn, Microservice là một xu hướng hiện nay, giúp các tổ chức dễ dàng quản trị và giảm sự phụ thuộc rủi ro giữa nhiều dịch vụ khác nhau.

Những chứng chỉ phổ biến dành cho Solution Architect

  • Amazon AWS Certified Solutions Architect: Chứng chỉ dành cho các kiến trúc sư giải pháp của AWS. Có 3 levels cho chứng chỉ này: Foundational, Associate và Professional.
  • Azure Solutions Architect Expert: Chứng chỉ chuyên môn về thiết kế và triển khai các giải pháp chạy trên Microsoft Azure bao gồm các khía cạnh như compute, mạng, lưu trữ và bảo mật.
  • Chứng chỉ ITIL: chứng chỉ chuyên gia công nghệ thông tin với 5 mức cơ bản. Với một SA thì có 2 levels có giá trị cao là ITIL Master và ITIL Expert.
  • Google Cloud Architect Certified: Chứng chỉ xác nhận kỹ năng làm việc với nền tảng đám mây Google Cloud dành cho các Solution Architect.

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn mà bạn có thể gặp phải khi ứng tuyển vị trí Solution Architect. Đây là vị trí có mức thu nhập và đãi ngộ cao trong ngành IT, vì vậy các ứng viên cũng cần có kinh nghiệm và kỹ năng tốt liên quan đến thiết kế và các giải pháp công nghệ phần mềm. Hy vọng bài viết này hữu ích dành cho bạn và hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

WebAssembly – Tương lai của các ứng dụng Web

WebAssembly – Tương lai của các ứng dụng Web

Nhắc đến lập trình ứng dụng Web thì gần như mặc định chúng ta nghĩ ngay đến 3 loại ngôn ngữ là HTML, CSSJavaScript. Mặc dù được cải tiến rất nhiều cùng với sự phát triển mạnh mẽ của JavaScript nhưng Web app vẫn chưa bao giờ được xem là đối thủ khi so sánh với Native app ở khía cạnh hiệu năng. Từ hạn chế này thì các ông lớn nắm giữ trình duyệt phổ biến nhất hiện tại đã hợp tác cho ra một ngôn ngữ mới đó là WebAssembly. Bài viết hôm nay chúng ta cùng tìm hiểu về ngôn ngữ này xem liệu đây có phải là tương lai của các ứng dụng Web hay không nhé.

WebAssembly là gì?

WebAssembly

WebAssembly viết tắt là Wasm là một định dạng tập lệnh nhị phân cho các máy ảo dựa trên ngăn xếp (stack-based), nó được thiết kế để có thể biên dịch từ các ngôn ngữ bậc cao như C/C++/Rust và thực thi trên các ứng dụng Web ở cả client và server.

Wasm là thành quả của sự hợp tác giữa những ông lớn công nghệ sở hữu trình duyệt phổ biến nhất hiện nay gồm Microsoft, Apple, Google, Mozilla,… điều đó cũng có nghĩa là Wasm sẽ có thể hỗ trợ tốt nhất trên các trình duyệt này trong tương lai. 

WebAssembly được ra mắt từ 2015, hiện nay thì version 1.0 đã được triển khai trên 4 trình duyệt phổ biến nhất Firefox, Chrome, Safari và Edge. Tháng 4/2022, version 2.0 của Wasm được công bố ở trạng thái dự thảo hứa hẹn sẽ ra mắt trong tương lai gần.

WebAssembly hoạt động thế nào?

Với các trình duyệt hiện tại, để máy tính có thể hiểu và thực thi được các đoạn code bằng JavaScript thì các trình duyệt được trang bị JavaScript Engine để chuyển đổi sang mã máy. Cụ thể chúng ta có các JS Engine của các trình duyệt phổ biến:

  • V8: JS Engine dành cho trình duyệt Chrome hay các trình duyệt sử dụng nhân Chromium
  • JavaScriptCore: được Apple sử dụng cho Safari
  • SpiderMonkey: JS Engine sử dụng trong trình duyệt Firefox
  • Chakra/Chakra Core: JScript Engine được sử dụng cho IE (Internet Explore) và Microsoft Edge trước đây

WebAssembly

Ở đây những dòng code JS (viết trong các JS files) sẽ được đọc và thực thi theo cơ chế thông dịch – tức là đọc từng dòng code, dịch trực tiếp ra mã máy để máy tính hiểu và thực thi.

WebAssembly cũng sẽ được thực thi một cách tương tự như trên, tuy nhiên ưu điểm của nó chính là việc định dạng nhị phân ngay từ đầu vào giúp tốc độ đọc code nhị phân của máy ảo nhanh hơn nhiều cũng như việc dịch code Wasm ra mã máy tương ứng theo từng loại hệ điều hành và CPU thiết lập trước đem lại ít overhead hơn. 

WebAssembly

Với WebAssembly, mã nguồn (source code) sẽ được viết bằng các ngôn ngữ lập trình bậc cao như C/C++, Rust,… sau đó biên dịch về định dạng nhị phân (.wasm). Những file này sẽ được nạp vào trình duyệt rồi nhờ các JavaScript Engine biên dịch tạo ra mã máy để thực thi.

  Mô hình ngôn ngữ LaMDA – Công nghệ đứng sau chatbot AI Bard của Google

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

Trạng thái hiện tại

WebAssembly sinh ra với sứ mệnh là giải quyết bài toán hiệu năng của JavaScript, tận dụng sức mạnh tính toán ở phía thiết bị của người dùng, đặc biệt là những tác vụ cần tương tác với phần cứng hoặc xử lý đa phương tiện. WASM được thiết kế dành cho các JavaScript Engine, điều đó cũng có nghĩa là nó không thay thế cho JavaScript mà được xem như là sự bổ sung và cải tiến. Phiên bản 1.0 hiện tại thì WASM vẫn cần JavaScript để thực thi.

WebAssembly

Về hiệu năng, trên lí thuyết thì việc dịch các bytecode của WASM sẽ mang lại tốc độ nhanh hơn gấp 20 lần so với quá trình tương tự với JavaScript. Mặc dù vậy việc tối ưu WASM sẽ phụ thuộc vào sự hỗ trợ của JavaScript Engine trên từng trình duyệt. Như biểu đồ so sánh hiệu năng ở trên, hiện tại Firefox đang là trình duyệt hỗ trợ WASM tốt nhất, các trình duyệt Chrome và Edge vẫn đang trong quá trình cập nhật thêm.

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

Cách sử dụng WebAssembly

Nếu bạn muốn thử nghiệm một đoạn code WebAssembly thì hãy đi theo các bước sau:

  • Viết đoạn mã code bằng ngôn ngữ C, C++ sử dụng IDE hỗ trợ WebAssembly như WebAssembly Explorer.
  • Biên dịch source code bạn viết thành WebAssembly, đầu ra sẽ là những file có đuôi là .wasm (trình biên dịch được IDE hỗ trợ sẵn).
  • Tích hợp file .wasm vào dự án Web của bạn, cụ thể là bạn có thể để chung thư mục với các file index.html (HTML), style.css (CSS) hay script.js (JavaScript).
  • Trong phần xử lý JavaScript của Web, chúng ta thực hiện load các file .wasm thông qua function fetch và gọi các function đã được viết trong WebAssembly. JavaScript sẽ giúp chúng ta load ra các function đó và thực thi chúng trên trình duyệt.

WebAssembly

Kết bài

Tuy hiện tại WebAssembly mới chỉ đang ở giai đoạn sản phẩm tối thiểu, mang tính chất thử nghiệm hơn là việc áp dụng trong thực tế dự án; nhưng rõ ràng WASM có một tương lai hứa hẹn và đảm bảo nhờ sự chung tay của các ông lớn đứng sau các trình duyệt phổ biến. Tương lai của WebAssembly nếu giải quyết được vấn đề hiệu năng đặt ra của Web app thì không chỉ giúp nó sánh ngang được với Native app mà còn mở ra tiềm năng cho việc sử dụng rất nhiều ngôn ngữ lập trình khác nhau từ C, Java, Python,… cũng có thể làm Web một cách trực tiếp. Chúng ta sẽ không cần phải chờ đợi lâu nữa vì version 2.0 của WebAssembly đang ở bản dự thảo (Draft version) hứa hẹn sẽ ra mắt trong tương lai gần. 

Cảm ơn các bạn đã đọc bài viết, hẹn gặp lại các bạn trong những bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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


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.6374.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

 

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

Top 5 câu hỏi phỏng vấn Scrum Master “khó nhằn” & cách trả lời

Top 5 câu hỏi phỏng vấn Scrum Master

Scrum master là vị trí quan trọng trong team phát triển phần mềm, vậy phỏng vấn Scrum master có gì khó? Những kiến thức nào cần được trình bày khi bạn phỏng vấn vị trí Scrum master?

Tất cả sẽ được liệt kê qua 3 phần của bài viết. Phần 1 do nội dung khá giới hạn nên gửi tới anh em 5 câu hỏi trước.

Phỏng vấn scrum masterVâng, anh em không có gì đâu phải trầm trồ

1. Sự khác biệt giữa Agile và Scrum là gì?

Câu hỏi thứ nhất phỏng vấn Scrum Master đề cập tới định nghĩa. Phân biệt sự khác nhau giữa Agile và Scrum. Vậy chúng có gì giống và khác nhau.

Agile Scum
Là một tập hợp các nguyên tắc lặp đi lặp lại và tăng dần. Nó là triển khai của Agile methodology (phương pháp Agile)
Nó phù hợp cho nhóm nhỏ các thành viên đều là Senior Được sử dụng cho các nhóm mà sản phẩm hoặc yêu cầu cần sự thay đổi liên tục
Project head đảm nhận các nhiệm vụ quan trọng đối với thành công hay thất bại của dự án Không có leader, các vấn đề được xử lý bởi scrum master và các thành viên (member)
Nêu có các thay đổi, các thay đổi sẽ khó cập nhật nhanh chóng Nhóm có thể xử lý nhanh và đối ứng các thay đổi
Yêu cầu gửi demo cho end-user nhiều lần Cung cấp các bản demo theo từng Sprint cho người dùng cuối

Vì là kiến thức cơ bản nên anh em có thể chuẩn bị thêm một số câu hỏi

  • Định nghĩa các role trong scrum
  • Product backlog và Sprint backlog khác gì nhau?
  • Scrum ban là gì?

  Quản lý dự án theo Agile và Scrum cho người mới bắt đầu
  Quy trình phát triển phần mềm

Phỏng vấn scrum master

2. Sprint 0 và Spike là gì?

Câu hỏi thứ hai phỏng vấn Scrum master vẫn liên quan tới định nghĩa. Tuy là câu hỏi dễ nhưng không nhiều Scrum master áp dụng Sprint 0 vào thực tế khi phát triển phần mềm.

Về định nghĩa thì”

Sprint 0 refers to the small amount of effort put in to create a rough skeleton of the product backlog. It also includes insights towards estimating the release of products. Sprint 0 is required for: Sprint 0 đề cập tới lượng nhỏ nỗ lực của team để tạo ra phần thô cho product backlog. Sprint 0 yêu cầu hiểu biết sâu sắc về quy trình phát triển sản phẩm. Thường thì Sprint 0 sẽ bắt buộc trong một số trường hợp sau:

  • Tạo khung cho dự án
  • Dữ cho thiết kế đơn giản
  • Định nghĩa một số stories cơ bản
  • Dự án phần mềm không có quá nhiều yêu cầu về mặt kĩ thuật

Phỏng vấn scrum master

Spike là tập hợp một số hoạt động liên quan tới research, investigation, POCs, giúp giảm rủi ro khi bước vào phát triển phần mềm thực tế.

Một số câu hỏi anh em có thể xem thêm chuẩn bị cho phần này:

  • Scrum of Scrums là gì?
  • User-Story Mapping là gì?

3. Những kĩ năng chính cần có của Scrum Master?

Câu hỏi thứ 3 phỏng vấn Scrum master đề cập tới kỹ năng cần có của Scrum master. Câu hỏi này ngoài những định nghĩa thông thường theo sách vở. Anh em có thể trình bày thêm những tố chất mà Scrum master cần có để tham gia dự án.

Một số kĩ năng chính cần có của  bao gồm:

  • Hiểu biết sâu về các khái niệm Scrum, mô hình Agile
  • Các kỹ năng liên quan đến tổ chức, đội nhóm
  • Triển khai cho team theo mô hình Scrum, grow up toàn bộ team sau một thời gian ứng dụng Scrum
  • Xử lý xung đột trong team, giải quyết và lên phương án giải quyết các vấn đề cùng team

Phỏng vấn scrum master

Một số câu hỏi anh em có thể tham khảo và chuẩn bị cho phần này:

  • Bạn xử lý xung đột trong team như thế nào?
  • Làm sao để xác định đúng Velocity của một team?

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

4. Nếu một team đang gặp khó khăn, bạn sẽ làm gì để giúp họ?

Câu hỏi phỏng vấn Scrum master thứ 4 liên quan tới kinh nghiệm thực tế của scrum master. Hơn nữa vị trí này đòi hỏi cách xử lý, cũng như ứng xử trong team cực kì linh hoạt.

Chính vì vậy, câu hỏi này nhắm tới kĩ năng thực tế, giải quyết những vấn đề đã gặp trong thực tế khi làm việc.

Câu trả lời có thể đưa ra theo trình dự dưới đây:

  • Xác định vấn đề gây ra khó khăn. Tìm hiểu nguyên nhân gốc rễ
  • Tìm giải pháp, gặp gỡ từng thành viên trong nhóm để tìm hiểu cặn kẽ hơn
  • Tổ chức họp để nêu giải pháp và lấy ý kiến của tất cả các thành viên trong nhóm

Câu trả lời cần nêu bật lên được Scrum Master đã cố gắng đảm bảo rằng tất cả mọi người hiểu được tầm quan trọng của sự hợp tác và giao tiếp trong team.

Một số câu hỏi tình huống khác anh em có thể tham khảo qua:

  • Đưa ra ví dụ về thời điểm bạn giúp đỡ team trải qua khó khăn, thử thách.
  • Bạn mô tả về vai trò của scrum master trong nhóm như thế nào?

5. Làm thế nào để giao tiếp khi có nhiều Scrum team?

Câu hỏi cuối cùng phỏng vấn Scrum master liên quan tới việc scale up. Với một team, anh em làm tốt. Nhưng nếu dự án lớn và có nhiều Scrum team?

Hoặc đơn cử như khách hàng có nhiều Scrum team để phát triển các domain khác nhau?. Lúc này việc giao tiếp giữa các Scrum team trở thành vấn đề.

Phỏng vấn scrum master

Một trong những cách phổ biến giải quyết cho việc giao tiếp giữa nhiều team là Scrum of Scrums meeting. Cuộc họp này là cuộc họp giữa các Scrum master hoặc người đại diện của nhóm, nơi các thành viên đại diện cùng nhau thảo luận về tiến độ, hiệu suất, rủi ro, dự định sắp tới. Tần suất của các cuộc họp như này cần được xác định trước.

Ngoài ra cần thêm vị trí Chief Scrum Master, điều phối cuộc họp giữa các Scrum master. Người này cần linh động, điều phối tốt cuộc họp giữa các Scrum master.

Một số câu hỏi anh em chuẩn bị:

  • Trường hợp có stakeholder khó tính, bạn phải làm thế nào?
  • Ba trụ cột của Scrum là gì?
  • Làm sao đảm bảo User stories khớp với requirement

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

Anh em tham khảo thêm để chuẩn bị tốt cho buổi phỏng vấn Scrum master nha. Chúc anh em may mắn

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

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

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

5 câu hỏi phỏng vấn Ruby on Rails Developer hay, thường gặp

5 câu hỏi phỏng vấn Ruby on Rails Developer hay, thường gặp

Ruby on Rails từ lâu đã được xem như viên hồng ngọc trong giới ngôn ngữ lập trình, vậy phỏng vấn Ruby on Rails có gì khó?

Bài viết này, với 5 câu hỏi ở phần 1 mong muốn đem tới cho anh em một số câu hỏi cơ bản phỏng vấn Ruby on Rails. Ở các phần tiếp theo sẽ đi sâu hơn vào từng phần và các phần kiến thức cần nắm chắc.

Phỏng vấn ruby on railsRuby on Rails là như này sao?

Bắt đầu thôi nào anh em! Còn chần chừ gì nữa mà không đi hái quả ngọt!

1. Sub-directory app/controllers và helper

Câu hỏi đầu tiên phỏng vấn Ruby on Rails là khái niệm cơ bản về sub-directory. Trả lời cho câu hỏi này:

App/controllers – Phần này xử lý web request từ user, đưa tới controller. Các thư mục con (sub-directory) là nơi Rails tìm kiếm các Controller class.

Phỏng vấn ruby on rails

App/helpers – Các thư mục con app/helper classs sử dụng để hỗ trợ cho view, model và các class controller khác.

Một số câu hỏi anh em có thể chuẩn bị thêm trong phần này:

  • Sự khác biệt giữa String và Symbol trong Rails?
  • Rails Active Record là gì trong Ruby on Rails?

  Làm thế nào để xây dựng social network bằng Ruby on Rails
  Mẫu bảng mô tả công việc lập trình Ruby on Rails

2. Rails Migration có những tính năng nào?

Câu hỏi thứ hai phỏng vấn Ruby on Rials liên quan tới kinh nghiệm thức tế của ứng viên khi làm việc với Ruby on Rails. Phần này anh em cứ nêu ra chính xác các function đã sử dụng với Migration trong Ruby on Rails.

Đơn cử có thể liệt kê một số tính năng như sau:

  • create_table(name, options)
  • drop_table(name)
  • rename_table(old_name, new_name)
  • add_column(table_name, column_name, type, options)
  • rename_column(table_name, column_name, new_column_name)
  • change_column(table_name, column_name, type, options)
  • remove_column(table_name, column_name)
  • add_index(table_name, column_name, index_type)
  • remove_index(table_name, column_name)

Phỏng vấn ruby on rails

Một số kinh nghiệm riêng khi sử dụng migration anh em có thể nêu ra:

  • Rollback migration (rails db:rollback)
  • Clean up old migration trước đó (rails db:migrate), nhưng anh em phải xoá hết đi trong folder db/migrations.

Các câu hỏi anh em có thể chuẩn bị thêm:

  • Giải thích Mixin trong Rails
  • Rake trong Rails là gì?
  • Swepper trong Rails

Xem thêm việc làm Ruby các vị trí hấp dẫn trên TopDev

3. Ruby on Rails có ưu điểm gì?

Câu hỏi số 3 phỏng vấn Ruby on Rails chú trọng tới góc nhìn của anh em về ngôn ngữ lập trình. Bản thân Ruby on Rails có gì tốt, lúc nào nên chọn ngôn ngữ này?

Anh em có thể liệt kê ra một số ưu điểm:

  • Cost-effective (Chi phí tốt) – Rails là miễn phí và chạy trên Linux, là mã nguồn mở.
  • Xây dựng trên kiến trúc MVC (Model, View và Controller)
  • Dễ dàng kiểm soát các thay đổi
  • Bảo mật và hiệu năng cao
  • Cộng đồng lớn để hỗ trợ
  • Nhiều plugin miễn phí, khả năng mở rộng cao

Phỏng vấn ruby on rails

Cũng có thể liệt kê các trang web hiện đang sử dụng Ruby on Rails bao gồm:

  • Github
  • AirBnB
  • Shopify

Tuy chỉ hỏi về ưu điểm của Ruby on Rails nhưng anh em có thể nêu luôn nhược điểm, những vấn đề trong thực tế anh em gặp phải với Ruby on Rails. Một số câu hỏi anh em có thể chuẩn bị:

  • Sự khác biệt giữa observers và callbacks?
  • Sự khác biệt giữa static scaffolding và dynamic scaffolding?
  • Strong parameter là gì?

4. CSRF là gì? Rails xử lý CSRF như thế nào?

Câu hỏi thứ 4 phỏng vấn Ruby on Rails liên quan tới CSRF. Về định nghĩa thì CSRF viết tắt của Cross-Site Request Forgery (giả mạo yêu cầu trên trang web). Đây là hình thức tấn công mà kẻ tấn công giả mạo để gửi tới trang web các yêu cầu lấy thông tin nhạy cảm hoặc đánh cắp thông tin.

Nếu anh em đã đăng nhập và được cấp cookies, kẻ tấn công sẽ sử dụng chính cookies đã được cập quyền để tiếp tục đi lấy các dữ liệu nhạy cảm khác. Cookies này thường sẽ được gửi kèm các http request.

Phỏng vấn ruby on rails

Để chống lại CSRF, Ruby on Rails cung cấp protect_from_forgery. Phần này anh em có thể add vào ApplicationController .Sau khi thêm phần này thì Rails application của anh em sẽ luôn yêu cầu CSRF trước khi chấp nhận bất cứ yêu cầu POST, PUT hoặc DELETE nào

Khi có protect_from_forgery, kẻ tấn công có CSRF sẽ bị chặn lại bởi same-origin policy.

Một số câu hỏi anh em có thể tham khảo:

  • Sự khác biệt giữa redirect và render trong Ruby on Rails.
  • Mục đích của RJs trong Rails

5. Ví dụ thực tế

Câu hỏi cuối cùng phỏng vấn Ruby on rails liên quan tới ví dụ thực tế. Giả sử anh em có bảng Student với id = 4. Nếu xoá Student với id = 4 thì kết quả của các câu query là gì?

  • Student.find(4)
  • Student.find_by_id(4)

Do dòng Student với id = 4 đã bị xoá, nên nếu anh em chạy Student.find(4) sẽ xuất hiện lỗi ActiveRecord::RecordNotFound: Couldn’t find Student with id=4

Ngược lại Student.find_by_id(4) sẽ trả về nil và không có bất cứ lỗi nào xuất hiện.

Phần các ví dụ này yêu cầu anh em phải nhớ rõ, phải có kinh nghiệm thực sự ở ngôn ngữ mình đã làm. Nếu không, những câu hỏi này sẽ loại đi những anh em nào không có kinh nghiệm.

Để chuẩn bị tốt cho phần này, anh em nên lọc lại, tập hợp lại kiến thức đã biết

6. Tham khảo phỏng vấn Ruby on Rails

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

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

Xem thêm:

Xem thêm các việc làm IT lương cao hấp dẫn tại TopDev

Người mới bắt đầu nên học ngôn ngữ lập trình nào?

Người mới bắt đầu nên học ngôn ngữ lập trình nào?

Sinh viên CNTT nên học ngôn ngữ lập trình nào? Một câu hỏi thường gặp của đa số bạn trẻ mới “dấn thân” vào ngành lập trình. Có thể thấy, trong bối cảnh công nghệ đang phát triển mạnh mẽ, học ngôn ngữ lập trình đang trở thành một xu hướng không thể bỏ qua.

Tuy nhiên, việc lựa chọn ngôn ngữ lập trình nào để học trong hơn 200 ngôn ngữ là điều nhiều người đắn đo. Vì vậy, trong bài viết này, chúng ta sẽ cùng tìm hiểu về các lợi ích của việc học ngôn ngữ lập trình và đưa ra những gợi ý hữu ích để giúp bạn lựa chọn ngôn ngữ lập trình phù hợp nhất. Bắt đầu thôi nào!

Ngôn ngữ lập trình có khó học như bạn tưởng?

Ngôn ngữ lập trình có khó học như bạn tưởng?

Học ngôn ngữ lập trình giống như việc học ngoại ngữ, đòi hỏi bạn phải nỗ lực, kiên trì rất nhiều. Mỗi ngôn ngữ lập trình sẽ có những quy luật riêng, cách code khác nhau, tùy vào bạn chọn ngôn ngữ nào để học.

Để nói một môn ngữ lập trình dễ hay khó học còn tùy thuộc vào nhiều yếu tố, bao gồm ngôn ngữ bạn học là gì, mục đích của việc học, phương pháp học như thế nào,…

Nếu bạn chưa từng học lập trình trước đây, việc bắt đầu học ngôn ngữ lập trình mới có thể gặp một số khó khăn. Còn nếu bạn đã có kinh nghiệm về lập trình hoặc đã học một số ngôn ngữ lập trình trước đó, việc học một ngôn ngữ mới có thể dễ dàng hơn nhiều.

Bên cạnh đó, phương pháp học tập cũng có vai trò quan trọng trong việc học ngôn ngữ lập trình. Nếu bạn sử dụng các tài liệu học tập phù hợp và áp dụng phương pháp học hiệu quả, việc học ngôn ngữ lập trình sẽ “dễ thở” hơn. Ngoài ra, cũng cần phải có sự kiên nhẫn, tinh thần cởi mở và sự sẵn sàng để thử nghiệm, tìm hiểu và khám phá.

Tóm lại, việc học ngôn ngữ lập trình có thể không phải là một việc đơn giản, tuy nhiên, nếu bạn có đủ sự cố gắng, thời gian và sử dụng phương pháp học tập phù hợp, việc học ngôn ngữ lập trình sẽ không thể làm khó được bạn.

  [Update] 5 xu hướng tuyển dụng IT 2024 không thể bỏ qua

Sinh viên CNTT nên học ngôn ngữ lập trình nào?

Với những bạn vừa bắt đầu học CNTT, có thể lựa chọn những ngôn ngữ lập trình dễ học, thị trường có nhu cầu cao hoặc mức lương hấp dẫn khi ra trường. Dưới đây là một vài gợi ý dành cho các lập trình viên tương lai.

Java

Java

Java là một ngôn ngữ lập trình rất phổ biến trên thế giới, được sử dụng rộng rãi trong phát triển ứng dụng di động, ứng dụng web, phần mềm máy tính và nhiều lĩnh vực khác. Java tuân thủ theo nguyên tắc hướng đối tượng (OOP), tương tự như trên ngôn ngữ Python, C++, PHP, do đó nếu bạn thành thạo Java thì việc học các ngôn ngữ còn lại khá đơn giản.

Một trong những lợi ích của Java là nó được thiết kế để chạy trên nhiều nền tảng khác nhau, bao gồm các hệ điều hành như Windows, Mac OS và Linux. Java cũng hỗ trợ chạy trên các thiết bị di động bao gồm cả điện thoại di động và máy tính bảng.

Bên cạnh đó, Java cũng có một cộng đồng lập trình viên rất lớn, với nhiều tài liệu, hướng dẫn và ví dụ mã nguồn mở có sẵn để giúp các lập trình viên mới học Java dễ dàng hơn. Đây là một ngôn ngữ lập trình rất đáng để bạn lựa chọn.

  Học IT có khó không? 6 khó khăn khi theo học ngành CNTT

JavaScript

JavaScript là một ngôn ngữ lập trình phổ biến trong lĩnh vực phát triển ứng dụng web. Đây là một ngôn ngữ lập trình dễ học, có cú pháp đơn giản và rõ ràng. Nó cũng cho phép lập trình viên viết mã nguồn ngắn gọn và dễ đọc.

Một trong những lợi ích của JavaScript là nó được hỗ trợ bởi tất cả các trình duyệt web phổ biến như Chrome, Firefox, Safari, và cả Edge, giúp cho các lập trình viên có thể phát triển các ứng dụng web tương thích trên mọi nền tảng. Các công cụ phát triển phần mềm như Visual Studio Code, Atom, và Sublime Text cũng cung cấp hỗ trợ tốt cho JavaScript.

Với nhu cầu xây dựng website trong các công ty, doanh nghiệp ngày càng lớn thì việc học ngôn ngữ JavaScript rất có lợi cho các lập trình viên sau này.

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

C/C++

C/C++

Nếu bạn chưa biết nên học ngôn ngữ lập trình nào thì hãy bắt đầu bằng C/C++. Khi học ngôn ngữ C/C++ thành thạo sẽ giúp bạn tiếp cận các ngôn ngữ lập trình khác dễ dàng hơn. Một trong những lợi ích của C và C++ là hiệu năng cao. Với kiểu dữ liệu đơn giản và cú pháp dễ hiểu, lập trình viên có thể tạo ra các ứng dụng chạy nhanh và tiết kiệm tài nguyên hệ thống. Ngoài ra, C và C++ cũng cung cấp cho lập trình viên khả năng tương tác với phần cứng, điều này cho phép tạo ra các ứng dụng nhúng và hệ thống có hiệu suất tốt.

Mặc dù C/C++ là những ngôn ngữ lập trình khó học hơn so với một số ngôn ngữ khác, nhưng chúng vẫn được coi là một trong những ngôn ngữ lập trình quan trọng nhất và nền tảng cho các lập trình viên. Tuy nhiên, để trở thành một lập trình viên thành thạo C và C++, bạn cần phải có kiến thức cơ bản về toán học và tư duy logic, đồng thời cần phải tìm hiểu và luyện tập nhiều để có thể hiểu rõ hơn về cú pháp và cách sử dụng của ngôn ngữ này.

Python

Python được nhiều lập trình viên chuyên nghiệp khuyến khích nên học cho người mới bắt đầu. Vì Python là một ngôn ngữ lập trình đơn giản và dễ học, được sử dụng rộng rãi trong nhiều lĩnh vực, từ khoa học dữ liệu, trí tuệ nhân tạo, phát triển web cho đến hệ thống nhúng và đồ họa.

Đặc biệt, cú pháp & các câu lệnh trong Python rất đơn giản, dễ hiểu nên được sử dụng nhiều trong giảng dạy và học tập. Ngoài ra, Python cũng có nhiều thư viện mạnh mẽ, đa dạng, giúp cho việc phát triển ứng dụng nhanh chóng và dễ dàng hơn.

Ruby

Ruby là một lựa chọn tuyệt vời cho những ai chưa biết nên học ngôn ngữ lập trình nào. Tương tự như Python, Ruby được xem là dễ đọc, dễ viết, giống như ngôn ngữ tự nhiên, rất thích hợp cho người mới bắt đầu. Nó cũng có nhiều framework hỗ trợ, giúp cho việc phát triển ứng dụng nhanh chóng và dễ dàng hơn.

Ruby được sử dụng rộng rãi trong phát triển web, đặc biệt là trong framework Ruby on Rails. Rails là một trong những framework web phổ biến nhất hiện nay, cung cấp nhiều tính năng mạnh mẽ cho việc phát triển ứng dụng web. Ngoài ra, Ruby cũng được sử dụng trong phát triển trò chơi, đồ họa, trí tuệ nhân tạo và các ứng dụng desktop. Các ứng dụng nổi tiếng được viết bằng Ruby bao gồm GitHub, Airbnb và Shopify.

Nếu bạn đang quan tâm đến phát triển web, đặc biệt là trong framework Ruby on Rails, thì Ruby là một ngôn ngữ lập trình rất tuyệt vời để học tập và phát triển kỹ năng của mình.

Lựa chọn ngôn ngữ lập trình theo mục tiêu công việc

Mảng lập trình Web

lập trình web

  • JavaScript: JavaScript được sử dụng để tạo ra các ứng dụng web động, các hiệu ứng và tính năng tương tác trên các trang web. Nó cũng được sử dụng để phát triển các ứng dụng web phía máy chủ bằng Node.js.
  • HTML/CSS: HTML là ngôn ngữ đánh dấu để tạo ra các trang web, còn CSS được sử dụng để thiết kế giao diện cho các trang web.
  • Python: Python là một ngôn ngữ lập trình đa năng và được sử dụng rộng rãi trong lĩnh vực lập trình web, đặc biệt là trong các framework như DjangoFlask.
  • PHP: PHP là một ngôn ngữ lập trình được sử dụng rộng rãi trong phát triển web và đặc biệt là trong các framework như WordPressLaravel

Mảng lập trình di động

  • Java: Java là ngôn ngữ lập trình phổ biến nhất cho phát triển ứng dụng di động Android. Nó cung cấp các thư viện và công cụ phát triển mạnh mẽ cho việc xây dựng các ứng dụng di động.
  • Swift: Swift là ngôn ngữ lập trình được sử dụng để phát triển ứng dụng cho hệ điều hành iOS của Apple. 
  • Kotlin: Kotlin là một ngôn ngữ lập trình đa năng và được sử dụng để phát triển ứng dụng di động cho hệ điều hành Android. Kotlin được xem là một sự thay thế tiềm năng cho Java trong lĩnh vực phát triển ứng dụng di động.

Mảng trí tuệ nhân tạo (AI)

trí tuệ nhân tạo

  • Python: Python là ngôn ngữ lập trình phổ biến nhất trong lĩnh vực trí tuệ nhân tạo. Nó cung cấp nhiều thư viện và công cụ hỗ trợ cho phát triển các mô hình học máy, xử lý ngôn ngữ tự nhiên và các ứng dụng trí tuệ nhân tạo khác.
  • R: R là một ngôn ngữ lập trình và môi trường tính toán thống kê được sử dụng rộng rãi trong phân tích dữ liệu và trí tuệ nhân tạo. Nó cung cấp các thư viện phân tích dữ liệu và hỗ trợ việc xử lý, mô hình hóa dữ liệu và vẽ biểu đồ.
  • Java: Java cũng được sử dụng trong lĩnh vực trí tuệ nhân tạo, đặc biệt là trong các hệ thống phân tán và lưu trữ dữ liệu.

Mảng lập trình game

  • C++: Đây là một ngôn ngữ lập trình mạnh mẽ và được sử dụng rộng rãi trong việc phát triển các game. C++ có khả năng tương tác với phần cứng và cung cấp hiệu suất cao cho các ứng dụng đòi hỏi tính toán.
  • C#: Là một ngôn ngữ lập trình được phát triển bởi Microsoft và được sử dụng trong phát triển game trên nền tảng Windows và Xbox. 
  • Java: Java cũng được sử dụng trong lĩnh vực game, đặc biệt là trong phát triển game trên nền tảng di động.
  • Python: Python được sử dụng rộng rãi trong việc phát triển các game trên nền tảng web và đặc biệt là trong việc phát triển các trò chơi đơn giản.

Tổng kết

Bài viết đã đưa ra những gợi ý chi tiết cho bạn về các ngôn ngữ lập trình nên học khi bắt đầu. Mỗi ngôn ngữ có ưu điểm và nhược điểm riêng, đồng thời cũng phù hợp với các mục đích và yêu cầu công việc khác nhau. Hy vọng rằng bạn đã tìm được câu trả lời cho câu hỏi sinh viên CNTT nên học ngôn ngữ lập trình nào?

Việc học một ngôn ngữ lập trình mới không chỉ giúp bạn phát triển kỹ năng và hỗ trợ cho sự nghiệp của mình, mà còn mở ra cơ hội tham gia vào các dự án công nghệ, sáng tạo trong tương lai. Chính vì vậy, hãy cân nhắc lựa chọn ngôn ngữ phù hợp với mục tiêu của bạn, và không ngừng nỗ lực để trau dồi kỹ năng lập trình của mình.

Xem thêm:

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

Object Prototype Javascript – Công cụ hỗ trợ OOP cho JS

Object Prototype Javascript

Bài viết được sự cho phép của tác giả Sơn Dương

Khi nghe người ta nói về Javascript, bạn chỉ biết Javascript là ngôn ngữ lập trình hướng sự kiện, kiểu script… Thế nhưng, có một điều thú vị rằng, Javascript cũng có thể viết code theo hướng đối tượng. Để làm được điều này, bạn cần phải hiểu về Object Prototype Javascript.

Bạn sẽ không thể nào trở thành chuyên gia về Javascript nếu bạn không nắm được khái niệm Object trong Js. Chúng là nền tảng cho mọi khía cạnh của ngôn ngữ lập trình Javascript.

Trên thực tế, với bất kỳ ai, bất kì ngôn ngữ nào, thì học cách tạo và làm việc với Object là việc đầu tiên bạn nghiên cứu và thực hành.

Tuy nhiên, chắc do Javascript là ngôn ngữ kiểu “lai tạp” , cú pháp lỏng lẻo, dễ tiếp cận… nên nhiều bạn thường bỏ qua việc tìm hiểu Object, cứ nghĩ JS không có Object. Thực ra bạn đã nhầm, rất nhầm

Để tìm hiểu một cách có hiệu quả về Prototype, chúng ta sẽ quay lại những khái niệm cơ bản nhất: “back to basic”.

Nằm trong series: Lập trình Javascript cơ bản, bài viết này mình sẽ chia sẻ những kiến thức cần thiết về Prototype Javascript.

Object Prototype Javascript

#Object javascript là gì – Các cách tạo Object

Qua bài viết Kiểu dữ liệu và hàm trong JS, bạn đã biết được rằng, JS có kiểu dữ liệu cơ bản gồm: Number, String, Boolean, Undefined và Object.

Object là kiểu dữ liệu tổng hợp các kiểu dữ liệu nguyên thủy. Theo định nghĩa thì Object là một danh sách các property (thuộc tính). Mỗi Property là một cặp key-value. Trong đó value có thể là: các kiểu dữ liệu cơ bản, function, hay cũng có thể là một object khác (kiểu dữ liệu phức hợp).

Trong Javascript, mình có 3 cách để định nghĩa, tạo một Object. Chúng ta sẽ lần lượt điểm qua từng cách một.

  Javascript ES6 – Đôi điều thú vị có thể bạn chưa biết

1. Sử dụng Object literal

Ví dụ như bên dưới là cách tạo đối tượng sử dụng Object literal. Đây là cách mà mình hay sử dụng nhất, vừa đơn giản, lại dễ hiểu.

var human = {
    firstName: "Duong",
    lastName: "Anh Son",
    age: 30,
    fullName: function(){
        return this.firstName + " " + this.lastName
    }
}

2. Sử dụng từ khóa new Object()

Với các ngôn ngữ khác, từ khóa new dùng để tạo một instance của một Object. Thì với Javascript, từ khóa new vừa tạo Object, vừa tạo instance.

Ví dụ về cách sử từ khóa new Object():

var human = new Object()
human
console.log(human);// Creates an empty object

Để thêm thuộc tính cho Object, bạn có thể sử dụng ký hiệu dot (.) và gán giá trị luôn cho thuộc tính đó. Ví dụ cho dễ hình dung nhé:

var human = new Object()
human.firstName = "Duong"
human.age = 30
console.log(human);// Creates an empty object

Tham khảo thêm về công việc của Java Developer tại đây

3. Sử dụng Object Constructor

Khái niệm hàm khởi tạo (constructor) có lẽ không còn quá xa lạ với các bạn đã biết C# hay Java.

Contructor trong Javascript cũng có vai trò tương tự như vậy.

Để tạo một Object bằng hàm constructor, cần phải qua 2 bước:

  • Định nghĩa các thuộc tính của một prototype javascript class bằng một hàm constructor. Theo Javascript convention, thì tên của hàm khởi tạo nên bắt đầu bằng chữ in hoa.
  • Tạo đối tượng được định nghĩa bằng hàm constructor bằng từ khóa new.

Nhìn các bước tạo object này, mình lại có sự liên tưởng tới Kotlin. Cách làm rất giống nhau.

Đây là một ví dụ:

// Định nghĩa một class bằng hàm khởi tạo.
function Human(firstName, lastName) {
    this.firstName = firstName,
    this.lastName = lastName,
    this.fullName = function() {
         return this.firstName + " " + this.lastName;
    }
}

var person1 = new Human("Virat", "Kohli");

console.log(person1)
// Tạo instance bằng từ khóa new
var anhson = new Human("Duong", "Anh Son")
var sachinTendulkar = new Human("Sachin", "Tendulkar")

  Object Prototype Javascript – Công cụ hỗ trợ OOP cho JS
thêm một lần nào nữa”]

3. Vấn đề khi tạo Object bằng hàm khởi tạo constructor

Chúng ta sẽ xem xét đoạn mã tạo Object bên dưới đây:

var person1 = new Human("Virat", "Kohli");
var person2 = new Human("Sachin", "Tendulkar");

Khi đoạn code thực thi, Javascript engine sẽ tạo ra 2 bản sao của hàm constructor tương ứng với person1 và person2.

Object Prototype Javascript

Điều này có nghĩa là mọi đối tượng được tạo bằng hàm constructor sẽ có bản sao tương ứng các thuộc tính và method riêng.

Việc này dẫn đến việc phung phí tài nguyên khi mà hàm fullName() làm cùng một việc như nhau ở mọi bản sao.

Đề giải quyết bài toán này, chúng ta sử dụng khái niệm Prototype.

Xem thêm các tin đăng tuyển dụng lập trình viên javascript trên TopDev

# Prototypes Javascript là gì?

Prototype có hai khái niệm mà bạn cần phân biệt:

  • Prototype object là một đối tượng trong Javascript.
  • Thuộc tính Prototype của function.

Có một điều kì cục trong Javascript đó là: function cũng là một object. Function có một thuộc tính đặc biệt là prototype property. Và bản thân thuộc tính prototype này lại mang một giá trị object.

Ngoài ra, vì chúng ta sử dụng function để tạo hàm khởi tạo đối tượng, nên thuộc tính prototype của function cũng có khả năng đặc biệt. Đó là bạn có thể thêm các thuộc tính hoặc phương thức vào thuộc tính prototype để thực hiện kế thừa.

Cuối cùng, khi bạn tạo một object, Javascript engine sẽ mặc định thêm một thuộc tính propotype. Thuộc tính này có giá trị trỏ tới prototype object mà nó kế thừa. Ta dùng thuộc tính “__proto__” để truy cập tới prototype object.

Object Prototype Javascript

1. Cách tạo propotype

Do hàm khởi tạo đối tượng cũng được xem là 1 đối tượng prototype, do đó các đơn giản để tạo ra 1 đối tượng prototype là khai báo một hàm khởi tạo:

function Student() {
    this.name = 'Duong Anh Son';
    this.gender = 'M';
}

Student.prototype.age = 20;

var sinhvien1 = new Student();
console.log(sinhvien1.age); // 20

var sinhvien2 = new Student();
console.log(sinhvien2.age); // 20

2. Changing Prototype

Như mình đã nói ở trên, mỗi một prototype object sẽ link tới một prototype object của hàm.

Nếu bạn thay đổi prototype của hàm thì chỉ các đối tượng tạo mới sau này mới bị ảnh hưởng. Còn các đối tượng đã được tạo trước đó vẫn giữ nguyên prototype cũ.

Để dễ hình dung, mời bạn xem đoạn code bên dưới đây:

function Student() {
    this.name = 'John';
    this.gender = 'M';
    this.website = 'vntalking.com'
}

Student.prototype.age = 15;

var sinhvien1 = new Student();
console.log('sinhvien1.age = ' + sinhvien1.age); // 15

var sinhvien2 = new Student();
console.log('sinhvien2.age = ' + sinhvien2.age); // 15

Student.prototype = { age : 20 };

var sinhvien3 = new Student();
console.log('sinhvien3.age = ' + sinhvien3.age); // 20

console.log('sinhvien1.age = ' + sinhvien1.age); // 15
console.log('sinhvien2.age = ' + sinhvien2.age); // 15

3. Prototype Javascript sử dụng như nào?

Tổng kết lại thì prototype object được sử dụng nhằm 2 mục đích:

  • Để tìm các thuộc tính và phương thức của một object.
  • Thực hiện kế thừa trong Javascript.
function Student() {
    this.name = 'John';
    this.gender = 'M';
}

Student.prototype.sayHi = function(){
    console.log("Hi");
};

var studObj= new Student();
studObj.toString();

Ở ví dụ trên, bạn thấy rằng hàm toString() không được định nghĩa trong Student.

Vậy đoạn code trên có bị crash không? Làm thế nào và chương trình tìm thấy hàm toString()?

Để trả lời cho câu hỏi trên, bạn cần tham khảo hình bên dưới:

Object Prototype Javascript

Đầu tiên, JavaScript engine sẽ kiểm tra xem hàm toString() có sẵn trong studObj hay không?

Nếu nó không tìm thấy, nó sẽ sử dụng thuộc tính prototype của studObj để tìm tới Prototype của Student.

Cuối cùng, nếu nó vẫn không thấy hàm toString() được định nghĩa trong Student, nó sẽ kiếm tra trong đối tượng Object (đây là đối tượng mà tất các đối tượng khác đều kế thừa).

Như ví dụ ở đoạn code trên, chương trình sẽ gọi hàm toString() của đối tượng Object, và nó không in ra gì cả (vì hàm toString() trong Object không làm gì).

Qua cách này, bạn có thể thấy là prototypechỉ giữ duy nhất một bản sao các hàm cho tất cả các đối tượng (instances).

Và đây cũng chính là câu trả lời cho câu hỏi ở đầu bài viết: tại sao sử dụng prototype lại tiết kiệm tài nguyên hơn so với cách sử dụng hàm khởi tạo constructor.

4. Kế thừa trong Javascript bằng cách sử dụng Propotype

Kế thừa là một khái niệm quan trọng trong lập trình hướng đối tượng. Trong kế thừa cổ điển (ví dụ như Java), các hàm trong class cha sẽ được copy vào lớp con.

Với Javascript thì có vẻ nhiều người cứ nghĩ ngôn ngữ lập trình này không có khái niệm kế thừa. Nhưng thực tế thì có đấy.

Trong Javascript, kế thừa được hỗ trợ bởi Propotype. Đó là lý do mà một số người gọi kế thừa trong javascript là “Prototypal Inheriatance“.

Để dễ hiểu hơn, chúng ta sẽ bắt đầu bằng một ví dụ:

function Person(firstName, lastName) {
    this.FirstName = firstName || "unknown";
    this.LastName = lastName || "unknown";
};

Person.prototype.getFullName = function () {
    return this.FirstName + " " + this.LastName;
}

Ở ví dụ này, mình định nghĩa một class Person với 2 thuộc tính là FirstName và LastName, và một hàm getFullName(). Hàm getFullName() được thêm vào class thông qua prototype object.

Và giờ chúng ta sẽ tạo một class Student, kế thừa từ class Person.

function Student(firstName, lastName, schoolName, grade)
{
    Person.call(this, firstName, lastName);

    this.SchoolName = schoolName || "unknown";
    this.Grade = grade || 0;
}
//Student.prototype = Person.prototype;
Student.prototype = new Person();
Student.prototype.constructor = Student;

Các bạn để ý rằng, mình đã đặt Student.prototype là một Person.

Từ khóa new tạo một đối tượng của lớp Person và cũng gán Person.prototype cho prototype object của đối tượng mới. Và cuối cùng gán đối tượng được tạo cho Student.prototype

Bây giờ bạn có thể tạo một đối tượng student sử dụng  các thuộc tính và hàm của lớp Person như sau:

function Person(firstName, lastName) {
    this.FirstName = firstName || "unknown";
    this.LastName = lastName || "unknown";
}

Person.prototype.getFullName = function () {
    return this.FirstName + " " + this.LastName;
}
function Student(firstName, lastName, schoolName, grade)
{
    Person.call(this, firstName, lastName);

    this.SchoolName = schoolName || "unknown";
    this.Grade = grade || 0;
}
//Student.prototype = Person.prototype;
Student.prototype = new Person();
Student.prototype.constructor = Student;

var std = new Student("James","Bond", "XYZ", 10);

console.log(std.getFullName()); // James Bond
console.log (std instanceof Student); // true
console.log (std instanceof Person); // true

Nhìn cũng giống với kế thừa như các ngôn ngữ kinh điển (Java, C#) nhỉ!

#Tạm kết

Như vậy là chúng ta đã hiểu rõ hơn về prototype javascript object rồi đúng không? Quả thực, đây là khái niệm mà rất nhiều người cảm thấy khó khăn khi mới tiếp cận. Nhưng hãy cứ bình tĩnh và đừng nản chí.

Khi bạn đã quen với prototype javascript, bạn sẽ cảm thấy đây là một khái niệm tuyệt vời. Bạn có cảm thấy thế không? Để lại bình luận chia sẻ cảm nghĩ với mọi người nhé.

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

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

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

Tổng Hợp Các Phương Thức Của Thread

Tổng Hợp Các Phương Thức Của Thread

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

Thread có nhiều phương thức khá hay, nếu lúc nào đó bỗng nhiên bạn cần đến, thì việc tìm hiểu thêm về chúng cũng mất kha khá thời gian. Và cũng nhân tiện có nhiều bạn cũng đặt các câu hỏi xoay quanh một vài phương thức được dùng nhiều, hôm nay mình viết hẳn một bài để tổng hợp lại các phương thức đó của Thread lại. Mình sẽ tập trung giải nghĩa cụ thể vào từng phương thức, có ví dụ rõ ràng, để các bạn nắm rõ hơn và để mình nhanh chóng cho ra những bài viết còn lại của chuỗi kiến thức Thread khá là đồ sộ này nhé.

Lưu ý rằng bài viết hôm nay sẽ chưa có đủ mặt các phương thức, nhưng mình sẽ cập nhật thêm sau này và sẽ để lại đường link đến bài này từ các bài viết liên quan khác.

Thread.sleep()

Một phương thức đơn giản nhưng khá nhiều bạn thắc mắc.

Giải Nghĩa

sleep() là một phương thức static của Thread. Do đó chúng ta gọi kèm với tên của lớp: Thread.sleep().

Thread.sleep() làm cho Thread hiện tại (chính là Thread đang gọi đến lệnh Thread.sleep()) phải tạm hoãn lại việc thực thi trong một khoảng thời gian được chỉ định. Nói cho đầy đủ thì là vậy, nhưng các lập trình viên hay dùng theo tên của phương thức, đó là “Ngủ”.

Tuy Thread.sleep() được nạp chồng cho phép bạn chỉ định thời gian ngủ cho Thread hiện tại tính đến nano giây. Nhưng bạn đừng có nghĩ rằng Thread.sleep() sẽ thực sự ngủ với chính xác khoảng thời gian mà bạn định nghĩa nhé. Vì việc ngủ và thức này khiến cho hệ thống phải xử lý và cho ra các độ trễ khác nhau tùy vào thiết bị phần cứng nữa. Do đó Thread.sleep() cũng chỉ tương đối, và chúng ta không bao giờ được dùng Thread.sleep() để xây dựng một chức năng hẹn giờ hay đếm ngược thời gian, điều mà đòi hỏi tính chính xác về mặt thời gian rất cao.

Sử Dụng

Thread.sleep() được nạp chồng bởi 2 phương thức.

  • Thread.sleep(long millis): xác định thời gian ngủ cho Thread, tính bằng mili giây.
  • Thread.sleep(long millis, int nanos): như trên, nhưng bạn có thể thêm vào tham số thứ hai, giúp cộng thêm thời gian ngủ tính bằng nano giây.

Khi sử dụng Thread.sleep(), bạn phải try catch phương thức này bằng một Checked Exception có tên là InterruptedException. Exception này sẽ được tung ra nếu như có một Thread nào đó khác interrupt Thread này (dừng Thread lại) khi Thread.sleep() đang hoạt động.

  Cách xây dựng ThreadLocal trong Java

  Khởi tạo và chạy một thread trong Java

Ví Dụ

Một ví dụ đơn giản, ví dụ này sẽ tin ra console các con số từ 0 đến 5. Mỗi lần in cách nhau nửa giây (500 mili giây). Và vì chúng ta không start() bất cứ Thread nào trong đoạn code dưới, điều đó không có nghĩa rằng là hiện tại ứng dụng đang rỗng không có Thread nào đấy nhé. Bản thân phương thức main() tự nó đã được đưa vào một Thread rồi, gọi là main thread, nên bạn có thể thoải mái gọi đến Thread.sleep() ở đây.

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(i);
    }
}

join()

Giải Nghĩa

Phương thức join() cho phép một Thread phải chờ cho đến khi các Thread khác kết thúc. Vậy Thread nào phải chờ Thread nào? Vấn đề này khiến nhiều bạn bỡ ngỡ ban đầu, do chỉ có một phương thức join() thì thể hiện thế nào về việc Thread nào chờ Thread nào. Bạn chỉ cần nhớ, Thread nào sử dụng (hay khai báo) các Thread khác, mà một trong các Thread được khai báo này gọi đến phương thức join(), Thread sử dụng sẽ phải đợi Thread khai báo đó kết thúc mới làm tiếp công việc của mình.

join() cũng có các phương thức nạp chồng cho phép Thread hiện tại chỉ cần phải chờ trong một khoảng thời gian tính bằng mili giây hoặc thêm đến nano giây. Và cũng như Thread.sleep()join() không thực sự đếm thời gian chính xác, nên bạn cũng đừng dùng join() cho một số tình huống đòi hỏi mặt khắt khe về thời gian nhé.

Đừng bỏ lỡ việc làm Java hấp dẫn trên TopDev

Sử Dụng

join() được nạp chồng bởi 3 phương thức.

  • join(): chờ đến khi Thread này kết thúc.
  • join(final long millis): chờ trong khoảng thời gian tính bằng mili giây. Nếu truyền vào đây giá trị 0, sẽ trở thành join() trên kia.
  • join(long millis, int nanos): như trên nhưng có thể cộng thêm thời gian tính bằng nano giây vào tham số thứ hai. Nếu truyền vào 2 tham số đều là 0 thì sẽ trở thành join().

Cũng giống như Thread.sleep(), sử dụng join() cũng cần phải try catch với InterruptedException. Cả hai phương thức này sẽ tung ra Exception này khi được gọi bởi lệnh interrupt.

Ví Dụ

Chúng ta hãy xây dựng một Thread đơn giản sau đây. Thread này khi chạy sẽ in ra các con số từ 0 đến 5 ở mỗi 0,5 giây.

public class MyThread extends Thread {

    public MyThread(String threadName) {
        super(threadName);
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName() + " " + i);
        }
    }
}

Còn ở phương thức main() chúng ta sẽ khai báo 3 đối tượng Thread từ lớp MyThread này. Sau khi start thread1 xong thì gọi thread1.join(), sau đó chúng ta cũng sẽ start các Thread còn lại.

public static void main(String[] args) {
    MyThread thread1 = new MyThread("Thread1");
    MyThread thread2 = new MyThread("Thread2");
    MyThread thread3 = new MyThread("Thread3");

    thread1.start();
    try {
        thread1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    thread2.start();
    thread3.start();
}

Kết quả in ra console như sau.

Thread1 0
Thread1 1
Thread1 2
Thread1 3
Thread1 4
Thread2 0
Thread3 0
Thread2 1
Thread3 1
Thread2 2
Thread3 2
Thread2 3
Thread3 3
Thread2 4
Thread3 4

Bạn có thể thấy, sau khi thread1.start()thread1 này sẽ bắt đầu in các con số ra console. Tuy nhiên lời gọi thread1.join() sau đó khiến Thread đang sử dụng thread1 này (chính là main thread, thread đang chứa phương thức main() của chúng ta) rơi vào trạng thái đợi cho thread1 hoàn thành, trong quá trình đợi đó, các thread2 và thread3 khi này vẫn chưa được thực thi với hàm start(). Sau khi thread1 đếm xong và hoàn thành nhiệm vụ, các Thread còn lại mới được chạy và bắt đầu đếm là vậy.

interrupt()/isInterrupted()/Thread.interrupted()

Giải Nghĩa

Đôi khi chúng ta cần phải ngưng một Thread nào đó đang hoạt động. Cách hợp lý là gọi đến phương thức interrupt() của Thread. Lời gọi interrupt() thực chất cũng không làm cho Thread được gọi đến ngưng tác vụ ngay đâu, điều đó khá là nguy hiểm khi mà hệ thống không biết chắc Thread này đang làm việc gì, biết đâu nó đang ghi một file quan trọng nào đó. Việc một Thread khác interrupt() thoải mái một Thread nào đó có thể gây nên hậu quả khôn lường. Do đó, interrupt() không được xây dựng sẵn các lệnh giúp dừng Thread từ hệ thống, nó chỉ được xem như là một chỉ thị đưa ra cho Thread đang hoạt động biết, tốt hơn hết chính Thread đang hoạt động đó phải biết được chỉ thị này và tự biết cách ngưng tác cụ của mình lại. Một lát ở ví dụ bên dưới chúng ta sẽ nắm được điều này. Hai phương thức còn lại isInterrupted() và Thread.interrupted() dùng để kiểm tra Thread này có bị interrupt hay chưa.

Sử Dụng

  • interrupt(): đưa ra chỉ thị cho Thread rằng nó đang được gọi để chấm dứt việc thực thi.
  • isInterrupted(): kiểm tra xem Thread đó có bị chấm dứt hay chưa.
  • Thread.interrupted(): cũng như isInterrupted(), nhưng việc gọi kiểm ta với phương thức này cũng kèm với việc trả lại trạng thái ban đầu cho Thread sau đó. Nên việc gọi kiểm tra một Thread có bị chấm dứt hay chưa bởi hai lần gọi phương thức này có thể cho ra hai kết quả khác nhau.

Ví Dụ

Ví dụ lần này chúng ta hãy đi từ phương thức main(), để xem với lời gọi interrupt() như thế này thì MyThread phải làm sao là đúng nhé.

public static void main(String[] args) {
    MyThread thread = new MyThread();

    System.out.println("We start this Thread");
    thread.start();

    try {
        thread.join(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("We stop this Thread");
    thread.interrupt();
}

Nếu như ở MyThread, chúng ta “thờ ơ” với InterruptedException, tức là không có chuẩn bị gì cho sự interrupt cả, như sau.

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++){
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }
}

Kết quả in ra console sẽ như sau. Bạn thấy ở phương thức main() gọi interrupt() trong “vô vọng”, vòng lặp vẫn lặp và đếm như thường, nó chỉ kết thúc khi hoàn thành tác vụ mà thôi.

We start this Thread
0
1
We stop this Thread
2
3
4

Tuy nhiên, nếu chúng ta sửa MyThread một chút, có “trách nhiệm” hơn vớ InterruptedException, Thread này sẽ kết thúc dễ dàng do có sự chuẩn bị trước.

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++){
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("OK, I'm stop.");
                return;
            }
        }
    }
}

Console sẽ in ra như sau.

We start this Thread
0
1
We stop this Thread
OK, I'm stop.

Hoặc try catch như thế này cũng cho ra kết quả viên mãn như trên.

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 5; i++) {
                System.out.println(i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("OK, I'm stop.");
        }
    }
}

Thread.currentThread()

Giải Nghĩa

Lời gọi Thread.currentThread() sẽ nhận về một tham chiếu đến đối tượng Thread hiện tại. Phương thức này cũng không quá phức tạp nên mình cũng không giải thích gì nhiều.

Ví Dụ

Bạn hãy nhìn vào MyRunnable sau. Trong trường hợp này thì để có thể lấy được tên của Thread đang chạy, chỉ có cách gọi đến Thread.currentThread() mà thôi.

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " started.");
    }
}

Phương thức main() như sau.

public static void main(String[] args) {
    MyRunnable myRunnable1 = new MyRunnable();
    MyRunnable myRunnable2 = new MyRunnable();

    new Thread((myRunnable1)).start();
    new Thread((myRunnable2)).start();
}

Kết quả in ra console.

Thread-1 started.
Thread-0 started.

getName()/setName()

Giải Nghĩa

Mặc định thì các Thread khi khởi chạy trong ứng dụng, sẽ được hệ thống đặt cho một cái tên, tuần tự, như sau: Thread-0Thread-1,….

Nếu bạn thấy các tên này rất khó để gợi nhớ, hãy đặt cho chúng một cái tên khác theo ý bạn.

Sử Dụng

  • getName(): trả về tên của Thread.
  • setName(String name): đặt một tên mới cho Thread.

Ví Dụ

Như bao ví dụ khác, chúng ta cần một Thread khá đơn giản như sau. Thread này sẽ in ra các con số từ 0 đến 5 ở mỗi 0,5 giây. Tuy nhiên Thread có kèm theo phương thức getName() để hiển thị tên của nó ra console.

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++){
            System.out.println(getName() + " " + i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Ở main() chúng ta sẽ start Thread với cái tên mặc định trước. Đợi Thread này chạy 1 giây sau rồi đổi tên cho nó.

public static void main(String[] args) {
    MyThread thread = new MyThread();

    thread.start();
    try {
        thread.join(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    thread.setName("Thread Changed Name");
}

Kết quả in ra console, tên Thread bị đổi sau 2 lần lặp.

Thread-0 0
Thread-0 1
Thread Changed Name 2
Thread Changed Name 3
Thread Changed Name 4

Kết Luận

Hy vọng với bài mở rộng này sẽ giúp các bạn thêm hiểu rõ hơn về sử dụng Thread trong java.

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

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

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

Hướng dẫn debug code trong eclipse

Hướng dẫn debug code trong eclipse

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

Debug là gì?

Bug (lỗi) có thể là từ chương trình của bạn viết ra hoặc là từ chương trình mà bạn kế thừa từ người khác. Khi chương trình chạy và kết quả không phải là những gì mà bạn mong đợi, tức là đã có lỗi. Lỗi có thể do dự đoán của bạn đã bị sai hoặc là có gì đó phát sinh khi chương trình được thực thi mà bạn không lường trước được. Đôi khi chỉ cần nhìn vào source code là bạn tìm ra ngay nguyên nhân, nhưng khi cách đó không mang lại kết quả thì lúc này bạn cần phải Debug.

Debug (gỡ lỗi) là một kỹ năng nền tảng của lập trình viên. Mục đích chính của debug là để dò tìm lỗi (error) của chương trình, ngoài ra nó còn giúp lập trình viên hiểu rõ hơn cách chương trình hoạt động.

Các phương pháp Debug

Có nhiều phương pháp để debug, thông thường chúng ta sử dụng các phương pháp sau:

  • Print Console: là cách thêm vào source code của bạn những dòng lệnh để in ra những thông tin mà bạn cần theo dõi trong quá trình thực thi. Ví dụ: System.out.println(), hay System.error.println(),… Cách này hơi phiền phức vì bạn phải thay đổi code của chương trình, những dòng code này vô nghĩa và sau khi debug bạn phải xóa khỏi source code của chương trình.
  • Logging: tạo ra một tập tin để ghi (log) lại những thông tin sau khi chương trình thực thi. Chúng ta sẽ dựa vào thông tin này để phân tích nguyên nhân lỗi. Kỹ thuật này thường được áp dụng trong môi trường thực, khi mà ứng dụng của bạn đang được mọi người sử dụng, bạn không thể thay đổi code hay sử dụng công cụ để dò tìm lỗi.
  • Debugging Tool (dùng công cụ để Debug) là phương pháp debug đi sâu vào source code nhất. Các công cụ này thông thường được tích hợp vào các IDE, ví dụ công cụ debugger của eclipse, Microsoft Visual Studio Debugger,… Cách này thường được sử dụng nhất khi bạn đang phát triển chương trình, bạn dễ dàng theo dõi, kiểm tra các giá trị, thay đổi các giá trị để kiểm tra tính đúng đắn của chương trình.

Debug code Java trong Eclipse

Debug code Java trong Eclipse cũng giống như việc chạy một ứng dụng Java. Khi debug chúng ta có thể tạm ngưng (pause) chương trình để xem giá trị của các biến, từ đó biết được luồng chạy của chương trình, thậm chí là thay đổi giá trị của các biến. Đặc biệt debug được sử dụng để tìm kiếm bug, đây là một việc quan trọng trong phát triển phần mềm.

BreakPoint (điểm ngắt): một BreakPoint trong mã nguồn xác định nơi thực thi của chương trình nên dừng lại trong quá trình gỡ lỗi. Một khi chương trình đã dừng, bạn có thể kiểm tra giá trị các biến, thay đổi nội dung,…

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

  Một số lệnh console hữu ích khi debug website

Các bước debug code Java trong Eclipse

Các bước thực hiện debug code trong Java:

  1. Tạo BreakPoint.
  2. Start chương trình ở chế độ Debug.
  3. Sử dụng các phím tắt để theo dõi giá trị các biến, theo dõi flow thực thi của chương trình.

Code minh họa

Trước khi đi vào chi tiết, hãy xem đoạn code bên dưới sẽ được sử dụng để minh họa các thao tác debug:

package com.gpcoder;

public class MainApp {

    public static void main(String[] args) {
        Student student = new Student(1, "GP Coder");
        String hello = sayHello(student);
        System.out.println(hello);
    }

    public static String sayHello(Student student) {
        return "Hello " + student.getName();
    }

    public static void checkStudent(Integer id) {
        if (id != null) {
           System.out.printf("Valid");
        } else {
           System.out.printf("Invalid");
        }
    }
}

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

Tạo BreakPoint

Để xác định điểm ngắt trong mã nguồn, bạn nhấp chuột phải vào lề trái trong trình soạn thảo Java và chọn Toggle Breakpoint. Hoặc bạn có thể nhấp đúp vào vị trí cần đánh dấu BreakPoint.

debug eclipse

Ví dụ tôi thiết lập một BreakPoint tại dòng code số 6, ta có kết quả sau:

debug eclipse

Start chương trình ở chế độ debug

Có thể thực hiện một trong các cách bên dưới để Start ở project ở chế độ debug trong Eclipse:

  • Chọn menu Run -> Debug As -> Java Application.
  • Click chuột phải vào class chứa phương thức main() -> Debug As -> Java Application.
  • Nhấn phím F11.
  • Click vào button Debug trong thanh công cụ -> Debug As -> Java Application.

debug eclipseLần đầu tiên debug hộp thoại sau được hiển thị ra, check vào “Remember my decision” nếu bạn không muốn nhìn thấy nó lần nữa -> chọn Yes.

Nếu khung làm việc Debug không được mở, bạn có thể vào Window -> Perspective -> Open Perspective -> Others -> Debug.

debug eclipse

Khung nhìn BreakPoint gồm có 5 cửa sổ nhỏ:

  • Cửa sổ 1 (Debug): hiển thị thông tin Class của dòng lệnh đang thực thi.
  • Cửa sổ 2 (Variables/ BreakPoints, Expressions): hiển thị giá trị các biến, hiển thị tất cả các BreakPoint đánh dấu của project, thiết lập các biểu thức (expression), điều kiện để đánh dấu BreakPoint.
  • Cửa sổ 3 (Java Class): cho phép thực hiện điều khiển thực hiện debug.
  • Cửa sổ 4 (Outline): hiển thị tên các biến, phương thức của class hiện đang thực thi, bạn có thể di chuyển nhanh đến vị trí của phương thức bằng cách click lên tên phương thức tương ứng.
  • Cửa sổ 5 (Console): hiển thị thông tin kết quả của câu lệnh System.out, System.error, … ra cửa sổ Console.

Các phím tắt để Debug Java project trong Eclipse

debug eclipse

Eclipse cung cấp các nút trên thanh công cụ để kiểm soát việc thực hiện chương trình mà bạn đang debug. Bạn có thể sử dụng cho phép sử dụng phím tắt tương ứng để kiểm soát việc thực hiện này.

  • F5 (Step Into): nhảy vào phương thức đang debug.
  • F6 (Step Over): thực thi câu lệnh hiện tại và nhảy đến câu lệnh tiếp tiếp.
  • F7 (Step Return): thực thi câu lệnh hiện tại và quay lại lệnh đã gọi phương thức này.
  • F8 (Resume): thực thi câu lệnh hiện tại và nhảy đến breakpoint tiếp theo.
  • Ctrl + F2 (Terminate): kết thúc chế độ debug.
  • Ctrl Shift + B: đánh dấu/ hủy BreakPoint
  • Ctrl + Shift + I: mở popup hiển thị thông tin giá trị biến được chọn.

Xem giá trị các biến trong khung debugger

Sau khi start chương trình ở chế độ debug, chương trình sẽ thực thi bình thường. Nếu gặp BreakPoint, chương trình sẽ dừng lại để cho phép bạn điều khiển và theo dõi. Như bạn thấy, chương trình sẽ dừng lại ở BreakPoint tại dòng code số 6:

debug eclipse

Nhấn F6 để thực thi câu lệnh hiện tại và trỏ tới câu lệnh tiếp theo.

debug eclipse

Để xem giá trị của biến, bạn thực hiện một trong các cách sau:

  • Hover chột vào biến tương ứng.
  • Bôi đen biến và nhấn tổ hợp phím Ctrl + Shift + I.
  • Mở cửa sổ Variable.

Như bạn thấy hình trên, chương trình dừng tại dòng code số 7, khi bạn hover chuột lên biến student, bạn có thể thấy được giá trị của biến student.

Tại dòng code số 7, bạn có thể nhấn phím F5 để vào xem nội dụng của phương thức sayHello.

debug eclipse

Như bạn thấy, hiện tại chương trình đã nhảy vào phương thức sayHello(). Tại đây, bạn có thể nhấn phím F6 để chuyển sang dòng code kế tiếp, khi thực thi đến hết phương thức sayHello(), chương trình sẽ quay lại dòng code số 7.

Để quay lại dòng code số 7 mà không cần thực thi từng dòng lệnh (không nhấn phím F6), chúng ta sẽ nhấn phím F7, khi đó chương trình sẽ thực thi tất cả các câu lệnh còn lại phương thức sayHello() và quay lại lệnh đã gọi phương thức này (tức là dòng code số 7).

debug eclipse

Nhấn F8 để thực thi câu lệnh hiện tại và nhảy đến BreakPoint tiếp theo (nếu có). Trong ví dụ của chúng ta là kết thúc chương trình.

debug eclipse

Lưu ý: sau khi thực hiện debug xong, bạn có thể chuyển lại khung nhìn Java bằng cách click vào icon bên phải như sau:

debug eclipse

Nếu không có các icon trên, bạn có thể vào menu chính -> Window -> Perspective -> Open Perspective -> Other -> chọn Debug hoặc Java hoặc Java EE.

Thay đổi/ gán giá trị biến trong lúc debug

Ví dụ thực hiện debug chương trình trên đến dòng code số 8, khi đó giá trị hello tại cửa sổ Variables của khung nhìn Debug như sau:

debug eclipse

Chúng ta có thể thay đổi giá trị của biến hello bằng cách nhấp chuột vào value của biến hello, sau đó nhập giá trị mới. Ví dụ, tôi đổi giá trị “GP Coder” thành “gpcoder.com“:

debug eclipse

Nhấn phím F8 để chương trình thực thi tiếp phần còn lại. Tại cửa sổ Console, bạn sẽ thấy giá trị “gpcoder.com” được hiển thị:

debug eclipse

Xóa các BreakPoint hoặc hủy kích hoạt BreakPoint

Khung nhìn Breakpoints cho phép bạn xóa và hủy kích hoạt các BreakPoint. Để hủy kích hoạt một điểm ngắt, loại bỏ hộp kiểm tương ứng trong khung nhìn Breakpoints. Để xóa nó, bạn có thể sử dụng các nút tương ứng trong thanh công cụ.

Mở khung nhìn BreakPoint: Trên menu chính, chọn Window -> Show view -> Others -> BreakPoints

debug eclipse

Như bạn thấy khung nhìn BreakPoint sẽ hiển thị tất cả các BreakPoint được đánh dấu trong chương trình của bạn. Trong hình trên, tôi đã đánh dấu 2 BreakPoint tại dòng code 6 và 16, khung nhìn view cũng thể hiện 2 BreakPoint này.

Trên đây là những hướng dẫn cơ bản nhất để thực hiện debug trong Java. Thao tác debug khá đơn giản nhưng rất quan trọng, mỗi lập trình viên đều cần biết và vận dụng nó để dễ dàng dò tìm lỗi, cũng như hiểu sâu hơn về cách hoạt động của chương trình. Tôi xin dừng bài viết ở đây, cám ơn các bạn đã quan tâm và theo dõi. Hẹn gặp lại ở các bài viết tiếp theo.

Remote Debug – Debug từ xa

Thế nào là Remote debug?

Thông thường, chúng ta debug ứng dụng trực tiếp trên IDE ở máy local, cụ thể chúng ta sẽ dùng Eclipse, IntelliJ, … để debug, chúng ta đặt BreakPoint và tiến hành debug. Nhưng vì một lý do nào đó, chúng ta không thể deploy project trên máy local bằng IDE mà phải deploy ứng dụng ở một máy khác hoặc trên server (remote). Sau đó, chúng ta cũng vẫn sẽ debug ứng dụng đó bằng source code trên IDE của máy local. Đó chính là remote debug.

Remote debug (Debug từ xa) rất hữu dụng khi có những bug chỉ xảy ra trên một môi trường mà máy local không thể tái hiện được. Chẳng hạng như xảy ra trên môi trường staging, testing và thỉnh thoảng trên cả production.

Thực hiện Remote debug như thế nào?

Java cung cấp sẵn tính năng remote debug, chúng ta chỉ cần truyền vào thông số -Xdebug cho JVM lúc start chương trình. Sau đó, đặt BreakPoint và thực hiện debug như hướng dẫn ở phần trên. Chỉ khác biệt là khi chạy ứng dụng thì quá trình thì các dữ liệu của quá trình debug sẽ được JVM trên môi trường đang chạy đẩy về máy local thông qua qua socket trên một port đã định nghĩa lúc start JVM.

Ví dụ: chúng ta deploy ứng dụng của mình như sau:

java -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=8090 -jar gpcoder-app.jar

Trong đó:

  • –Xdebug là lệnh dùng để enable tính năng remote debug.
  • gpcoder-app.jar là ứng dụng được start.
  • -Xrunjdwp:transport=dt_socket : ứng dụng publish message thông qua transport là socket và giao thức JDWP (Java Debug Wire Protocol). Từ Java 5 trở đi, chúng ta có thể sử dụng -agentlib:jdwp thay cho -Xdebug và Xrunjdwp.
  • server=y,address=8090: ứng dụng sẽ được debug ở server được deploy với port là 8090.
  • suspend=n : JVM sẽ start ở chế độ suppend cho đến khi được debug.

Lưu ý: ứng dụng chạy ở chế độ remote debug sẽ bị ảnh hưởng đến performance, do đó chỉ sử dụng chế độ này khi thực sự cần thiết.

Debug như thế nào mới hiệu quả?

Nếu ta chịu khó debug chi tiết thì sẽ hiểu rõ hơn về hệ thống và biết được chương trình đang bị lỗi gì. Tuy nhiên, đôi khi chúng ta không có đủ thời gian để debug chi tiết từng dòng code. Dưới đây là một vài điểm giúp quá trình debug nhanh hơn, dễ phát hiện lỗi xảy ra hơn mà tôi muốn chia sẽ với các bạn:

  • Đọc cẩn thận các dòng thông báo lỗi khi chạy đoạn mã, đôi khi những dòng báo lỗi đã chỉ ra cho ta biết nguyên nhân lỗi là gì.
  • Khi ta chạy chương trình debug ngoài xem các giá trị của biến cần ta cần xem thêm các comment để hiểu hơn nghiệp vụ xử lý trong chương trình. Từ đó có thể phán đoán được khả năng xảy ra lỗi trong chương trình nhanh hơn.
  • Phân vùng lỗi thông qua các BreakPoint. Nếu ta chạy từng dòng lệnh một cách chi tiết sẽ tốn nhiều thời gian. Thường thì tôi đoán lỗi khả năng xảy ra ở đâu, sau đó đặt các BreakPoint ở đó. Chạy debug để loại bỏ các dự đoán khả năng lỗi. Rồi phân vùng khả năng lỗi để tiến hành debug sâu dưới dạng Step into để gỡ lỗi. Theo kinh nghiệm của tôi thì làm cách này tôi thấy phát hiện lỗi được nhanh hơn. Nhưng nhanh hay chậm cũng phụ thuộc kinh nghiệm, nếu kinh nghiệm tốt sẽ đoán được phân vùng lỗi nhanh và đỡ tốn thời gian hơn.
Bài viết gốc được đăng tải tại gpcoder.com

Xem thêm:

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

Callback hell là gì? 6 cách “trị” callback hell trong javascript

Callback hell là gì? 6 cách “trị” callback hell trong javascript

Bài viết được sự cho phép của tác giả Sơn Dương

Chắc hẳn những bạn nào quen lập trình Nodejs hay Javascript rồi thì khái niệm Callback không còn xa lạ nữa. Nhưng với người mới như mình thì callback hell trong javascript luôn là một ám ảnh. Vậy Callback hell là gì? Nó có hay xảy ra khi làm việc với Nodejs không?

Mình phải thừa nhận một điều là mình quyết định học Nodejs chẳng qua bị sếp ép mà thôi. Với xuất phát điểm từ lập trình Java, cho đến lập trình Android nên tư duy xử lý bất đồng bộ của Javascript thực sự làm mình bối rối.

Như mọi người cũng biết, việc xử lý các tác vụ trong Javascript là bất đồng bộ. Tức là các tác vụ sẽ được Javascript đẩy hết một event loop.

Các bạn có thể xem video bên dưới để hiểu rõ hơn về Event Loop trong Javascript nhé.

Tác vụ nào hoàn thành thì sẽ được bắn sự kiện để thông báo và trả kết quả. Do đó các tác vụ sẽ không được thực hiện theo đúng trình tự như chúng ta nhìn trong code.

Từ  đó, chúng ta sử dụng callback để có thể điều khiển việc thực hiện các tác vụ theo đúng trình tự mong muốn.

Tuy nhiên, nếu lạm dụng callback mà không được thiết kế cẩn thận sẽ làm cho code của bạn trở lên khó đọc, khó bảo trì.
Callback hell là gì? 6 cách "trị" callback hell trong javascript dễ nhất

#Callback hell trong javascript là gì?

Chắc hẳn bạn đang rất muốn biết bản chất callbackhell trong javascript là gì đúng không?

Thực ra callback hell trong javascript chỉ là bạn thực hiện quá nhiều callback lồng nhau. Đại khái, callback hell sẽ có hình dạng như bên dưới.

getData(function(a){
    getMoreData(a, function(b){
        getMoreData(b, function(c){
            getMoreData(c, function(d){
                getMoreData(d, function(e){
                    ...
                });
            });
        });
    });
});

Nhìn qua đoạn code bạn có thấy khiếp không?

Những người mới bắt đầu học Nodejs thường rất dễ bị lỗi này. Đơn giản vì các bạn chưa có một tư duy thiết kế chuẩn cho kiểu hệ thống hướng sự kiện.

Bài viết này, mình sẽ chia sẻ 5 cách để các bạn hạn chế bị callback hell trong javascript mà dễ thực hiện nhất.

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

#6 cách xử lý callback hell trong javascript dễ nhất

1. Thiết kế ứng dụng theo dạng module

Cũng giống với các ngôn ngữ lập trình khác, một trong những cách để hạn chế sự phức tạp của code là module hóa.

Bất cứ khi nào bạn viết code, đừng cắm cổ vào viết ngay mà hãy dành một chút thời gian để suy nghĩ xem mình viết như này đã tốt nhất chưa.

Bạn đang viết một đoạn code và đoạn code này xuất hiện ở rất nhiều nơi? Hay các phần của đoạn code đó lại đang có vẻ tái sử dụng được… Lúc này bạn hãy mạnh dạn nghĩ tới module hóa nó.

Bạn nên nhớ rằng, Nodejs được như ngày hôm nay là do được xây dựng trên hàng trăm ngàn modules khác nhau. Nodejs sẽ không là gì cả nếu không có các module. Nên việc bạn module mã nguồn của mình là đi đúng hướng với triết lý của Nodejs đấy.

Ví dụ cách viết một module. Bạn tạo một module tên là Test.

//node_modules/test/index.js
module.exports = {
  hello: function(name) {
    console.log("Hello, " + name);
  },
  bye: function(name) {
    console.log("Goodbye, " + name);
  }
};

Sau đó gọi ở ứng dụng như sau:

var greeter = require('test');

greeter.hello("Monkey");
greeter.bye("Steven");

Việc làm JavaScript Hồ Chí Minh dành cho bạn!

2. Nên đặt tên cho callback trong javascript

Bạn hay bắt gặp cách viết callback là các hàm anonymous function. Tức là các hàm không có tên.

Ví dụ một đoạn code sử dụng callback là anonymous function. Và có đến 2 callback lồng nhau.

var fs = require('fs');

var myFile = '/tmp/test';
fs.readFile(myFile, 'utf8', function(err, txt) {
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, function(err) {
        if(err) return console.log(err);
        console.log('Appended text!');
    });
});

Nhìn vào đoạn code này sẽ khiến bạn mất vài giây để xem callback thực hiện điều gì và được gọi từ đâu.

Để khắc phục điều này, đơn giản bạn thêm một thao tác nhỏ là đặt tên cho callback. Nó sẽ giúp bạn dễ đọc code hơn, đặc biệt khi các callback lồng nhau nhiều hơn.

var fs = require('fs');

var myFile = '/tmp/test';
fs.readFile(myFile, 'utf8', function appendText(err, txt) {
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, function notifyUser(err) {
        if(err) return console.log(err);
        console.log('Appended text!');
    });
});

Lúc này, bạn chỉ cần lướt qua là biết callback đầu tiên thực hiện việc nối các text lại với nhau. Còn callback thứ 2 là để thông báo cho người người dùng. Việc này giúp bạn tránh được callback hell trong javascript dễ dàng đúng không?

  DOM là gì? Tìm hiểu và thao tác DOM trong Javascript

3. Định nghĩa hàm trước khi gọi để tránh callback hell trong javascript

Vẫn với ví dụ ở trên, việc bạn đặt tên đã giúp cho code dễ đọc hơn rất nhiều. Nhưng nó vẫn còn khá cồng kềnh.

Bạn thực hiện thêm một bước nữa, đó là tách riêng và định nghĩa các callback riêng ra. Hãy cứ tách hàm khi có thể!

var fs = require('fs');

function notifyUser(err) {
    if(err) return console.log(err);
    console.log('Appended text!');
};

function appendText(err, txt) {
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, notifyUser);
}

var myFile = '/tmp/test';
fs.readFile(myFile, 'utf8', appendText);

Bạn  thế code trên đẹp trai hơn chưa?

Mặc dù cách viết code đã giải quyết được phần nào vấn đề. Nhưng nó vẫn chưa phải là giải pháp tốt nhất. Nếu bạn đọc lại code mà không nhớ chính xác hàm đó làm gì, bạn sẽ phải trace lại code, mà thường thì code của hàm đó lại trôi tuột ở đâu đó. Rất mất thời gian.

Chúng ta còn có giải pháp tốt hơn, ngay phía bên dưới thôi!

  Arguments object trong javascript là gì? Cách sử dụng?

4. Sử dụng module Async.js

Đúng với tên gọi của nó, module Async.js sẽ giúp bạn xử lý các hàm bất độ theo cách đồng bộ.

Module này có rất nhiều methods để bạn chọn như seriesparallelwaterfall,… Vì vậy, bạn nên dành chút thời gian để đọc tài liệu hướng dẫn của tác giả trước khi quyết định chọn method nào.

Async.js thực sự là một thư viện tốt, nhưng nếu lạm dụng quá thì cũng không tốt. Bạn nên nhớ Nodejs là nền tảng được thiết kế cho hệ thống xử lý bất đồng bộ, với ưu điểm xử lý realtime. Nên nếu dự án toàn sử dụng Async.js để xử lý các tác vụ theo kiểu đồng bộ tuần tự là tự đập bỏ điểm mạnh của Nodejs.

Đây là đoạn code sử dụng Async.js cho ví dụ trên:

var fs = require('fs');
var async = require('async');

var myFile = '/tmp/test';

async.waterfall([
    function(callback) {
        fs.readFile(myFile, 'utf8', callback);
    },
    function(txt, callback) {
        txt = txt + '\nAppended something!';
        fs.writeFile(myFile, txt, callback);
    }
], function (err, result) {
    if(err) return console.log(err);
    console.log('Appended text!');
});

Nhìn cũng khá tường minh và dễ hiểu phải không?

5. Sử dụng Promises

Mặc dù khái niệm Promies hơi khó hiểu chút khi mới tiếp cận. Nhưng theo mình thì đây là một khái niệm quan trọng mà bạn nên cố hiểu khi học Javascrip/Nodejs.

Promises giúp làm giảm số dòng code đáng kể, nó còn giúp mã dễ đọc, dễ bảo trì hơn nhiều.

Quay lại ví dụ ban đầu, nếu sử dụng Promises sẽ như sau:

var Promise = require('bluebird');
var fs = require('fs');
Promise.promisifyAll(fs);

var myFile = '/tmp/test';
fs.readFileAsync(myFile, 'utf8').then(function(txt) {
    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt);
}).then(function() {
    console.log('Appended text!');
}).catch(function(err) {
    console.log(err);
});

Nói về Promises thì còn nhiều điều để nói lắm. Ở bài viết này mình sẽ không trình bày sâu về nó(mặc dù rất thích nói về Promises). Hẹn các bạn ở bài viết sau nhé!

Tìm việc làm Javascript mới nhất trên TopDev

6. Async/Await nhằm giảm khả năng xảy ra callback hell trong javascript

Kể từ phiên bản ES7, Javascript có một khái niệm mới là Async/Await. Khi sử dụng hàm async, code của bạn sẽ trông giống như đồng bộ như thực chất là bất đồng bộ. Thế mới hay!

Ví dụ đoạn code sau:

async function getUser(id) {
    if (id) {
        return await db.user.byId(id);
    } else {
        throw 'Invalid ID!';
    }
}

try {
    let user = await getUser(123);
} catch(err) {
    console.error(err);
}

Ở đoạn code trên, hàm db.user.byId(id) sẽ trả về một Promises, và lẽ ra khi hàm này được sử dụng thì kết quả sẽ trả về trong hàm .then().

Tuy nhiên, với từ khóa await, bạn sẽ lấy trực tiếp kết quả trả về.

Lưu ý: await chỉ được sử dụng với hàm được khái báo với từ khóa async.

#Tạm kết

Như vậy, qua bài viết này bạn đã biết callback hell trong javascript là gì rồi đúng không? Khi viết code thì những sai sót phổ biến như callback hell trong javascript là khó tránh khỏi. Tuy nhiên, hãy hạn chế nó càng nhiều càng tốt.

Chỉ cần bạn cố gắng viết code chậm lại chút, suy nghĩ một chút trước khi viết code. Javascript là một ngôn ngữ “dễ dãi”, đây cũng vừa là ưu điểm và nhược điểm của Javascript.

Hãy là người viết code thông thái!

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

Xem thêm:

Đừng bỏ lỡ việc làm IT hot tại TopDev

Outsource là gì? Công ty outsource hay product sẽ tốt cho Developer

Outsource là gì? Công ty Outsource hay Product sẽ tốt cho Developer

Outsource là một thuật ngữ quen thuộc trong ngành công nghệ thông tin, đặc biệt đối với các developer. Quá trình này mang lại những lợi ích rõ rệt cho các công ty như giảm chi phí, tập trung vào nhân lực chính, tiết kiệm thời gian và tăng cường chất lượng sản phẩm. Trong bài viết này, TopDev sẽ giúp bạn tìm hiểu outsource là gì? Những lợi ích và tác động của nó đến developer, cùng những lưu ý quan trọng khi thực hiện quá trình outsource.

Outsource là gì?

Outsource là gì?

Outsource hay còn gọi là Outsourcing (thuê ngoài) là hình thức công ty hoặc tổ chức thuê một công ty hay cá nhân khác để thực hiện một số công việc cụ thể thay vì thực hiện chúng bên trong tổ chức.

Quá trình outsource này thường được thực hiện khi công ty/doanh nghiệp không có đủ nguồn lực để làm, hoặc khi công ty muốn tập trung vào nhân lực chính của mình để phát triển các sản phẩm hoặc dịch vụ mới.

Các dịch vụ và công việc được outsource thường rất đa dạng, từ quản lý dự án, phát triển phần mềm, thiết kế đồ họa, đến dịch vụ khách hàng và hỗ trợ kỹ thuật. Các công ty thường tìm kiếm các đối tác outsource có chuyên môn hoặc kỹ năng đặc biệt, hoặc đơn giản là có thể thực hiện công việc một cách hiệu quả về mặt chi phí và thời gian.

Với ngành công nghệ thông tin, loại hình outsource rất phổ biến. Các công ty outsource này thường có tính chuyên môn hóa rất cao, đội ngũ developer chuyên nghiệp, tester đông đảo, quy trình làm việc cũng khác với các công ty product. Vậy nên, các công ty cần phải có kế hoạch và quản lý tốt để đảm bảo sự thành công của dự án outsource, làm hài lòng khách hàng.

  Chuyện bi kịch của công ty code outsourcing

Ưu nhược điểm của outsource là gì?

Việc sử dụng outsource trong ngành công nghệ thông tin mang lại nhiều lợi ích, nhưng cũng có những rủi ro và thách thức cần phải được xem xét. Dưới đây là một số ưu nhược điểm của hình thức outsource:

Ưu điểm

  • Tính chuyên môn hóa cao: Các công ty outsource thường sẽ chuyên về một mảng nhất định và phát triển năng lực tốt nhất trong mảng đó. Vậy nên hiệu quả công việc họ mang lại sẽ rất tốt, doanh nghiệp có thể tận dụng thời gian để làm những việc quan trọng hơn.
  • Giảm chi phí: Việc sử dụng outsource sẽ tiết kiệm chi phí hơn so với product, bởi doanh nghiệp sẽ không phải tốn thêm tiền đào tạo nhân viên, chi trả phí bảo hiểm hay lương thưởng hàng năm.
  • Tiếp cận công nghệ mới nhanh chóng: Với các công ty công nghệ thì việc tiếp cận với công nghệ mới là điều cần thiết, tuy nhiên chi phí đầu tư là vô cùng tốn kém. Vậy nên, outsource là một giải pháp thiết thực giúp doanh nghiệp tiếp cận với nguồn công nghệ mới dễ dàng hơn.
  • Đảm bảo công việc hoàn thành đúng deadline: Vì outsource làm việc theo hợp đồng nên việc đảm bảo đúng deadline là điều tất yếu. Thêm nữa, phía bên outsource phải đảm bảo chất lượng công việc theo như hợp đồng, nếu chưa hài lòng, phía khách hàng có thể đưa ra yêu cầu sửa chữa.

Nhược điểm

  • Rủi ro bảo mật: Vấn đề bảo mật là điều các doanh nghiệp lo lắng nhất khi lựa chọn hình thức outsource. Vì vậy khi lựa chọn đối tác outsource, doanh nghiệp cần phải thật thận trọng, lựa chọn các công ty uy tín để không làm lộ thông tin ra bên ngoài.
  • Khó khăn trong quản lý: Việc quản lý đối tác outsource có thể gặp phải nhiều khó khăn do địa lý xa cách hoặc khác biệt văn hóa, ngôn ngữ.
  • Không thể kiểm soát hoàn toàn chất lượng sản phẩm: Việc chưa hiểu hết tính chất và mục đích công việc dẫn đến kết quả công việc không theo đúng yêu cầu của doanh nghiệp.

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

Công ty outsource và product khác nhau như thế nào?

Outsource Product
Khái niệm Đây là công ty thuê ngoài, được thuê để làm phần mềm cho các công ty khác. Doanh thu của các công ty này có được dựa trên số giờ làm việc hoặc số dự án đã hoàn thành. Đây là các công ty xây dựng sản phẩm, làm mọi hoạt động phát triển sản phẩm từ A đến Z, kiếm tiền trên chính sản phẩm họ tạo ra.
Mục tiêu Làm hài lòng khách hàng, đối tác đã thuê họ. Họ phải đảm bảo deadline, chất lượng sản phẩm để giao cho khách hàng. Làm cho người dùng cuối hài lòng về sản phẩm doanh nghiệp tạo ra. Phải liên tục cải tiến, cập nhật tính năng mới, sửa lỗi để đáp ứng nhu cầu của người dùng.
Quy trình sản xuất Sản xuất phần mềm theo brief từ khách hàng, sẽ theo hơi hướng “công nghiệp”. Quy mô và cách tổ chức nhân sự chuyên nghiệp hơn công ty product nhưng thời gian gắn bó với dự án sẽ ít hơn. Thực hiện sản xuất phần mềm từ A đến Z, từ việc nghiên cứu thị trường, xây dựng sản phẩm đến quảng cáo sản phẩm. Do đó, nhân sự bên product sẽ có sự gắn bó hơn với doanh nghiệp.
Tính chất công việc Vì bị ràng buộc về nhiều thứ như deadline, ngân sách, chất lượng sản phẩm nên phía outsource thường có quy trình làm việc cứng nhắc, chủ yếu là hoàn thành sản phẩm theo yêu cầu để giao cho khách hàng.

Nhân sự outsource sẽ chỉ được làm việc trên một vấn đề rất nhỏ trong thời gian ngắn, hiếm khi được trải nghiệm hết một chu kỳ của sản phẩm. Điều này làm giảm tính sở hữu của nhân viên, nhân viên chỉ tập trung làm hài lòng khách hàng hơn là đưa ra ý tưởng để cải thiện trải nghiệm người dùng.

Công ty product sẽ tập trung vào người dùng cuối, làm cho họ hài lòng về sản phẩm. Các lập trình viên sẽ được tham gia vào toàn bộ vòng đời của sản phẩm, đến cả sau khi sản phẩm được đưa ra thị trường.

Điều này làm cho nhân viên cảm thấy trân trọng công việc mình làm hơn, quyền sở hữu sẽ cao hơn. Vậy nên, nhân viên luôn mong muốn mang lại những trải nghiệm tốt nhất cho người dùng, nỗ lực hơn để cải tiến chương trình và đưa ra những quyết định phù hợp với người dùng cuối.

Đối tượng khách hàng Khách hàng là công ty hoặc doanh nghiệp thuê outsource để thực hiện phần mềm/dự án.  Khách hàng là người dùng cuối trực tiếp sử dụng sản phẩm/phần mềm.

Fresher Developer nên chọn công ty outsource hay product?

nên chọn công ty outsource hay product?

Việc lựa chọn giữa công ty outsource và công ty product còn phụ thuộc vào mục tiêu nghề nghiệp, mong muốn và sở thích của mỗi người. 

Ở công ty outsource thường có nhiều dự án và khách hàng khác nhau, giúp fresher developer có cơ hội tiếp cận với nhiều công nghệ, kỹ năng và kinh nghiệm mới. Ngoài ra, công ty outsource thường có quy trình sản xuất sản phẩm đơn giản hơn, giúp fresher developer dễ dàng học và hiểu quy trình sản xuất.

Công việc trong công ty outsource cũng có tính động lực cao, yêu cầu fresher developer phải có tư duy sáng tạo và khả năng giải quyết vấn đề.

Còn ở công ty product, nếu fresher developer có sở thích và đam mê về một lĩnh vực cụ thể, ví dụ như game hay tài chính, thì công ty product có thể là lựa chọn tốt hơn. Công ty product thường tập trung vào nghiên cứu và phát triển sản phẩm mới, đòi hỏi nhân viên có kiến thức chuyên sâu và kinh nghiệm trong lĩnh vực đó.

  Tản mạn về nghề đi code thuê

Tổng kết

Hy vọng rằng với những chia sẻ trên của TopDev có thể giúp bạn hiểu rõ công ty outsource là gì, cũng như biết được những ưu nhược điểm của công ty outsource và product. Nếu bạn là fresher developer đang phân vân lựa chọn giữa công ty outsource và công ty product, hãy xác định rõ mục tiêu nghề nghiệp và sở thích của mình để đưa ra quyết định chính xác nhất nhé!

Xem thêm:

Xem thêm các công việc ngành IT hấp dẫn trên TopDev

Giao thức SSH là gì? Hướng dẫn sử dụng SSH từng bước

Giao thức SSH là gì? Hướng dẫn sử dụng SSH từng bước

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

Trong một ngày đẹp trời, mình được sếp giao nhiệm vụ “tối quan trọng” đó là quản trị hệ thống server của công ty. Nhưng mình đâu có biết quản trị server là thế nào đâu? Đến chuyện làm sao kết nối tới server còn chưa biết? Giao thức SSH là gì đâu?

Trong lúc khó khăn thường sẽ sản sinh “anh hùng”, và mình bắt đầu học cách quản trị server. Bước đầu tiên đó là tìm hiểu cách kết nối tới server bằng SSH.

Vậy giao thức SSH là gì? Nó có phải thứ chỉ dành chuyên gia không? Bài viết này mình sẽ chia sẻ những kiến thức mình học được trong quá trình tìm hiểu về SSH.

#SSH là gì?

Secure Shell (hay còn gọi là SSH) là một giao thức mạng cho phép người dùng thực hiện kết nối giữa máy chủ và máy khách một cách an toàn và bảo mật. SSH keys cung cấp một cách an toàn hơn để đăng nhập vào máy chủ bằng SSH so với chỉ sử dụng mật khẩu.

Mật khẩu cũng có thể bị lộ hoặc bị đánh cắp bằng ‘Brute Force attach’, SSH key gần như không thể giải mã bởi ‘Brute Force’.

Lý do để giao thức SSH bảo mật hơn, đó chính là sử dụng một cặp key: Public key và Private key.

Kết nối tới server sử dụng giao thức SSH
Kết nối tới server sử dụng giao thức SSH

 

Bạn có thể đặt ‘Public Key’ trên bất kỳ máy chủ nào, sau đó mở khóa bằng cách kết nối với Client đã có ‘Private Key’. Khi hai khóa khớp với nhau, hệ thống sẽ tự động kết nối mà không cần mật khẩu. Bạn có thể tăng cường bảo mật hơn nữa bằng cách bảo vệ ‘Private Key’ bằng mật khẩu.

  Hướng dẫn cài đặt SSH KEY cho server Linux

#Cách thức hoạt động SSH

Đọc qua khái niệm SSH, có lẽ bạn vẫn còn hơi mơ hồ về giao thức bảo mật này đúng không? Để hiểu được, bạn cần phải biết cách thức hoạt động của nó.

Với các bạn sử dụng Linux hay MacOs thì việc sử dụng SSH sẽ dễ hơn rất nhiều so với Window.

Trên Linux thì một câu lệnh SSH sẽ gồm 3 phần: ssh {user}@{host}

Trong đó:

  • ssh : đây là câu lệnh để hệ thống biết được bạn muốn tạo một kết nối bảo mật Secure Shell Connection.
  • {user}: là tài khoản mà bạn muốn dùng để truy cập. Ví dụ: tài khoản root
  • {host}: Là địa chỉ máy tính bạn muốn kết nối tới. Nó có thể là một địa chỉ IP hoặc một domain.

Khi bạn enter câu lệnh trên, máy tính sẽ yêu cầu bạn nhập mật khẩu tương ứng với tài khoản truy cập trong câu lệnh. Nếu nhập đúng là bạn đã kết nối thành công.
Cách thức hoạt động SSH

#Khi nào thì sử dụng SSH

Như mình đã nói ở trên SSH là gì, SSH có ưu điểm vượt trội về mặt bảo mật so với hình thức kết nối sử dụng mật khẩu truyền thống.

Vì vậy, lý do đầu tiên đó chính là tính bảo mật. Đảm bảo việc kết nối tới server được an toàn, không bị hacker lấy trộm thông tin, cũng như khỏi sợ việc bị hack mật khẩu, bị cài keylogger để trộm mật khẩu.

Ngoài ra, vì kết nối không cần nhập mật khẩu nên sẽ vô cùng tiện lợi. Bạn sẽ chỉ cần phải thiết lập một lần và sau đó quên nó đi, việc kết nối tới server là vô cùng đơn giản và nhanh chóng.

  Tự tạo SSH tunnel để forward port ra remote server

Về cá nhân mình, Mình làm việc trên MacOS nên việc ssh vào server rất nhiều nên việc mỗi lần login theo cách bằng mật khẩu truyền thống, nó rất nguy hiểm nếu như máy tính bạn có mã độc hoặc vô tình làm lộ mật khẩu

Ngoài ra mình thường xuyên setup Cron Job để copy file từ server này sang server kia hoặc từ server về local. Nên việc sử dụng ssh no password là rất rất cần thiết.

Do đó mình khuyên là hãy thực hành làm cho quen và sử dụng SSH ngay.

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

#Hướng dẫn kết nối server sử dụng SSH

Như mình đã nói ở trên, để kết nối sử dụng giao thức SSH, bạn cần phải có private key trên máy tính local của mình và public key trên server.

1. Tạo SSH Keys

Mình sẽ hướng dẫn các bạn từng bước tạo 2 keys này trên cả Linux và Window. Sau đó sử dụng 2 key này để có thể kết nối máy tính tới server qua giao thức SSH.

1.1 Đối với Linux và macOS

Khi tạo khóa SSH trong Linux, bạn có thể sử dụng lệnh ssh-keygen được tích hợp sẵn. Để làm đươc như vậy, hãy thực hiện theo những bước sau:

Mở Terminal. Nhập lệnh sau:

ssh-keygen -t rsa -b 4096

Tiếp theo, bạn chọn nơi để lưu Private key.

Enter file in which to save the key (/home/username/.ssh/id_rsa):

Public key sẽ được lưu trong cùng một vị trí, dưới cùng tên tệp, nhưng có phần mở rộng .pub. Nếu bạn không nhập gì thì sẽ sử dụng thư mục mặc định /home/username/.ssh/id_rsa.

Cuối cùng, bạn sẽ phải nhập mật khẩu. Đây sẽ là mật khẩu cần thiết để tải Private key và sử dụng nó để kết nối qua SSH sau này:

Enter passphrase (empty for no passphrase):

Toàn bộ quá trình tạo cặp khóa sẽ như thế này:

username@server.address.com: ssh-keygen -t rsa -b 4096

Generating public/private rsa key pair.

Enter file in which to save the key (/home/username/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in id_rsa.

Your public key has been saved in id_rsa.pub.

The key fingerprint is:

15:8e:e9:f2:1d:c9:b1:ca:41:8a:c3:3b:a1:1d:92:92 username@server.address.com

Như vậy là bạn đã tạo được cả 2 keys:

  • Một Private key được ghi vào /home/{username}/.ssh/id_rsa.
  • Một Public key được ghi vào /home/{username}/.ssh/id_rsa.pub

Trong đó {username} tên đăng nhập của máy tính của bạn.

1.2. Đối với Windows

Để tạo SSH key, mình khuyên các bạn sử dụng phần mềm PuTTY. Sau này, dùng luôn phần mềm này để kết nối bằng SSH tới server.

Với PuTTY, các bước thực hiện như sau:

  • Tải và khởi động puttygen.exe.
  • Trong phần “Parameters”, chọn SSH2 DSA và nhấn Generate.
  • Di chuyển chuột của bạn trong màn hình nhỏ để tạo các khóa.
  • Nhập một comment
  • Nhập mật khẩu và xác nhận nó. Cụm mật khẩu được sử dụng để bảo vệ khóa của bạn.
  • Bạn sẽ được yêu cầu khi bạn kết nối qua SSH.
  • Nhấp vào “Save private key” để lưu Private Key của bạn.
  • Nhấp vào “Save Public key” để lưu Public Key của bạn.

Tạo SSH key bằng PuTTY
Tạo SSH key bằng PuTTY

 

Như vậy là bạn đã tạo xong cả 2 loại key. Việc tiếp theo là thêm public key lên server.

Với ZOC7, bạn làm như sau:

Tạo SSH key bằng ZOC7
Tạo SSH key bằng ZOC7

 

2. Thêm Public Key vào server.

2. 1 Cài đặt SSH trên server

Mặc định thì Linux không có SSH, bạn cần phải cài đặt SSH thì mới sử dụng được.

Ví dụ bạn tự thuê riêng một server, bạn phải tự cài đặt hệ điều hành từ đầu thì sẽ phải cài thêm SSH. Còn với trường hợp VPS thì các nhà cung cấp thường cài đặt sẵn cho bạn SSH rồi.

Đối với RHEL/CentOS

yum -y install openssh-server openssh-clients

chkconfig sshd on

service sshd start

Đối với Ubuntu/Debian

sudo apt install openssh-client

sudo apt install openssh-server

2.2 Thêm Public key lên server

Để thêm SSH Public key của bạn vào máy chủ, bạn sẽ sao chép SSH Public key mà bạn vừa tạo vào máy chủ.

$ cat ~/.ssh/id_rsa.pub | ssh username@server.address.com 'cat >> ~/.ssh/authorized_keys'

Sau đó, máy chủ sẽ nhắc bạn nhập mật khẩu của bạn:

username@server.address.com's password:

Bây giờ bạn sẽ được thiết lập để kết nối với máy chủ mà không cần phải xác thực mật khẩu

3. Đăng nhập vào Server sử dụng SSH key

Để kết nối đến một server sử dụng giao thức SSH, bạn có thể thực hiện trên Window, Linux, hoặc MacOS. Trên Linux thì Terminal đã hỗ trợ sắn tính năng kết nối SSH rồi, bạn có thể sử dụng luôn. Còn với Window thì cần phải cài thêm một phần mềm bên thứ 3.

Ví dụ, với Window thì có nhiều phần mềm giúp bạn kết nối SSH như PuTTY, ZOC7… Cá nhân mình thì hay sử dụng ZOC7 vì giao diện đơn giản, thân thiện.

Những thông tin để đăng nhập một máy chủ qua SSH sẽ gồm:

  • IP của Server. Ví dụ: 104.31.76.95
  • Tên đăng nhập, đa phần là root
  • Mật khẩu đăng nhập
  • Cổng kết nối: 22. Mặc định SSH sử dụng cổng 22
Lưu ý: Bạn sử dụng phần mềm nào để kết nối SSH nào thì dùng chính phần mềm ý tạo SSH Keys để hạn chế những lỗi không đáng có.

Ví dụ, sử dụng phần mềm ZOC7, bạn cần điền thông tin cần thiết khi khởi động ứng dụng như sau:

Đăng nhập vào server sử dụng SSH bằng ZOC7
Đăng nhập vào server sử dụng SSH bằng ZOC7

 

Vậy là xong rồi đấy, từ nay về sau việc kết nối tới server sẽ đơn giản hơn rất nhiều.

#Tạm kết

Như vậy, qua bài viết này các bạn đã hiểu được SSH là gì, cách thức hoạt động, ưu điểm nổi bật của giao thức SSH…

Qua đó, mình khuyên các bạn cũng nên dần bỏ cách thức đăng nhập bằng mật khẩu truyền thống để tăng cường bảo mật cho server.

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

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

Hướng dẫn tạo Gradle Project Java bằng dòng lệnh CMD

Hướng dẫn tạo Gradle Project Java bằng dòng lệnh CMD

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

Trong bài này mình sẽ thực hiện tạo Project Java bằng Gradle trên giao diện dòng lệnh, các bạn có thể thực hiện bằng cmd/powershell trên windows hoặc terminal trên linux.

Hướng dẫn tạo Gradle Project Java bằng dòng lệnh cmd

Đầu tiên tạo folder chứa Project, ví dụ mình tạo folder GradleHello sau đó di chuyển tới folder vừa tạo

tạo Gradle Project Java bằng dòng lệnh cmd

Để tạo project gradle ta dùng lệnh gradle init

Sau khi chạy lệnh gradle init, nó sẽ hiện ra danh sách các loại project. Để tạo project Java thì các bạn chọn java-application

Các câu hỏi sau đó thì các bạn có thể bỏ qua (để nó chọn mặc định – default) bằng cách ấn enter

tạo Gradle Project Java bằng dòng lệnh cmd

Kết quả project GradleHello được tạo ra như sau:

tạo Gradle Project Java bằng dòng lệnh cmd

Trong đó:

  • folder gradle dùng để wrapper các file
  • folder src/main/java chứa mã nguồn java
  • folder src/test/java là folder chứa các file test java

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

Các file khác:

file settings.gradle dùng để thiết lập các thông tin của project như tên project

/*
 * This file was generated by the Gradle 'init' task.
 *
 * The settings file is used to specify which projects to include in your build.
 *
 * Detailed information about configuring a multi-project build in Gradle can be found
 * in the user manual at https://docs.gradle.org/5.4/userguide/multi_project_builds.html
 */

rootProject.name = 'GradleHello'

file build.gradle chứa thông tin cấu hình gradle như plugin, repository, dependency…

Ví dụ mainClassName = 'GradleHello.App' tức là khi chạy project nó sẽ chạy file App.java trong package GradleHello

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building an application
    id 'application'
}

repositories {
    // Use jcenter for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // This dependency is found on compile classpath of this component and consumers.
    implementation 'com.google.guava:guava:27.0.1-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'
}

// Define the main class for the application
mainClassName = 'GradleHello.App'

File main java App.java

package GradleHello;

public class App {
    public String getGreeting() {
        return "Hello world.";
    }

    public static void main(String[] args) {
        System.out.println(new App().getGreeting());
    }
}

File test

package GradleHello;

import org.junit.Test;
import static org.junit.Assert.*;

public class AppTest {
    @Test public void testAppHasAGreeting() {
        App classUnderTest = new App();
        assertNotNull("app should have a greeting", classUnderTest.getGreeting());
    }
}

Trong file AppTest.java có sử dụng thư viện JUnit (đây là một dependency được khai báo trong build.gradle)

Demo

Chạy project java gradle vừa tạo bằng lệnh gradle run

Kết quả:

tạo Gradle Project Java bằng dòng lệnh cmd

Okay, Done!

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

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

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