Front-end và back-end

Trong kỹ thuật phần mềm, các thuật ngữ **front-end** (đầu trước) và **back-end** (đầu sau) đề cập đến sự tách biệt các mối quan tâm giữa tầng trình diễn (giao diện người dùng) và tầng truy cập dữ liệu (kết thúc sau) của một phần mềm, hoặc cơ sở hạ tầng vật lý hoặc phần cứng. Trong mô hình khách – chủ, máy khách thường được coi là front-end và máy chủ thường được coi là back-end, ngay cả khi một số công việc trình bày thực sự được thực hiện trên chính máy chủ.

## Giới thiệu
Trong kiến trúc phần mềm, có thể có nhiều lớp giữa phần cứng và người dùng cuối. Front-end là một sự trừu tượng hóa, đơn giản hóa thành phần bên dưới bằng cách cung cấp giao diện thân thiện với người dùng, trong khi back-end thường xử lý lưu trữ dữ liệu và logic nghiệp vụ.

Trong viễn thông, front có thể được coi là một thiết bị hoặc dịch vụ, còn back là cơ sở hạ tầng hỗ trợ cung cấp dịch vụ.

Một quy tắc chung là client-side (phía khách) là bất kỳ thành phần nào do người dùng thao tác. Server-side (phía chủ) thường nằm trên máy chủ, thường bị xóa khá xa về mặt vật lý với người dùng

## Định nghĩa phần mềm
* Trong hệ thống quản lý nội dung, các thuật ngữ front end và back end có thể đề cập đến chế độ xem CMS và chế độ xem quản trị đối với người dùng cuối tương ứng.
* Trong tổng hợp giọng nói, giao diện người dùng đề cập đến một phần của hệ thống tổng hợp chuyển đổi văn bản đầu vào thành biểu thị ngữ âm tượng trưng và giao diện cuối chuyển đổi biểu thị ngữ âm biểu tượng thành âm thanh thực tế.
* Đối với các hệ thống con chính của máy tính, trình quản lý tệp đồ họa là giao diện người dùng cho hệ thống tệp của máy tính và giao diện shell với hệ điều hành. Front-end đối diện với người dùng và bank-end khởi chạy các chương trình của hệ điều hành để đáp ứng. 
* Trong trình biên dịch, front-end chuyển mã nguồn lập trình máy tính thành một biểu diễn trung gian và back-end làm việc với biểu diễn trung gian để tạo ra mã bằng ngôn ngữ đầu ra của máy tính. Back-end thường tối ưu hóa để tạo ra mã chạy nhanh hơn. Sự phân biệt front-end / back-end có thể tách biệt phần phân tích cú pháp xử lý mã nguồn và phần cuối tạo mã và tối ưu hóa. Một số thiết kế, chẳng hạn như GCC, cung cấp các lựa chọn giữa nhiều front-end (phân tích các ngôn ngữ nguồn khác nhau) hoặc back-end (tạo mã cho các bộ xử lý mục tiêu khác nhau).
* Sử dụng giao diện dòng lệnh (CLI) yêu cầu thu thập các thuật ngữ đặc biệt và ghi nhớ các lệnh, do đó, giao diện đồ họa người dùng (GUI) hoạt động như một môi trường máy tính front-end để bàn.

## Lập trình viên full-stack
Một lập trình viên full-stack là người có thể phát triển phần mềm cho cả người dùng và nhà cung cấp dịch vụ. Nói một cách dễ hiểu, một lập trình viên Full-Stack có kiến thức về toàn bộ công nghệ tạo nên một trang web. Họ có thể làm việc trong cả hai ngôn ngữ front-end và back-end. Họ chủ yếu tập trung vào phát triển web ở cả hai đầu.

Hầu hết vị trí này không phải là lập trình viên toàn diện ngay từ đầu. Họ thường làm việc ở nhiều vai trò trước khi chuyển sang full-stack. Họ cũng có xu hướng thoải mái với cả logic kinh doanh và trải nghiệm người dùng. Nói cách khác, họ có đủ kiến thức về kinh doanh để đưa ra lời khuyên cho người khác.

* Các ngôn ngữ đánh dấu và ngôn ngữ web như HTML, CSS, JavaScript và các thư viện phụ trợ thường được sử dụng trong các ngôn ngữ đó như Sass hoặc jQuery
* Xử lý yêu cầu bất đồng bộ và AJAX
* Các ứng dụng một trang (với các khung phần mềm như React, AngularJS hoặc Vue.js)
* Hiệu năng web (First Meaningful Paint hay hình ảnh có ý nghĩa đầu tiên, thời gian để tương tác, hoạt ảnh và tương tác 60 FPS, sử dụng bộ nhớ, v.v.)
* Thiết kế web đáp ứng
* Các vấn đề về khả năng tương thích trên nhiều trình duyệt và cách giải quyết
* Kiểm thử đầu cuối với trình duyệt Headless Browser là một trình duyệt web không có giao diện đồ họa người dùng
* Tự động hóa xây dựng để chuyển đổi và đóng gói các tệp JavaScript, giảm kích thước hình ảnh ... bằng các công cụ như Webpack hoặc Gulp.js  
* Tối ưu hóa công cụ tìm kiếm 
* Mối quan tâm về khả năng tiếp cận
* Cách sử dụng cơ bản các công cụ chỉnh sửa hình ảnh như GIMP hoặc Photoshop
* Giao diện người dùng

### Back-end tập trung vào
* Các ngôn ngữ kịch bản như PHP, Python, Ruby, Perl, Node.js hoặc các ngôn ngữ biên dịch như C #, Java hoặc Go
* Mô hình kiểm thử tự động cho ngôn ngữ đang được sử dụng
* Quyền truy cập dữ liệu ứng dụng
* Logic kinh doanh ứng dụng
* Quản trị cơ sở dữ liệu
* Khả năng mở rộng
* Độ sẵn sàng cao
* Mối quan tâm về bảo mật, xác thực và ủy quyền
* Kiến trúc phần mềm
* Chuyển đổi dữ liệu
* Phương pháp và phần mềm sao lưu
Lưu ý rằng cả hai vị trí, mặc dù có thể làm việc trên một sản phẩm, nhưng có một bộ kỹ năng rất khác biệt.

## Định nghĩa phần cứng
Trong máy tính mạng, front-end có thể đề cập đến bất kỳ phần cứng nào tối ưu hóa hoặc bảo vệ lưu lượng mạng. Nó được gọi là phần cứng front-end của ứng dụng vì nó được đặt trên front end hoặc DMZ – là đơn vị lưu lượng Internet riêng rẽ từ mạng cục bộ. Lưu lượng mạng đi qua phần cứng front-end trước khi vào mạng.

Trong thiết kế bộ xử lý, thiết kế front end sẽ là mô tả ban đầu về hoạt động của mạch bằng ngôn ngữ mô tả phần cứng như Verilog, trong khi thiết kế back end sẽ là một phép toán liên kết từng phần tử của một tập hợp nhất định (miền) với một hoặc nhiều phần tử của tập hợp thứ hai (phạm vi) hành vi đó tới các transistor vật lý trên một khuôn

## Tham khảo