Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Việc tích hợp với API của bên thứ ba có lẽ không còn xa lạ gì với nhiều người. Tùy vào hệ thống sắp sửa phải liên kết mà có cách triển khai và gọi khác nhau, như phương thức HTTP, xác thực client, quyền hạn được truy cập vào những endpoint nào… Mỗi bên, họ đều có những quy tắc và yêu cầu mà chúng ta cần tuân thủ nếu muốn có các cuộc gọi thành công.
Không biết trong đây có bạn đọc nào đã từng tích hợp API của Google chưa chứ tôi thì có vài lần rồi. Lần đầu tiên là gọi API của Google Sheets, cần ghi được dữ liệu vào Sheets riêng tư của người dùng. Thời gian đầu, phải bỏ ra một vài ngày để nghiên cứu cách làm, đọc tài liệu của Google thì bị “loạn xì ngầu” vì cách họ trình bày có phần hơi khó hiểu, hoặc có thể là dễ hiểu cho người đã từng có kinh nghiệm làm rồi. Rất may là cuối cùng việc tích hợp cũng ổn thỏa, tôi đã có thể ghi được dữ liệu bằng cách yêu cầu họ thêm tài khoản Google của mình với quyền ghi vào file Sheets ấy.
Bẵng đi một thời gian sau đó, khi cần phải tích hợp API của Google Analytics thì là một lần… phải nghiên cứu lại. Có lẽ lâu rồi không đụng đến nên tôi quên mất cách làm năm xưa. Nhưng may mắn lần này mất ít thời gian hơn vì dần dần nhớ ra được luồng xử lý trước đó.
Nghĩ rằng sẽ có những người gặp phải trường hợp như tôi, nên trong bài viết này vừa là ghi chép lại cách làm, vừa là hướng dẫn cho người mới trong vấn đề này, hy vọng nó sẽ có ích cho bạn đọc.
Trước tiên để mà nói, có một vài điểm cần làm sáng tỏ. Sau khi hiểu được một số khái niệm và luồng tích hợp thì vấn đề trở nên dễ hiểu hơn. Google cung cấp hai khái niệm Xác thực và Ủy quyền để cho phép chúng ta thay mặt người dùng tương tác với API của hệ thống. Sau khi xác thực và ủy quyền thành công, có thể thoải mái gọi API để tương tác với dữ liệu của họ.
Vậy thì thế nào là xác thực và ủy quyền?
Hiểu đơn giản, hành vi xác thực để chứng minh bạn sở hữu quyền truy cập vào tài khoản thông qua việc đăng nhập vào tài khoản Google. Nhập thông tin tài khoản và mật khẩu để đăng nhập, bạn đã xác thực thành công. Còn ủy quyền là hình thức chúng ta tạo ra một OAuth 2 Credentials để xin quyền đọc/ghi dữ liệu của người dùng. Sau khi họ ủy quyền cho ứng dụng của chúng ta được phép truy cập, ngay lập tức sẽ có được quyền gọi API.
Vậy thì việc xin được quyền thể hiện ở chỗ nào?
Đó chính là bạn lấy được mã Access Token của người dùng đã ủy quyền cho ứng dụng. Từ mã token đó gọi lên API sẽ lấy được thông tin. Hầu hết các dịch vụ của Google đều yêu cầu Access Token đã được ủy quyền để có thể lấy được dữ liệu.
Hãy tóm tắt lại, quá trình để có thể gọi được API diễn ra như sau: Tạo OAuth 2 Credentials -> Dùng Credentials đó đi xin quyền truy cập vào một dịch vụ nào đó của người dùng -> Lấy được mã Access Token -> Dùng mã đó gọi API.
Ngoài cách xác thực và ủy quyền thông qua OAuth 2 Credentials ở trên, chúng ta còn có một cách nữa để có được mã Access Token. Nhưng mã token này không phải là của người dùng, mà nó là token của Google Service Account.
Nếu để ý, bạn có thể biết nhiều dịch vụ của Google cho phép chúng ta thêm các tài khoản Google khác vào quản lý với các đặc quyền như chỉ đọc/ghi, hoặc toàn quyền (admin). Google Service Account có thể coi như là một tài khoản Google đặc biệt và có thể được thêm vào làm quản trị. Khi đó tài khoản này cũng có quyền được truy cập vào dữ liệu người dùng nên có thể thông qua nó để lấy được dữ liệu người dùng thông qua API.
Hai cách xin quyền truy cập dịch vụ (ủy quyền)
Vì để cho ngắn gọn và đỡ lan man, bài viết này tôi chỉ trình bày các ý chính của hai cách xin quyền, mã ví dụ sẽ có trong các bài viết tiếp theo.
Scope
Trước khi nói về hai cách, hãy dành thời gian tìm hiểu về scope vì nó khá là quan trọng.
Scope trong Oauth 2 rất quan trọng, nó thể hiện cho việc bạn đang muốn xin quyền gì ở người dùng. Ví dụ như quyền đọc được thông tin tài khoản như họ tên, avatar, địa chỉ email… cho đến các quyền thêm/sửa/xóa dữ liệu của người dùng. Vì thế hãy sử dụng scope để xin những quyền mà bạn thực sự muốn, tránh việc xin các quyền vô lý khác dẫn đến rủi ro cho tài khoản của người dùng, hoặc có thể người dùng sẽ không đồng ý cấp quyền cho bạn.
Scope luôn xuất hiện ở trong mã, nơi có bất kì yêu cầu xác thực và ủy quyền nào cho người dùng, hãy lưu ý điều đó cho việc viết mã sau này.
Sử dụng chính tài khoản người dùng có quyền truy cập
Rõ rồi, tài khoản người dùng có quyền truy cập vào dịch vụ, nếu lấy được Access Token được ủy quyền từ nó, chúng ta sẽ gọi được API. Đây cũng là cách đầu tiên tôi nghĩ ra để lấy được quyền truy cập vào dữ liệu người dùng.
Cách làm này cũng khá đơn giản, bao gồm các bước chính như sau:
Tạo một OAuth 2 Credentials bằng cách truy cập vào Credentials.
Sử dụng Client ID & Client secret được tạo ra để xác thực và ủy quyền tài khoản người dùng
Lấy được Access Token & Refresh Token, lưu lại chúng vào đâu đó để phục vụ cho việc gọi API sau này.
Client ID sau khi tạo ra, nhúng nó vào trong web thông qua bộ SDK của google, người dùng bấm vào nút “Đăng nhập” một popup mở ra xin quyền truy cập, nếu người dùng đồng ý bạn sẽ lấy được token và ngược lại.
Tuy nhiên cách làm này có một số hạn chế như phải xin quyền trực tiếp từ tài khoản Google của người dùng, rủi ro lộ thông tin cá nhân… Vì lẽ đó, chúng ta có thêm một cách thứ hai dưới đây.
Sử dụng Google Service Accounts
Google Service Accounts (GSA) là một tính năng của Google Cloud Platform (GCP) cho phép các ứng dụng và dịch vụ truy cập các tài nguyên trong môi trường GCP mà không cần sử dụng thông tin đăng nhập của người dùng. Service Accounts cung cấp một cách để xác thực và ủy quyền các ứng dụng và dịch vụ để tương tác với các tài nguyên và API của GCP.
Hiểu đơn giản GSA là một tài khoản Google đặc biệt, được tạo ra và thêm vào các dịch vụ để nó có quyền được truy cập vào dữ liệu. GSA có cơ chế xác thực đơn giản hơn so với tài khoản người dùng, chỉ cần sử dụng một tệp cấu hình của GSA là đã có thể gọi các API của Google.
Các bước sử dụng GSA được tóm tắt như sau:
Tạo một tài khoản GSA và tải về tệp cấu hình có định dạng JSON
Thêm tài khoản GSA vừa tạo vào dịch vụ của Google với quyền đọc/ghi tùy mục đích sử dụng.
Sử dụng thư viện do Google cung cấp tương ứng cho dịch vụ cần tương tác, thêm tệp cấu hình vào để khởi tạo client và thực hiện các cuộc gọi API như bình thường.
Bằng cách làm này, chúng ta có thể bảo vệ được thông tin người dùng, không cần xin phép từ tài khoản của họ. Tất cả những gì cần làm là thêm GSA vào nhóm quản trị với quyền hạn tùy mục đích sử dụng.
Tuy nhiên, một số dịch vụ không chấp nhận thêm tài khoản GSA. Thế nên tùy dịch vụ mà chúng ta cần lựa chọn cách xác thực và ủy quyền sao cho hợp lệ.
Cách gọi API sau khi đã có được mã Access Token
Có nhiều cách để bạn gọi được API, đơn giản và thuận tiện nhất chính là sử dụng các thư viện mà họ cấp.
Ví dụ nếu đang dùng Node.js và muốn gọi API của Google Sheets, bạn có thể sử dụng gói googleapis. Đây là thư viện đóng gói hầu hết các dịch vụ của Google như Oauth 2 đến Google Sheets, Google Driver, Google Analytics…
Một điểm cộng cho việc dùng thư viện nữa là nó sẽ đảm nhận luôn việc xử lý Access Token hết hạn, nghĩa là tự động làm mới mã truy cập thông qua Refresh Token. Tất cả những gì bạn cần làm là tải file cấu hình vào lúc khởi tạo client, sau đó thư viện sẽ cung cấp các hàm kiểm tra, làm mới mã thông báo.
Ngoài ra, chúng ta còn có cách gọi trực tiếp API bằng các Endpoints mà Google cung cấp, tuy nhiên cách này có đôi phần rời rạc và phức tạp hơn do phải xử lý và lưu trữ một lượng endpoint lớn.
Tổng kết
Có thể việc tích hợp API các dịch vụ của Google lần đầu có phần hơi mất thời gian. Nhưng sau khi hiểu được nguyên lý xác thực và ủy quyền đồng thời biết cách sử dụng các thư viện hỗ trợ do chính họ cung cấp thì chúng ta có thể đẩy nhanh quá trình tích hợp sau này.
Bài viết này mình sẽ hướng dẫn chi tiết các sử dụng AsyncTask trong Android, một cách làm rất được khuyến khích khi xử lý đa luồng trong Android.
Mỗi ứng dụng Android khi sử dụng đều được hệ điều hành cấp cho một process, và trên đó có một thread mặc định. Đó là main UI thread. Android xử lý tất cả các sự kiện/tác vụ trên một thread duy nhất gọi là main UI thread. Main UI thread không xử lý các hoạt động đồng thời vì nó chỉ xử lý một sự kiện/task tại một thời điểm.
Do vậy, nếu bạn thực hiện một tác vụ gì đó mà tốn nhiều thời gian trên main UI thread sẽ gây ra hiện tượng treo ứng dụng hay còn gọi là ANR (Application Not Responding).
Để xử lý các tác vụ cần nhiều thời gian như: Tải file từ internet, nén hoặc giải nén… thì chúng ta phải tách tác vụ đó khỏi main UI thread( gọi là xử lý đa nhiệm). Android cung cấp một số công cụ để bạn có thể làm được điều đó như:
Nhưng trước hết, chúng ta cùng nhau tìm hiểu xử lý đa nhiệm trong Android là gì? Và khi nào cần phải xử lý đa nhiệm thay vì thực hiện ngay trên UI thread?
Xử lý đa nhiệm trong Android
Nếu các sự kiện hoặc một task nào đó không được xử lý đồng thời. Thì toàn bộ mã của ứng dụng Android sẽ chạy trên luồng chính và code sẽ được thực hiện tuần tự từng dòng một.
Giả sử nếu bạn thực hiện một công việc/ tác vụ cần thời gian xử lý như tải nhạc từ Internet, ứng dụng sẽ hiển thị trạng thái treo cho đến khi tải xong.
Để mang lại trải nghiệm người dùng tốt, tất cả tác vụ có khả năng chạy chậm đều phải chạy không đồng bộ.
Mình có thể tạm liệt kê một số tác vụ cần thời gian xử lý như:
Truy cập tài nguyên (như MP3, JSON, Hình ảnh) từ Internet.
Các Logic phức tạp mất khá nhiều thời gian như: Nén/giải nén file, sao chép/di chuyển file trong bộ nhớ…
Và còn rất nhiều các trường hợp khác cần phải xử lý bất đồng bộ, đa nhiệm khác nữa. Tùy vào ứng dụng của bạn như thế nào mà ứng biến cho phù hợp.
Bài viết này mình sẽ tập trung giới thiệu cho các bạn các sử dụng AsyncTask trong Android, một khái niệm của Android và cũng được khuyên dùng khi cần xử lý tác vụ nặng, cần thời gian.
AsyncTask là một abstract Android class, giúp ứng dụng Android xử lý main UI thread hiệu quả hơn. AsyncTask trong Android cho phép chúng ta thực hiện những tác vụ dài mà không ảnh hưởng đến main thread.
Khi nào thì sử dụng AsyncTask?
Để dễ hình dung, mình giả sử bạn tạo một ứng dụng Android để tải xuống tệp MP3 từ Internet.
Sơ đồ trạng thái dưới đây cho thấy một loạt các hoạt động sẽ diễn ra khi bạn chạy ứng dụng
Trong khi chờ nhận file MP3 từ máy chủ, ứng dụng sẽ bị treo vì main thread vẫn đang chờ tác vụ tải xuống hoàn tất.
Để khắc phục điều này, chúng ta có thể tạo thread mới và thực hiện các tác vụ trên thread mới đó. Do đó giao diện người dùng sẽ không bị ảnh hưởng và treo nữa
Nhưng việc xử lý với thread riêng biệt có thể tạo ra một số vấn đề như việc cập nhật giao diện người dùng. Bạn sẽ cần phải cập nhập trạng thái download được bao nhiêu % file đó, và khi kết thúc tải thì cũng phải cập nhập cho người dùng biết. Nếu bạn sử dụng Thread đơn giản của java thì việc cập nhập này sẽ khá phức tạp.
Android đã xem xét tất cả các vấn đề này và tạo một lớp chuyên dụng có tên là AsyncTask.
Tạo một class mới bên trong Activity và kế thừa từ AsyncTask như dưới đây
privateclass DownloadMp3Task extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls){ //Yet to code } protectedvoidonProgressUpdate(Integer... progress){ //Yet to code } protectedvoidonPostExecute(Long result){ //Yet to code }}
Để thực thi tác vụ, đơn giản bằng cách gọi phương thức execute
newDownloadMp3Task().execute(mp3URL);
Bản chất Asynctask gồm có 4 bước:
Bước 1:onPreExecute()
Được thực hiện trước khi bắt đầu thực hiện tác vụ. Hàm được gọi trước phương thức doInBackground() và được gọi trên UI thread.
Thông thường, hàm này được dùng để hiển thị thanh progressbar thông báo cho người dùng biết tác vụ bắt đầu thực hiện
Bước 2: doInBackground()
Tất cả code mà cần thời gian thực hiện sẽ được đặt trong hàm này. Vì hàm này được thực hiện ở một thread hoàn toàn riêng biệt với UI thread nên bạn không được phép cập nhật giao diện ở đây.
Để có thể cập nhập giao diện khi tác vụ đang thực hiện. Ví dụ như cập nhập trạng thái % file đã download được, chúng ta sẽ phải sử dụng đến hàm bên dưới onProgressUpdate()
Bước 3:onProgressUpdate()
Hàm này được gọi khi trong hàm doInBackground() gọi đến hàm publishProgress()
Bước 4: onPostExecute()
Hàm này được gọi khi doInBackground hàm thành công việc. Kết quả của doInBackground() sẽ được trả cho hàm này để hiển thị lên giao diện người dùng.
Trong quá trình Asynctask thực hiện tác vụ, bạn hoàn toàn có thể tạm dừng bất kể lúc nào mà không cần phải đợi AsyncTask làm xong. Đơn giản là bạn gọi hàm cancel(boolean)
Một số lưu ý về các sử dụng AsynctTask
Lớp AsyncTask phải được thực hiện trên UI Thread
Hàm execute(Params…) phải được gọi trên UI Thread
Không nên gọi onPreExecute (), onPostExecute(), doInBackground (Params…), onProgressUpdate (Progress…) theo cách thủ công.
Task chỉ được thực thi một lần tại một thời điểm (Exception sẽ được throw nếu thực hiện lần thứ hai).
Như vậy là mình đã hướng dẫn các bạn kiến thức cơ bản về cách sử dụng AsyncTask trong Android. Khi bạn đã nắm được bản chất thì việc sử dụng và ứng biến trong từng trường hợp cụ thể sẽ rất dễ dàng.
Đừng quên chia sẻ bài viết cho các bạn khác cùng tìm hiểu nữa nhé.
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Object Reference là một khái niệm thể hiện một biến tham chiếu, tức là thay vì lưu trữ giá trị thực nó lưu lại địa chỉ ô nhớ & thao tác với dữ liệu dựa trên địa chỉ đó. Điều này giúp tiết kiệm bộ nhớ cho các ứng dụng. Tuy nhiên cũng không ít điều phiền toái từ nó mà ra.
Kiểu dữ liệu nguyên thuỷ
Trong Javascript, chúng ta có những kiểu dữ liệu “nguyên thuỷ” (Primitive Types) bao gồm: undefined, null, string, number, boolean và symbol.
Các biến khi được khởi tạo với các giá trị này sẽ được cấp pháp một ô nhớ nhất định không có liên quan đến nhau. Ví dụ:
let name = "estacks";
let name2 = name; // estacks
name = "estacks.icu";
console.log(name); // estacks.icuconsole.log(name2); //estacks
Bất kì khi nào thay đổi biến name thì những biến trước được gán bằng name vẫn giữ nguyên giá trị. Điều này cũng tương tự với kiểu dữ liệu number, boolean…
Không giống với Primitive Types, Object & Array, khi có nhiều hơn một biến được tạo để lưu trữ một object, array, function. Những biến đó được trỏ đến địa chỉ đã được phân bổ tương tự trong bộ nhớ.
Nhìn vào ví dụ trên, khi phần tử thứ nhất trong arr1 bị thay đổi, kéo theo đó thì arr2 cũng bị thay đổi theo. Tại sao vậy?
Khi arr1 được khai báo, bộ nhớ sẽ được cấp phát và một địa chỉ được lưu lại bởi nó. Sau đó arr2 được gán bằng arr1. Vì arr1 là một mảng thay vì tạo mới một bản sao của mảng đó, arr2 chỉ đơn giản là trỏ đến địa chỉ lưu arr1. Bằng cách đó, bất kỳ thay đổi nào được thực hiện trên arr1 cũng sẽ được thay đổi trên arr2 hoặc ngược lại bởi vì chúng trỏ đến cùng một vị trí. Điều này cũng tương tự với object & function.
Đây cũng là trường hợp mình thấy phổ biến nhất. Khai báo một biến dựa trên một biến khác mà quên mất biến đó có tính chất reference. Những bạn mới vào nghề sẽ rất dễ bị mắc lỗi này, vì thế khi biết được tính chất này thì hãy tránh khai báo một biến dựa trên một biến khác nhé, thay vào đó hãy sao chép nó ra.
Ở ví dụ trên mình vừa copy person1 sang person2. Hãy thử thay đổi giá trị của name hoặc age ở person1 thì person2 vẫn không bị thay đổi. Nhưng nếu thay đổi city hoặc district thì person2 vẫn bị thay đổi theo. Lý do là bởi address được khai báo với giá trị là object nên address vẫn có tính chất reference.
Cách copy object bằng cú pháp spread (…) ở trên hay nhiều cách copy khác như dùng Object.assign chỉ có thể sao chép “nông” (shallow) được đối tượng, để có thể sao chép được toàn bộ đối tượng lồng nhau như vậy mà tránh reference có thể dùng một trong ba cách sau:
Thứ nhất là dùng tổ hợp cú pháp JSON.parse & JSON.stringify. Đây là cách đơn giản & nhanh chóng nhất.
Và cuối cùng, sử dụng thư viện có sẵn các hàm deepCopy như lodash, ramda… hoặc dùng package clone có sẵn trên npm.
Đặt một đối tượng dùng chung
Hình dung như bạn có một config để sử dụng làm mặc định nếu không tìm thấy những config riêng của chúng, bạn sẽ export ra một object chứa những config đó & thật tai hại nếu như trong quá trình sử dụng chúng, bạn vô tình thay đổi giá trị ở một nơi nào đó.
// file app.jsconst conf = require('./config.js');
let config = findConfig(); // nullif (!config) config = conf;
...
// vô tình thay đổi conf
config.connection.port = 443;
Thì lúc này ở những file khác đang có import config.js thì connection.port đều bị chuyển thành 443 hết.
Giải pháp cho vấn đề này là hãy deep clone config ra trước khi sử dụng. Để tránh việc thay đổi chúng sẽ dẫn đến những lỗi ngớ ngẩn mà có thể mất cả tuần để debug :D.
Kết luận
Kiến thức về Object Reference chỉ đơn giản là chỉ một biến tham chiếu. Khi làm việc với biến tham chiếu bạn phải hết sức cẩn thận để không phải mắc những sai lầm như tôi ở trên nhé!
MSB tự hào là Ngân hàng Thương mại Cổ phần đầu tiên được thành lập vào năm 1991. Trải qua hơn 32 năm phát triển, nhờ sức mạnh tập thể và tinh thần tiên phong của các cổ đông sáng lập, MSB đã không ngừng đạt được dấu mốc đột phá mới trong lĩnh vực tài chính – ngân hàng và là nơi vươn tầm sự nghiệp của gần 8,000 Cán bộ nhân viên.
Tập trung mạnh mẽ vào đào tạo và phát triển tài năng
Với sứ mệnh là “đối tác phát triển sự nghiệp” của CBNV, mỗi MSBers luôn được cung cấp các chương trình đào tạo được thiết kế chuyên biệt theo từng nhóm chức danh cùng cơ hội học hỏi với các chuyên gia hàng đầu trong và ngoài nước. Bên cạnh đó, yếu tố Training on Job luôn được ưu tiên song hành giúp các nhân sự rút ngắn được khoảng cách giữa lý thuyết và thực tiễn.
Chính sách Người bạn đồng hành chính là ví dụ điển hình của Training on Job. Mỗi nhân sự mới khi gia nhập MSB, ngoài các khóa đào tạo được cung cấp theo lộ trình, sẽ có một người bạn đồng hành là những nhân sự dày dặn kinh nghiệm để hướng dẫn và hỗ trợ trong 2 tháng đầu tiên.
Như một kim chỉ nam trong chính sách nhân sự, MSB đặc biệt quan tâm, đầu tư xây dựng các chương trình đào tạo và quy hoạch đội ngũ nhân sự kế cận với sự đồng hành của các đối tác tư vấn uy tín trong và ngoài nước như: McKensey, Dale Canergie, BCG. Hoạt động đào tạo & quy hoạch đội ngũ nhân sự kế cận được triển khai đa dạng các cấp độ với một số chương trình điển hình như: Talent Pool và Management Trainee.
Thu nhập và đãi ngộ hấp dẫn
MSB xây dựng cơ chế lương thưởng minh bạch, rõ ràng, tương xứng với năng lực và sự cống hiến. Trong bối cảnh phải đối diện với những thách thức bất ổn của nền kinh tế dưới sự tác động của đại dịch covid 19, MSB luôn nỗ lực đảm bảo lợi ích tài chính cho nhân viên trong thời kỳ đại dịch. Vượt qua khó khăn và thách thức, trong năm 2021, mức lương bình quân của các MSBer năm 2021 tăng gần 12% so với năm 2020.
Bên cạnh đó, chính sách phúc lợi cho cán bộ nhân viên rất đa dạng, bao gồm phúc lợi tài chính (trợ cấp, bảo hiểm, ưu đãi sản phẩm dịch vụ tài chính, …) và phi tài chính (tiêm vacxin phòng chống Covid-19, teambuilding, quà tặng đội ngũ nhân sự và gia đình vào những dịp đặc biệt). Đây được coi là nền tảng để MSB kiến tạo một môi trường làm việc ý nghĩa, để nhân viên luôn “khỏe” cả về thể chất lẫn tinh thần.
Ông Nguyễn Ngọc Cương – Giám đốc Nhân sự MSB cho biết: “Nhân sự nói chung và nhân tài số nói riêng là nguồn lực giá trị với bất cứ tổ chức nào. Vì vậy, chúng tôi không chỉ tuyển dụng, đào tạo, cùng vươn tầm sự nghiệp mà còn phụng sự đội ngũ của mình. Mục tiêu của ngân hàng là nhân viên “khỏe” cả về thể chất và tinh thần, chung tay đưa văn hóa chuyển đổi số trở thành ADN của MSB”.
Văn hoá doanh nghiệp hướng tới sự gắn kết
MSB được Tạp chí HR Asia vinh danh là một trong những “Nơi làm việc tốt nhất Châu Á “hai năm liên tiếp 2021 – 2022. Sự công nhận này chứng tỏ MSB đã có những chính sách nhân sự vượt trội và chế độ đãi ngộ hấp dẫn, đồng thời tạo ra một môi trường làm việc hiệu quả, năng động và văn hóa nội bộ gắn kết cán bộ nhân viên.
Ngoài giờ làm việc, MSB đẩy mạnh các hoạt động gắn kết nội bộ như câu lạc bộ chạy, âm nhạc và các hoạt động giải trí khác. Điều này giúp tạo ra một môi trường lành mạnh, năng động và cởi mở, nơi mọi nhân viên có thể tận hưởng và phát triển tối đa khả năng của mình
Nhờ chính sách nhân sự và văn hoá làm việc khác biệt, MSB đã giữ chân và thu hút nhiều nhân tài. Trong cơ cấu nhân sự của Ngân hàng này có tới 30% cán bộ nhân viên gắn bó trên 10-15 năm. Thời gian tới, MSB sẽ tiếp tục tổ chức nhiều chương trình, hoạt động tuyển dụng để thu hút nhiều hơn nữa Nhân tài số để cùng nhau hoàn thành các kế hoạch kinh doanh đã đặt ra.
Bạn đã bao giờ xây dựng ứng dụng web bằng VueJS chưa? Bạn đã từng nghe nói tới 2 khái niệm Server Side Rendering (SSR) và Client Side Rendering (CSR) chưa? Bài viết này, chúng ta sẽ cùng nhau tìm hiểu và làm rõ hai khái niệm này, cũng như giải pháp để render VueJS app phía server.
Trước khi bắt tay vào tìm hiểu Nuxtjs, chúng ta cùng xem qua hai cơ chế render ứng dụng web nhé.
So sánh Client-side rendering (CSR) vs Server-side rendering (SSR)
Theo truyền thống, khi xây dựng các trang web hay ứng dụng web đều có chiến lược chung là đó là server sẽ chuẩn bị sẵn các nội dung HTML để gửi xuống trình duyệt. Các nội dung này sẽ được trình duyệt kết hợp với CSS để tạo thành tranh web cho bạn sử dụng.
Sau này, xuất hiện các Javascript framework hiện đại như ReactJS, VueJS… đã làm thay đổi cách tiếp cận khi phát triển ứng dụng web, cách tiếp cận mới mang tới khả năng giảm gánh nặng cho server, xây dựng mô hình phân tán thay vì tập trung tại server.
Đến đây, rất nhiều diễn đàn lại nảy sinh tranh luận gay gắt xem cách tiếp CSR hay SSR, cái nào tốt hơn, cái nào tối ưu!?
Server Side rendering (SSR) là gì ?
Đây là cơ chế cổ điển, được dùng rất phổ biến từ xưa đến nay rồi. Gọi là server side rendering vì mọi thứ sẽ được xử lý tập trung ở phía server.
Về cơ bản thì luồng của cơ chế này như hình bên dưới đây:
Có thể tóm gọn lại gồm các bước như sau:
Khi trình duyệt gửi một request tới server, server sẽ xử lý logic, lấy dữ liệu trong database, làm bla bla… cuối cùng tạo sẵn nội dung HTMl và trả lại cho trình duyệt.
Trình duyệt nhận được nội dung HTML, dựa vào nội dung HTML mà nó có thể tải thêm các file javascript hay CSS để hiển thị nội dung trang HTML
Có lẽ phần lớn các trang web kiểu như vnexpress, dantri, vntalking… đều đang sử dụng cách tiếp cận này.
Cách tiếp cận này thì hoàn toàn khác với cách SSR. Hiểu đơn giản với cách tiếp cận này thì việc render HTML, CSS sẽ được thực hiện ở client. Khi trình duyệt gửi yêu cầu tới server, máy chủ sẽ gửi một loạt tài nguyên cần thiết để khởi tạo và chạy ứng dụng web, từ đó việc render nội dung sẽ thực hiện trên trình duyệt.
Kiểu tiếp cận này khá phổ biến với các ứng dụng web kiểu Single Page (SPA – Single Page Application), ứng dụng sẽ lấy dữ liệu thông qua REST API.
Các ứng dụng kiểu SPA sẽ không phải tải lại trang mỗi khi nội dung thay đổi. Với các JS framework hiện đại như React, Vue, Angular… đều hỗ trợ để xây dựng ứng dụng kiểu như vậy.
Ứng dụng có giao diện phức tạp, tương tác nhiều với người dùng
Dữ liệu lớn và động
Tập trung vào các trang web phục vụ lượng lớn người dùng
Server-side rendering
Đồ họa phức tạp, chuyên sâu vào tính toán, cần sức mạnh xử lý của server.
Dữ liệu nhỏ, ít thay đổi
Ok, bạn đã hiểu cơ bản hai cơ chế render này rồi đúng không? Phần tiếp theo, chúng ta sẽ bắt tay vào tìm hiểu NuxtJS, một framework giúp bạn tạo ứng dụng SPA nhưng chạy trên server thay vì trên client. Thế mới hay chứ J
NuxtJS là gì?
Như các bạn đã biết, các JS framework như Vue, React, Angular… giúp bạn nhanh chóng tạo các ứng dụng web app theo cơ chế Client Side Rendering. Điều này có thể tốt cho trải nghiệm người dùng nhưng nó lại không tốt cho SEO, các con bot của Google có lẽ vẫn còn hơi “ngu”, chưa crawl được nội dung các ứng dụng kiểu Single page như vậy. Đó cũng là điểm cộng của cơ chế Server side rendering, và là nguyên nhân chính để cho ra đời các framework như Nuxt.JS.
Nuxt.JS là một Javascript framework để tạo các ứng dụng VueJS. Mục tiêu là để chúng ta có thể tạo một ứng dụng linh hoạt nhưng được render phía máy chủ, tương tự một trang web tĩnh giống như các website thông thường (điều mà có lợi cho SEO).
NuxtJS tập trung vào khía cạnh render giao diện người dùng. Ngoài ra, Nuxt.js có rất nhiều tính năng giúp bạn phát triển giữa phía client và server như Dữ liệu bất đồng bộ (Asynchronous Data), Middleware, Layouts, v.v.
Bài viết này, chúng ta sẽ cùng nhau tìm hiểu NuxtJS, cách cài đặt và cũng cách nó hoạt động để xây dựng ứng dụng được hỗ trợ bởi Vue phía server.
NuxtJS hoàn toàn tương tự với NextJS framework, cũng là một framework được xây dựng để tạo các ứng dụng React phía máy chủ.
Tại sao nên sử dụng NuxtJS
Nuxt.JS có rất nhiều tính năng hữu ích, giúp bạn nhanh chóng xây dựng các ứng dụng web, có thể kể tới như:
Automatic Code Splitting
Hỗ trợ Vue hoàn hảo
Static File Rendering
Hỗ trợ phiên bản HTTP/2
Hệ thống router và dữ liệu bất đồng bộ dễ sử dụng
Hỗ trợ tính năng Hot reloading (rất hữu ích cho các bạn developer)
.v.v…
Khởi tạo một dự án với Nuxt.JS
Để bắt đầu một dự án Nuxt.JS vô cùng đơn giản, chỉ đôi dòng lệnh là bạn đã khởi tạo xong và chạy được hello world rồi.
Giống với React, bạn có công cụ create-react-app thì Nuxt.JS cũng có công cụ tương tự, có tên là create-nuxt-app (Hay là các nhóm phát triển bắt chước ý tưởng của nhau nhỉ!? )
Lưu ý: Bạn nhớ cài đặt công cụ create-nuxt-app trong máy tính đã nhé. Câu lệnh cài đặt: npm install -g create-nuxt-app. Và cả npx nữa nhé: npm i npx
Với câu lệnh create-nuxt-app, bạn còn có nhiều tùy chọn nâng cao khác nữa, như bạn muốn tích hợp sẵn server-side frameworks, UI frameworks, testing frameworks… hay không? Trong khuôn khổ bài viết, chúng ta chỉ tìm hiểu cơ bản thôi.
Ok, sau khi tạo dự án xong thì chạy thử thôi.
npm run dev
Sau khi chạy ứng dụng thành công, bạn vào trình duyệt gõ: http://localhost:3000. Kết quả thu được là giao diện trang web mặc định như dưới đây:
Chúc mừng bạn đã có khởi đầu thành công.
Cấu trúc thư mục dự án Nuxt.JS
Cấu trúc mặc định được tạo gồm các thư mục và các tệp như hình dưới đây. Chúng ta sẽ cùng nhau xem xét ý nghĩa và công dụng của chúng.
Assets: Chứa những tài nguyên phục vụ hiển thị trang web như ảnh, fonts chữ, hay CSS…
Components: Cũng giống như ứng dụng Vue thông thường, các component là các thành phần được tạo ra để bạn tái sử dụng trong ứng dụng như: Button, Input, Card, Dialog…
Layouts: thư mục layouts là nơi chứa các thành phần tạo nên layout của ứng dụng như layout dọc, layout ngang. Đây là nơi hợp lý nhất mà bạn có thể để các thành phần như Header, Footer, Theme…
Middleware: Middleware là nới bạn dùng để tạo các function mà chạy trước khi render trang.
Pages: Thư mục này chứa các view của ứng dụng cũng như định nghĩa routes cho ứng dụng luôn.
Plugins: Chứa các javascript plugin mà bạn muốn chạy trước khi khởi tạo root vue.js application.
Static: Tương tự như thư mục assets nhưng mà nó cho phép truy cập trực tiếp, được map tự động với domain từ client mà không cần phải qua router hay biến môi trường. Ví dụ: /static/robots.txt sẽ được truy cập trực tiếp: http://localhost:3000/robots.txt
Store: Chứa các tệp của vuex, dùng quản lý state của ứng dụng. Vuex Store được cài đặt kèm với Nuxt nhưng mặc định thì lại bị disable. Muốn enable chúng, bạn chỉ cần tạo một tệp index.js trong thư mục store là được.
nuxt.config.js: Cấu hình ứng dụng Nuxt
package.json: Tương tự như dự án react, vue, nodejs… là nơi cấu hình build, và chứa các dependencies và scripts
Routing
Cách thức hoạt động của router trong Nuxt là nó tự động tạo cấu hình vue-router dựa trên cây các tệp .vue trong thư mục pages.
Để dễ hình dung hơn, chúng ta sẽ xem xét ví dụ dưới đây:
Khi navigate giữa các page, Nuxt khuyến khích chúng ta sử dụng nuxt-link component thay vì dùng router-link.
Triển khai ứng dụng Nuxt.JS
Đây là công đoạn cuối cùng của quá trình phát triển bất kỳ ứng dụng nào. Sau khi bạn phát triển, kết quả cuối cùng sẽ là triển khai lên server thật của khách hàng để chạy thật. Người ta gọi đây là “lễ trưởng thành của một thanh niên”
Nhìn vào file package.json, bạn sẽ thấy 4 câu lệnh sau:
Mình sẽ giải thích chi tiết từng câu lệnh:
Câu lệnh
Công dụng
dev
Chạy một development server trên localhost:8080, hỗ trợ hot-reloading
build
Build ứng dụng với Webpack và minify các tệp CSS, JS
start
Chạy server ở chế độ production (sau khi chạy nuxt build)
generate
Build ứng dụng và generate tất cả cá route tương ứng với các HTML files (sử dụng cho các static hosting)
Như vậy, khi bạn muốn deploy ứng dụng Nuxt, bạn có thể chọn một trong 3 chế độ deploy:
Server-Side Rendering (Câu lệnh: npm run build)
Static Generated (Câu lệnh: npm run generate)
Single Page Applications
Riêng với chế độ Single Page Application, bạn cần thêm tham số này vào trong nuxt.config.js
export default { mode: 'spa'}
Sau đó, quay trở lại package.json để thêm vào trong scripts.
Qua bài viết này, chúng ta đã hiểu cơ bản NuxtJS là gì, cấu trúc dự án Nuxt cũng cách để deploy một ứng dụng Nuxt. Về cá nhân mình, mình rất thích Javascript, từ việc code web app với Vue, React rồi mobile với React Native… Giờ đây, với NuxtJS, mình lại có thêm một công cụ tuyệt vời nữa để tiếp tục gắn bó lâu dài với JS.
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Commit code là việc làm thường ngày của các developer, nhưng đôi khi vì một lý do nào đó mà bạn lỡ commit thiếu nội dung hay commit xong mới phát hiện ra còn chỗ quên chưa sửa lại thì phải làm thế nào?
Nhiều người có thể sẽ chọn cách tạo một commit khác để sửa chữa lỗi lầm nhưng điều đó sẽ làm cho cây git của chúng ta xuất hiện những commit dài lê thê hay thậm chí còn có thể bị đánh giá là làm ẩu, thiếu chuyên nghiệp…
Sửa lại commit
Git cho phép chúng ta sửa đổi nội dung của commit cuối cùng bằng lệnh git commit --amend --no-edit. Bạn có thể sử dụng để giải quyết vấn đề nêu ở trên.
Ví dụ commit cuối cùng của tôi là “release version 1.0.1” và ngay khi vừa commit xong tôi phát hiện ra mình quên chưa add file README.md, do đó tôi có thể làm:
$ git log
commit 56da84715291dbb683269c085fe9a4b42aafb1e7
Author: hoaitx <tonghoai.tnn@gmail.com>
Date: Sun Jun 20 15:31:35 2021 +0700
release version 1.0.1
$ git add README.md
$ git commit --amend --no-edit
$ git log
commit ac48bc383726cfaaf4032b68ef6e6bece6cec368
Author: hoaitx <tonghoai.tnn@gmail.com>
Date: Sun Jun 20 15:32:35 2021 +0700
release version 1.0.1
Sau đó hãy thử kiểm tra lại lịch sử commit, bạn sẽ thấy file README.md đã được add vào.
Git cũng cho phép bạn sửa lại message của commit cuối cùng bằng lệnh git commit --amend -m <message>.
Ví dụ tôi muốn sửa lại message “release version 1.0.1” -> “release v1.0.1” thì:
Cách này chỉ áp dụng cho trường hợp bạn mới chỉ commit ở local chứ chưa push lên remote. Khi commit chưa push lên remote thì bạn có thể xoá chúng ở local bằng lệnh git reset --hard <remote/branch>.
Lệnh này sẽ reset lại HEAD ở local bằng với HEAD ở remote, nôm na là nó đồng bộ những commit ở remote về local nên là sẽ xoá hết những commit chưa push ở local.
Lưu ý rằng việc này cũng đồng nghĩa với những commit chưa push ở local sẽ bị mất hết và bạn sẽ phải viết lại.
Ví dụ tôi reset lại branch develop ở remote name là origin:
$ git reset --hard origin/develop
Kết luận
Trên đây là một số câu lệnh git xử lý một số trường hợp liên quan đến việc commit “ẩu”. Dù sao trước khi commit thì mọi người cũng nên kiểm tra lại tất cả nội dung thật kĩ nhé!
Bài viết đến từ anh Lê Văn Tám – Senior Cloud Engineer
Cloud Architect team @Techcombank
Như các bạn đã biết, tại Techcombank, đã có rất nhiều ứng dụng được di chuyển lên Cloud. Mỗi ứng dụng phục vụ các nhóm đối tượng mục tiêu khác nhau bao gồm nhân viên nội bộ ngân hàng (internal users) hoặc khách hàng sử dụng sản phẩm dịch vụ của Techcombank (external users).
Trên AWS cloud, các nguồn lực như EC2, RDS… sẽ tính phí dựa theo thời gian hoạt động. Đối với môi trường production, các ứng dụng này sẽ chạy liên tục 24/7. Tuy nhiên, đối với môi trường non-production (dev, sit, uat, pre-prd …), tùy theo mục đích sử dụng, chúng sẽ được bật/tắt trong khoảng thời gian nhất định để giảm chi phí.
Thời gian đầu, quá trình bật/tắt các ứng dụng được thực hiện thủ công. Tức là, khi đội ngũ phát triển cần kích hoạt ứng dụng, sẽ truy cập vào AWS Console để bật lần lượt từng nguồn lực (EC2, RDS…). Việc này sẽ gây tốn khá nhiều thời gian vì tính lặp lại của một thao tác nhiều lần.
Về sau, đội ngũ phát triển của Techcombank đã tìm ra một giải pháp cải tiến hơn cho vấn đề trên bằng cách sử dụng các Lambda tự động.
Chi tiết của giải pháp này như sau:
Đầu tiên, EventBridge Scheduler sẽ được thiết lập để chạy (theo lịch phù hợp với nhu cầu của tổ chức) và sẽ kích hoạt Lambda có tên là “Start app”: Lambda này sử dụng Python boto3 lib để gửi yêu cầu tới API của AWS nhằm khởi động các EC2, RDS và cập nhật các thông số của autoscaling group như min/max/desire size.
Tiếp theo, EventBridge Scheduler khác sẽ được thiết lập để chạy (theo lịch phù hợp với nhu cầu của tổ chức) và sẽ kích hoạt Lambda “Stop app. Lambda này cũng sử dụng Python boto3 lib để gửi yêu cầu đến API của AWS nhằm dừng hoạt động EC2, RDS và điều chỉnh các thông số của autoscaling group như min/max/desire size về 0.
Mặc dù giải pháp này hiệu quả, nhưng vẫn còn một số hạn chế:
Khi các phiên bản EC2, RDS được khởi động cùng một lúc, một số ứng dụng yêu cầu database (RDS) được khởi động trước.
Khi các phiên bản EC2, RDS dừng lại cùng một lúc, một số ứng dụng sẽ cần database (RDS) được dừng lại sau.
Hơn nữa, mỗi hệ thống đều cần thiết lập một bộ Lambda riêng.
Do đó, để giải quyết các thách thức này, team CloudOps đã nghiên cứu và đưa ra một giải pháp gọi là System Scheduler, giúp bật/tắt ứng dụng một cách đồng bộ và tự động.
Để cải thiện quá trình bật/tắt các AWS resources (EC2/RDS), đội ngũ Techcombank đã đưa ra một giải pháp mới như sau:
Đầu tiên, tạo một tài khoản AWS gọi là “master” để điều khiển quá trình bật/tắt AWS resources (EC2/RDS) của các tài khoản AWS khác (gọi là tài khoản ứng dụng). Tài khoản AWS này bao gồm các thành phần sau:
DynamoDB: Lưu trữ thông tin của tài khoản ứng dụng (app account) bao gồm ID tài khoản AWS, IAM cross role, lịch bật/tắt instance.
EventBridge Scheduler: Kích hoạt chức năng Lambda. Lambda lấy thông tin từ DynamoDB trên (AWS account ID, IAM cross role, lịch bật/tắt instance), sử dụng IAM cross để truy cập vào application account và gọi AWS API để bật/tắt EC2/RDS instance.
Trong mỗi tài khoản ứng dụng: tạo ra các AWS resources bằng cách sử dụng mẫu SAM (Serverless Application Model). Điều này giúp tự động tạo resources tag và tiếp tục/tạm ngừng các hoạt động của AutoScaling group.
Cụ thể, SAM sẽ tạo ra các AWS resources như sau:
1. Những tài nguyên phục vụ việc tự động đánh nhãn
– EventBridge: Khi một phiên bản EC2 hoặc RDS được tạo, chức năng Lambda “Tự động đánh nhãn” sẽ được kích hoạt.
– Chức năng Lambda “Tự động đánh nhãn”: Tự động đánh nhãn cho tất cả các tài nguyên EC2, RDS, AutoScalingGroup, với các nhãn sau:
Schedule: Biểu thị khung thời gian áp dụng cho việc bật/tắt phiên bản.
DoNotStop: Gắn nhãn này nếu không muốn áp dụng lịch trình (schedule).
Reason: Lý do áp dụng lịch trình (schedule).
Chức năng Lambda này có tác dụng này giúp các nhà phát triển ứng dụng của mỗi tài khoản biết khung thời gian bật/tắt và cũng như các trường hợp ngoại lệ khi không muốn ứng dụng được bật tắt tự động (ví dụ: khi thực hiện PT test, chuẩn bị triển khai tính năng mới yêu cầu nhiều tài nguyên hơn thường lệ…)
2. Những tài nguyên phục vụ việc tự động tạm ngừng/tiếp tục hoạt động của AutoScalingGroup
EventBridge Scheduler sẽ kích hoạt Lambda tự động tiếp tục hoạt động của AutoScalingGroup (ASG).
EventBridge Scheduler sẽ kích hoạt Lambda tự động tạm ngừng hoạt động của AutoScalingGroup (ASG).
Bằng cách áp dụng các phương pháp mới này, Techcombank đã thành công trong việc giải quyết được các vấn đề sau:
Quá trình bật/tắt hệ thống được tập trung, quản lý thống nhất từ một nguồn duy nhất
Nhà phát triển của mỗi ứng dụng có thể biết được khung thời gian bật/tắt hệ thống dựa trên nhãn tài nguyên.
Team CloudOps dễ dàng quản lý lịch trình bật/tắt tài nguyên của tất cả các ứng dụng và dễ dàng tiếp nhận/xử lý khi có yêu cầu thay đổi lịch trình phía nhà phát triển ứng dụng.
Thuộc dự án “Inside GemTechnology“ do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!
Bài viết đến từ anh Lê Văn Tám - Senior Cloud Engineer
Cloud Architect team @Techcombank
Bối cảnh:
Ở Techcombank, bộ phận Dịch vụ Hạ tầng (ITO - Infrastructure Services) đang vận hành rất nhiều ứng dụng (application) khác nhau để phục vụ người dùng nội bộ và khách hàng bên ngoài như quản lý nợ (Debt Management), tra cứu tín dụng (ICS), tra cứu và thu hộ thuế nhà nước (TCS), quản lý đặt chỗ (QMS)…
Theo chiến lược chuyển đổi số theo định hướng “Cloud First”, Techcombank đã thực hiện di dời (migrate) được gần 30 ứng dụng (application) từ on-prems lên cloud từ giữa năm 2021 tới nay. Việc di dời thành công các ứng dụng đã bước đầu đã chứng minh được lợi ích của chiến lược “Cloud first”.
Tuy nhiên, trong quá trình chuyển đổi “nóng” đó, Techcombank nói chung và đội ngũ ITO nói riêng cũng gặp phải một số vấn đề do chưa đủ nguồn lực để triển khai, đặc biệt là vấn đề giám sát (monitor) các ứng dụng này. Thời điểm đó, mỗi ứ [...]
Công nghệ Đám mây (Cloud) đã trở thành một phần không thể thiếu trong các nền tảng lớn hiện nay. Với vai trò ngày càng quan trọng và phức tạp, điện toán đám mây đặc biệt được chú trọng trong lĩnh vực tài chính. Không nằm ngoài cuộc chơi, các ngân hàng lớn tại Việt Nam cũng đang tiến hành quá trình chuyển đổi số cho toàn bộ hệ thống của mình.
Chị Elizabeth Nguyễn, một Quản lý Dự án Cao Cấp - Dự án Cloud tại Techcombank, sẽ mang tới những chia sẻ giúp chúng ta hiểu được tầm quan trọng của công nghệ Cloud trong công cuộc chuyển đổi số của lĩnh vực tài chính ngân hàng.
Dịch vụ Cloud giải quyết gì cho bài toán kinh doanh (business) nói chung & bài toán nghiệp vụ ngân hàng (banking) nói riêng?
Một trong những lý do quan trọng nhất cho việc chuyển đổi sang Cloud của Techcombank là [...]
Học code từ những năm tháng còn là sinh viên, được tiếp xúc với nhiều ngôn ngữ lập trình và chúng ta biết chọn cho mình một ngôn ngữ tốt nhất để sau này sẽ dùng nó như một kĩ năng chính của mình. Lúc đi làm nghe đồng nghiệp, anh em bạn bè bàn tán về ngôn ngữ này tốt hơn ngôn ngữ kia, ngôn ngữ này đáng học hơn… khiến bạn càng khát khao chinh phục những thứ đó.
Tôi từng có suy nghĩ sẽ code cả đời, bởi vì ngoài code ra tôi không biết còn có thể làm gì nữa thế nên tôi cố gắng trau dồi kĩ năng code ngày một tốt hơn bằng cách không ngừng tìm kiếm tài liệu nói về điều đó. Bỗng một ngày chân ướt chân ráo nộp hồ sơ vào làm cho một công ty chuyên cung cấp sản phẩm dưới dạng SaaS tại đây tôi đã được học hỏi thêm nhiều điều mới, những kiến thức mà tôi thấy như chân trời mới. Một trong số đó là khả năng tư duy sản phẩm.
Tư duy sản phẩm là gì?
Bạn có thể tìm kiếm Google để biết được khái niệm, còn đối với tôi hiện tại nó là biết cách tạo ra sản phẩm có giá trị cho người dùng. Thế nào là có giá trị?
Là sản phẩm giải quyết được một vấn đề gì đó cho nhiều người và họ thích sử dụng sản phẩm của bạn. Để làm được điều đó đòi hỏi bạn phải “thấu hiểu” người dùng, luôn luôn phải cập nhật kiến thức bởi vì khách hàng của bạn luôn luôn đổi mới.
Tôi là một developer, tôi thấy nhiều người rất thích đọc blog. Bản thân tôi lại là người thích viết lách thế nên tôi bắt đầu với nền tảng viết bài Blogger. Trải qua một thời gian sau đó, tôi nhận thấy Blogger quá nặng nề và phức tạp, khó có thể tuỳ biến mọi thứ theo cách mình muốn. Vì thế tôi quyết định tự code cho mình một trang blog để giải quyết hết những vấn đề trên. Nhưng mọi thứ không hề dễ dàng chút nào, tôi mất rất nhiều thời gian để phân tích xem tôi muốn gì và người dùng muốn gì, mất rất nhiều thời gian để phát triển và thời gian để thu thập dữ liệu, cũng như phân tích chúng. Bù lại tôi đã học hỏi được nhiều điều khi tự làm blog.
Một developer có tư duy sản phẩm sẽ suy nghĩ về tính năng và sản phẩm theo hướng có thể khác với developer thuần. Họ quan tâm đến người dùng hơn, tò mò về hành vi cũng như suy nghĩ của người dùng. Quan trọng hoá cách làm sao để người dùng hài lòng khi sử dụng sản phẩm. Cẩn trọng khi thêm một tính năng mới bởi vì họ biết một tính năng mới được thêm đồng nghĩa với độ phức tạp của sản phẩm cũng tăng lên theo. Với họ thái độ của người dùng sản phẩm là quan trọng hơn kĩ thuật để tạo ra sản phẩm.
Một tính năng gửi email, người dùng chỉ quan việc tâm họ gửi được email và bên kia nhận được một cách nhanh chóng chứ không cần biết đằng sau đó là cả một hệ thống logic phức tạp mà bạn phải làm ra rất vất vả. Nếu như hệ thống gửi email có vấn đề gì đó, bạn không thể giải thích cho họ hiểu lý do lỗi là gì, còn họ cũng chỉ quan tâm khi nào email được gửi đi bình thường. Hay nếu như một tính năng quá phức tạp, quá nhiều bước để hoàn thành thử hỏi xem có mấy ai kiên nhẫn để thao tác hết trước khi họ thoát hẳn ứng dụng của bạn? Đối với tôi một tính năng hay là không buộc người dùng phải suy nghĩ quá nhiều để quyết định bấm vào nó.
Có rất nhiều lý do để bạn cần quan tâm đến tư duy sản phẩm cũng như làm sản phẩm. Dưới đây là một số quan điểm của tôi về lợi ích của việc này:
Tiếp cận sản phẩm theo một cách mới. Trong vai một người dùng, bạn thấu hiểu được họ. Kĩ thuật lúc này không còn quá quan trọng nữa. Đó là một hướng tiếp cận khác lạ so với những người developer thuần code, khi họ luôn luôn cố gắng tối ưu những dòng code và kĩ thuật mà đôi khi quên mất trải nghiệm không tốt cho người dùng. Suy cho cùng các sản phẩm bạn làm ra là để phục vụ người dùng, trừ khi người dùng chính là bạn.
Quan tâm đến doanh nghiệp, về hành vi người dùng và dữ liệu đó. Lúc này bạn cần quan tâm đến mô hình và tình hình kinh doanh doanh nghiệp của bạn để biết đến tập khách hàng mà doanh nghiệp đang hướng đến. Đó là tiền đề cho tính năng và sản phẩm mà bạn chuẩn bị phát triển. Nhóm người dùng khác nhau sẽ có những hành vi khác nhau và dữ liệu thu thập được sẽ nói lên chúng khác nhau như thế nào. Hơn nữa điều đó sẽ giúp bạn thấu hiểu doanh nghiệp hơn để đưa ra quyết định cống hiến hay đến lúc phải tìm một môi trường mới.
Luôn là tại sao? Tại sao phải thêm tính năng này, tại sao phải bỏ tính năng kia… nhiều câu hỏi tại sao và bắt buộc bạn phải tìm ra câu trả lời. Để làm được điều đó, bạn cần dựa vào rất nhiều thứ một trong số đó là dữ liệu thu thập được. Hay là feedback của người dùng khi họ sử dụng những tính năng mới.
Mở rộng domain, nghiệp vụ. Bạn nhận ra Developer không chỉ còn quan tâm đến code mà còn nhiều thứ khác nữa để tạo nên sự thành công cho bạn cũng như cho sản phẩm mà bạn đang phát triển. Điều này mở ra những hướng đi mới cho bạn trong sự nghiệp phát triển của mình. Biết đâu bạn sẽ không còn thích ngồi code nữa mà lại làm một công việc khác thì sao.
Kỹ thuật không còn là trên hết, cân bằng kĩ thuật với trải nghiệm người dùng. Thông thường khi đón nhận một vấn đề thì chúng ta thường suy nghĩ luôn giải pháp mà quên mất việc đánh giá vấn đề đó. Liệu trải nghiệm người dùng có gặp vấn đề gì khi giải quyết vấn đề đó thiên về giải quyết kĩ thuật hơn không? Có gây khó khăn hay mang lại trải nghiệm tồi cho họ chỉ vì muốn áp dụng kĩ thuật tiên tiến nhất? Một sản phẩm khó sử dụng chắc chắn không phải là một sản phẩm xuất sắc, lúc đó buộc bạn phải cân bằng giữa kĩ thuật và trải nghiệm người dùng.
Có những suy nghĩ về sản phẩm như một người dùng. Trong vai người dùng sản phẩm bạn biết cách để tạo ra những tính năng làm sao “đáng giá” nhất cho người dùng. Để đạt được điều đó phải trải qua rất nhiều thời gian học hỏi, sử dụng những sản phẩm khác. Hình thành một thói quen phân tích, đánh giá khi sử dụng một sản phẩm mới. Đó là kho dữ liệu rất có ích cho bạn sau này trên con đường sự nghiệp.
Phát triển bản thân. Tạo ra một sản phẩm tốt không phải trong ngày một ngày hai, cũng không phải chỉ cần biết mỗi code. Đó là cả một quá trình nỗ lực học hỏi không ngừng nghỉ và buộc bạn phải luôn luôn đổi mới bản thân. Nhiều kiến thức phải học thêm đồng nghĩa với việc bạn biết là hoá ra bấy lâu nay mình không biết gì cả.
Trên đây là những quan điểm của tôi về việc developer có thể phát triển hơn nữa thông qua tư duy sản phẩm. Tôi là một developer với hy vọng sau này có thể làm ra một cái gì đó có thể giúp ích cho cuộc sống này, nhưng có lẽ trước mắt tôi chỉ có thể chia sẻ kinh nghiệm, dù đúng dù sai vẫn mong nhận được phản hồi của tất cả mọi người.
Phỏng vấn Manual Tester cần chuẩn bị những kiến thức gì? Bài viết này sẽ cung cấp một số kiến thức tổng quan giúp bạn chuẩn bị tốt hơn trước khi bước vào buổi phỏng vấn Manual Tester.
Manual Tester nói riêng và tester nói chung là những vị trí không thể thiếu trong team development. Bản thân họ là người chịu trách nhiệm cũng như góp phần đóng góp cho sự thành công của product.
Không phí phạm thời gian nữa, giải trí chút xíu và giờ là bắt đầu bộ câu hỏi phỏng vấn ngay là luôn.
1. Sự khác biệt giữa quality assurance, quality control và software testing
Câu hỏi đầu tiên phỏng vấn Manual Tester là câu hỏi cơ bản. Đầu tiên là Quality Assurance (đảm bảo chất lượng).
QA là vị trí đề cập đến công việc theo dõi và lập kế hoạch để đảm bảo hệ thống kiểm tra kiểm soát chất lượng được tuân theo để tạo ra một sản phẩm chất lượng. QA theo dõi các test report và sửa đổi quy trình để đáp ứng việc giữ cho hệ thống hoặc sản phẩm ở trạng thái tốt.
Kiểm soát chất lượng (QC) có liên quan đến chất lượng của sản phẩm. QC không chỉ tìm ra các lỗi mà còn đề xuất các cải tiến cho sản phẩm nếu có. Có thể hiểu rằng các quy trình được đề ra bởi QA sẽ được đề xuất bởi QA được thực hiện bởi QC. QC có trách nhiệm hoàn thành những chiến lược và phương án của QA đề ra.
Kiểm thử phần mềm là quá trình đảm bảo rằng sản phẩm do nhà phát triển phát triển đáp ứng yêu cầu của người dùng. Mục đích của việc thực hiện kiểm thử là tìm lỗi và đảm bảo những lỗi đó đã được sửa. Nhờ đó giúp duy trì chất lượng sản phẩm tốt cho đến khi tới tay khách hàng.
Một số câu hỏi:
Bạn hãy cho biết danh sách mức độ nghiêm trọng của bug?
Sự khác biệt giữa bug, defect và error?
Khởi động với câu hỏi dễ dàng và giờ là lúc thử sức với câu hỏi số 2
Câu hỏi thứ hai phỏng vấn Manual Tester là câu hỏi khá hay khi nói về automation. Cho dù bạn đang apply vị trí manuel test. Mấy ông phỏng vấn chắc chắn cũng sẽ hỏi về automation.
Rõ ràng mà nói thì mọi người ai cũng đều thích tự động, automation test nằm trong số đó. Chỉ cần viết bộ testcase, sau đó cho thực thi. Vậy là toàn bộ hệ thống xem như đã được test kỹ càng.
Đứng ở góc độ là một Manuel Tester, bạn có cái nhìn gì về automations. Tất nhiên quan điểm thuộc về cá nhân mỗi người, nhưng tuyệt đối tránh đánh giá thấp automation test
Những automation test phổ biến hiện nay, nếu có kinh nghiệm hoặc ít nhất là có định hướng học. Bạn có thể nêu ra trong buổi phỏng vấn.
Ngoài ra cũng có thể nói thêm về các benefit của automation test. Tất nhiên automation cũng có những điểm yếu, ví dụ như thời gian viết code sẽ nhiều hơn. Không thể nhanh chóng như Manual Test.
Một số câu hỏi có thể chuẩn bị thêm:
STLC (Software testing life cycle là gì?)
Những automation test framework nào bạn đã sử dụng? Bạn đánh giá cao framework nào và tại sao?
3. Những yếu tố nào bạn thấy là quan trọng khi viết bug report?
Câu hỏi thứ 3 phỏng vấn Manual Tester liên quan tới công việc thường ngày. Viết bug report. Tuy là công việc mà hầu như tester nào cũng làm, nhưng không phải ai cũng biết những yếu tố được cho là quan trọng.
Danh sách các thông tin quan trọng cần có trong bug report
Mô tả lỗi: Mô tả ngắn gọn về lỗi gặp phải (cái này có thể viết chung chung)
Các bước tái hiện: Bao gồm các bước kiểm tra chi tiết để mô phỏng hoặc tái hiện lại bug
Dữ liệu test
Môi trường test và các thông tin liên quan
Mức độ nghiêm trọng của bug -> cái này để cân nhắc đem vào priority
Thời gian và hoàn cảnh nào dẫn tới bug này. Phần này càng nêu cụ thể càng tốt
QA nào đã post bug này
Tiêu chí viết bug report là sao cho khi development team nhận được bug report thì không cần phải hỏi lại Tester. Có thể fix dựa trên expect tư bug report đã có.
Với step produce, development sẽ có đủ thông tin và tự tái hiện lại được bug. Ngoài ra bạn cũng có thể trình bày thêm về kinh nghiệm cá nhân của riêng mình trong trường hợp vẫn cần giải thích cho developer. Bạn sẽ giải thích như thế nào?
Trường hợp mô tả chưa đúng, bạn sẽ khắc phục và giải thích lại như thế nào về bug này. Đồng thời cũng cần ôn lại cách thức verify khi bug đã được fix xong.
Một số câu hỏi có thể chuẩn bị thêm:
Functional testing có bao nhiêu loại?
Nếu bug lặp đi lặp lại trong quá trình test, bạn sẽ làm thế nào?
4. Sự khác biệt giữa performance testing và monkey testing
Câu hỏi thứ 4 phỏng vấn Manual Tester liên quan tới phân biệt hai loại kiểm thử. Đầu tiên là performance (hiệu năng).
Performance Testing checks the speed, scalability, maybe even the stability characteristics of a system. Performance is identified with achieving response time, throughput, and resource-utilization levels that meet the performance objectives for a project or a product. Performance testing là kiểm tra tốc độ, khả năng mở rộng, cả sự ổng định của cả hệ thống. Performance ở đây có thể được hiểu là thời gian phản hồi, kết quả và yêu cầu ở các bậc cho dự án hoặc sản phẩm
Đối với performance testing, kỹ năng đòi hỏi ở Manual Tester cao hơn. Kĩ năng và mức độ hiểu biết cách thức test performance cũng ở mức cao. Ví dụ như test gửi nhiều request, bản thân tester phải biết sử dụng một số công cụ như Jmeter.
Đối với Monkey testing, đúng như tên gọi, phương thức test này nhập random các ký tự vào field (nhấn mạnh là không có mục đích cụ thể).
Việc test này tương tự như hành động của khỉ, ấn lung tung để tìm crash của application. Thông thường các nhà tuyển dụng sẽ hỏi anh em câu này vì cho vị trí Manual Tester.
Một số câu hỏi có thể chuẩn bị thêm:
Sự khác biệt giữa test driver và test stub là gì?
Unit testing và integration testing khác nhau như thế nào?
5. Manual Tester có cần hiểu về business không?
Câu hỏi cuối cùng phỏng vấn Manual Tester liên quan tới kinh nghiệm làm việc. Tất nhiên công việc của Manual Tester không giống như Monkey Testing.
Nếu chỉ vào application hoặc web bấm loạn xạ lên thì đó không còn là Manual Tester đúng nghĩa. Manual ở đây bao gồm việc hiểu business, hiểu về yêu cầu của khách hàng. Chỉ khi hiểu rõ về business, các bước test được thực hiện ở Manual Tester mới có giá trị.
Ví dụ ở màn hình đăng ký, bản thân tester cần hiểu đăng ký sẽ như thế nào. Sau khi đăng ký các hạng mục nào dưới DB sẽ thay đổi. Thời gian có đúng hay không?
Việc bấm lung tung chỉ để hiện lỗi là việc làm không thực hiện theo test case. Chỉ gây thất thoát và lãng phí thời gian. Hiệu quả của việc làm này cũng không hề cao.
Chính vì vậy việc Manual Tester hiểu về business, hiểu về ứng dụng mà mình đang test là điều vô cùng quan trọng.
Để đạt được yếu tố này, bản thân Manual Tester cần làm việc cùng với BA và PO, tham các buổi meeting như Spring Planning. Đồng thời cần nói chuyện và hiểu các API document đã publish từ phía developer.
Khác với các hoạt động thường ngày để đảm bảo công việc vận hành tại Techcombank, “dự án” là một tập hợp các hoạt động được thực hiện trong một khoảng thời gian có hạn, với nguồn lực được giới hạn để đạt được mục tiêu cụ thể và rõ ràng mà tổ chức hướng đến. Nói cách khác, dự án là công cụ để thúc đẩy tổ chức tiến lên phía trước, tạo ra sự khác biệt giúp đạt được các mục tiêu chiến lược trong tương lai.
Tại Techcombank, nơi luôn luôn có hàng trăm dự án lớn nhỏ được thực hiện, quản lý dự án trở thành một công việc vô cùng quan trọng. Nằm trong Khối Công Nghệ, bộ phận Portfolio Capability Management (PCM) là nơi tập trung các Project Managers (PM) – những người áp dụng kiến thức, công cụ và kỹ năng để đảm bảo một dự án công nghệ tại Techcombank hoàn thành đúng thời gian, nằm trong phạm vi ngân sách, đảm bảo chất lượng, đạt được mục tiêu và các mục đích đề ra.
Trao đổi cùng TopDev ngày hôm nay là anh Phạm Tân Anh Khoa – Director, Project Management thuộc bộ phận PCM. Anh hiện đang quản lý hai danh mục dự án công nghệ lớn của Techcombank: các dự án thuộc Công nghệ Ngân hàng Bán Lẻ (Retail Banking Technology) và Công nghệ Nền Tảng (Shared Platform Technology).
Anh Khoa với nền tảng là Khoa học Máy Tính, đã có hơn 12 năm làm việc tại Singapore trải qua các vị trí từ kỹ sư đến quản lý dự án tại các tập đoàn công nghệ đa quốc gia. Anh về Techcombank từ cuối năm 2019 để bắt đầu đảm nhiệm vị trí Quản lý dự án, Quản lý cao cấp và cho đến hiện tại là Giám Đốc quản lý dự án trong bộ phận PCM thuộc khối Công Nghệ.
Nếu ví Project Manager như một vị nhạc trưởng, anh có thể bật mí một số bí quyết trong công việc để có thể “trăm trận trăm thắng”
Trong mỗi lần đi nghe nhạc giao hưởng, mình đều có suy nghĩ người nhạc trưởng luôn là người thầm lặng nhất, khi bản thân người đó không chơi một nhạc cụ nào trong dàn nhạc. Vậy nhưng, một bản nhạc giao hưởng có thể dễ dàng biến thành “tiếng ồn” nếu như không có sự điều phối của vị nhạc trưởng này. Và điều đó làm mình có liên tưởng: đây đúng là một người quản lý dự án đang làm việc!
Vậy, có một số bài học mà mình rút ra được từ đây:
Thiết lập thành viên dự án
Khi bắt đầu một dự án, chúng ta luôn muốn có thể “chọn mặt gửi vàng” thành viên và đưa những người giỏi nhất vào nhóm của mình. Nhưng liệu việc nhồi nhét những “siêu sao” vào dự án của có thực sự khiến cuộc sống của một PM dễ dàng hơn không? Có lẽ là không (và khả năng cao bạn sẽ thành kẻ thù số 1 trong danh sách của các PM khác )
Vậy liệu một dàn nhạc được xây dựng bởi những nghệ sĩ độc tấu siêu sao có bao giờ hoạt động lâu dài không? Có lẽ là không, họ sẽ luôn cố gắng đòi người ta lắng nghe những lời giải thích của họ. Đối với dự án cũng vậy: quá nhiều siêu sao sẽ tạo ra bè phái, xích mích và cuối cùng là một mớ hỗn độn khó quản lý cho người quản lý dự án.
Vậy một người quản lý dự án cần thực sự làm gì? Chúng ta cần đảm bảo các thành viên có thái độ làm việc nhóm tốt và các năng lực cơ bản, có thể không cần bề dày kinh nghiệm, một số trưởng nhóm dày dặn và bắt đầu từ đây.
Người nhạc trưởng là người đảm bảo tổng thể dàn nhạc được phối hợp nhịp nhàng, với mỗi thành viên đều hiểu rõ mức độ ưu tiên công việc, nhịp độ công việc cho từng sản phẩm được giao.
Người nhạc trưởng có thể không biết chơi tất cả các nhạc cụ tạo nên dàn nhạc của mình (và không bao giờ chúng ta thấy nhạc trưởng cầm cây violin để chỉ cho các thành viên của mình cách chơi). Một PM có thể cũng không phải là một chuyên gia trong tất cả các lĩnh vực của các thành viên dự án, và cũng không cần thiết phải như vậy.
PM, giống như nhạc trưởng, là người lãnh đạo phải hiểu công việc mà mỗi cá nhân hoặc nhóm cần phải thực hiện, điều phối các kết quả đầu ra và hợp nhất vào một dự án tổng thể (một bản nhạc giao hưởng).
Các thành viên trong dự án cần được trao quyền thiết lập kế hoạch và chịu trách nhiệm thực hiện nhiệm vụ của họ từ đầu đến cuối. Người PM không có nhiều thời gian để tập trung nhiều vào các chi tiết kỹ thuật khi triển khai, đặc biệt trong các dự án quy mô lớn. Rất nhiều người quản lý dự án đã từng là một kỹ sư giỏi và dễ bị đi vào con đường “chỉ cho team cách thực hiện”. Các tốt nhất, một PM cần học cách ủy thác, tin tưởng (hoặc thay thế thành viên nếu cảm thấy không đủ tin tưởng), và đặt câu hỏi “Tôi có thể giúp gì?”
Một trong những thách thức lớn nhất ở vị trí này là yêu cầu về Kỹ năng quản lý giao tiếp (Communication Management) và Quản lý stakeholder (Stakeholder Management)
Đặc biệt trong môi trường lớn như Techcombank, một dự án sẽ có rất nhiều stakeholders quan tâm và yêu cầu người PM cập nhật bằng cách hình thức giao tiếp khác nhau. Các stakeholders có thể được chia theo các nhóm với mức độ ảnh hưởng đến dự án khác nhau, cũng như mức độ quan tâm đến dự án khác nhau. Dựa trên hai chỉ số này, PM có thể đưa ra chiến lược phù hợp để đảm bảo các thông tin dự án được thông suốt. Một “từ khóa” để thành công trong các dự án ở Techcombank đó là “Alignments”.
Techcombank có một môi trường làm việc vô cùng quốc tế hóa cùng với một bộ phận lớn Quản lý cao cấp là các chuyên gia nước ngoài (Expats), các anh/chị Việt Kiều và các chuyên gia địa phương. Mỗi đối tượng đều có một phông văn hóa riêng, đòi hỏi phong cách làm việc phù hợp. Vậy bài toán là làm sao để mọi người có thể cùng align với những yêu cầu/update từ dự án. Một PM giỏi là người có các cách giao tiếp phù hợp để đảm bảo việc trao đổi thông suốt và kịp thời.
Ngoài ra, một thách thức tiếp theo có lẽ không chỉ riêng ở Techcombank, đó là Kỹ năng quản lý phạm vi công việc (Scope Management). Do tính chất thị trường thay đổi rất nhanh, có rất nhiều yêu cầu nghiệp vụ có thể được thay đổi hoặc thêm mới trong quá trình triển khai dự án. Điều này có thể dẫn đến dự án thực hiện vượt quá phạm vi (scope creeps), từ đó trễ tiến độ và vượt ngân sách ban đầu. Để quản lý tốt phạm vi dự án, một PM cần nắm rõ các công việc ngắn hạn và dài hạn của dự án, cũng như luôn luôn làm việc cùng nghiệp vụ để đưa ra các thứ tự ưu tiên cho các yêu cầu của mình. Trước khi một yêu cầu thay đổi được thực hiện, PM cần đảm bảo sự đồng thuận của nghiệp vụ về các “trade-offs” trong thứ tự ưu tiên hoặc nguồn lực/budget.
Hiện tại Quy mô dự án công nghệ tại Techcombank như thế nào, và cách phân chia dự án ra sao?
Hiện tại, quy mô các dự án công nghệ tại Techcombank đang được chia ra các mảng lớn bao gồm Retail Banking Technology là toàn bộ các dự án cũng như công việc trong khối Ngân hàng bán lẻ. Corporate Banking Technology là các dự án và công việc trong các khối Ngân hàng bán buôn. Shared Platform Technology là tất cả các hệ thống nền tảng, dữ liệu, vận hành trong nội bộ doanh nghiệp. Ngoài ra còn có các dự án nằm trong An Ninh thông tin (IT Security) và Vận hành công nghệ (IT Operations)
Toàn bộ có tổng cộng hơn 100 dự án nằm trong các danh mục kể trên, với quy mô và thời gian triển khai khác nhau.
Anh cho thể chia sẻ quy trình lên kế hoạch và phát triển một tính năng/ dịch vụ mới cho hàng triệu user được triển khai như thế nào?
Với một tính năng hay dịch vụ mới nằm trong một nền tảng có sẵn (ví dụ, Mobile Banking), yêu cầu nghiệp vụ có thể xuất phát từ bất kỳ thời điểm nào. Tất cả các yêu cầu nghiệp vụ này sẽ được đưa vào backlog của nền tảng, được làm rõ về yêu cầu chi tiết (refinement) và đưa ra ước tính (effort estimation). Sau khi yêu cầu được đưa vào backlog của một sprint, developer team sẽ tiến hành thực hiện tuần tự các công việc dựa trên vòng đời phát triển phần mềm (Software Development Life Cycle – SDLC).
Với một yêu cầu mang tính thay đổi lớn hoặc đòi hỏi xây dựng các nền tảng mới, các công việc này sẽ được nhóm vào để hình thành một dự án mới. Quy trình quản lý dự án tại Techcombank bắt đầu từ giai đoạn lên ý tưởng và lên kế hoạch năm:
Lên kế hoạch năm (Annual Planning): Từ phía nghiệp vụ sẽ có những ý tưởng về mặt kinh doanh, những nhu cầu hay đề bài. Các yêu cầu đó sẽ được đưa vào tổng hợp các dự án và đưa vào danh mục kế hoạch năm.
Business Case: Tổ dự án trình bày kế hoạch phạm vi, thời gian, nguồn lực và các lợi ích mang lại cho ngân hàng. Các bạn tưởng tượng nó sẽ giống như shark tank: phải làm 1 business case, trình bày với hội đồng để được phê duyệt và để có ngân sách bắt đầu triển khai dự án.
Triển khai thực hiện & giám sát dự án: Sau khi được chính thức phê duyệt & cấp ngân sách từ hội đồng, dự án sẽ được bắt đầu xây dựng (implementation), sẽ được giám sát (monitoring and controlling) cho đến lúc triển khai (commercialize) ra thị trường và vẫn sẽ tiếp tục giám sát những lợi ích đạt được.
Dưới góc độ của “Technical guy”, để trở thành 1 PM “xịn” chúng ta cần thay đổi điều gì?
PM cần trau dồi kỹ năng Quản lý dự án thông qua các chứng chỉ quốc tế, ví dụ như PMP hay Prince2. Các chứng chỉ quốc tế sẽ giúp PM có thể hệ thống hóa được họ sẽ cần tiếp cận vấn đề như thế nào. Rất nhiều các câu hỏi và vấn đề gặp phải trong dự án đều có thể tìm thấy câu trả lời trong các tài liệu chuẩn như PMBOK. Tất nhiên, việc áp dụng lý thuyết vào thực hành sẽ phụ thuộc vào thực tế từng dự án, nhưng việc tuân theo các best-practice sẽ cung cấp cho PM một “bộ khung” vững chắc để dự án có thể được thực thi một cách ít rủi ro nhất.
Ngoài ra, muốn trở thành một PM giỏi trong mảng Công nghệ chắc chắn cần đi đầu và nắm bắt các công nghệ mới. Điều này có thể được thực hiện bằng cách tham gia các nền tảng e-learning như PluralSight, Linkedin Learning để liên tục học hỏi, cập nhật các kiến thức mới nhất. Trao đổi chi tiết để hiểu các công việc và khía cạnh kỹ thuật của dự án cũng là một cách để PM luôn có cái nhìn bao quát về công nghệ, nhưng vẫn có đủ chiều sâu để đảm bảo chất lượng dự án.
Cuối cùng, một “Project Manager” giỏi cũng là một “People Manager” tốt. Yếu tố quan trọng nhất và định đoạt thành công của dự án chính là Con người (People). Để thành công, một PM cần chú ý rèn luyện các kỹ năng mềm liên quan đến làm việc nhóm, xây dựng niềm tin, các kỹ năng giao tiếp, lãnh đạo và quản lý hiệu quả.
Vậy để trở thành một PM kỹ thuật “xịn”, chúng ta cần chú ý đến các kỹ năng cơ bản của Quản lý dự án, sau đó cho mình một phông kiến thức công nghệ vững chắc. Và điều quan trọng cần đặc biệt chú ý, đó là trở thành một nhà quản lý con người và đội nhóm hiệu quả.
Anh nhận xét như thế nào về “dàn nhạc” kỹ sư của mình?
Mình khá tự hào về “dàn nhạc” của mình hiện nay tại Techcombank. Mình có thể thấy những đầu tư rất lớn và bài bản của Ngân hàng vào yếu tố con người – 1 trong 3 trụ cột chính trong chiến lược phát triển 5 năm 2021-2025. Mỗi cá nhân trong khối Công Nghệ đều được Ngân hàng khuyến khích và tài trợ để có thể học tập và thi các chứng chỉ quốc tế như AWS Certificates, PMI-PMP, v.v. Điều này đã củng cố năng lực cơ bản của mỗi thành viên công nghệ, và mình hoàn toàn tự tin mọi người luôn được cập nhật các kiến thức mới nhất, cạnh tranh một cách sòng phẳng ở sân chơi khu vực.
Ngoài ra, Techcombank cũng đẩy mạnh tuyển dụng các nhân tài là các chuyên gia trong lĩnh vực IT, Data từ nước ngoài để xây dựng, định hướng và đem về các best practice trên thế giới. Không chỉ vậy, tại Việt Nam, Techcombank cũng mở các chương trình Fast Track cho các bạn trẻ có nhiều tiềm năng được lựa chọn để tham gia vào các dự án lớn của ngân hàng và ươm mầm các tài năng trẻ này.
Tất nhiên sẽ không bao giờ có một đội nhóm “hoàn hảo”, nhưng mình tự tin với chất lượng và định hướng về con người của Techcombank. Đây chắc chắn là một yếu tố bền vững giúp Techcombank tiếp tục phát triển trong thời gian tới.
Nếu muốn trở thành một Project Manager/ Business Analyst/ Product Management
Không riêng gì Techcombank, dù làm việc ở bất kỳ nơi đâu, một PM giỏi và hiệu quả cần trang bị cho mình bộ 3 nhóm kỹ năng như sau:
Kỹ năng cứng: một nhà quản lý dự án thành công nên nắm bắt kiến thức tốt về tất cả các lĩnh vực quản lý dự án (phạm vi, lịch trình, chi phí, tài nguyên, v.v.). Ở Techcombank, chúng tôi đặc biệt tập trung vào quản lý rủi ro, trong đó một PM giỏi phải luôn tìm kiếm mọi rủi ro/vấn đề tiềm ẩn có thể khiến dự án đi chệch hướng. Chúng tôi đánh giá cao PM có thể lên tiếng và nêu ra những hỗ trợ cần thiết càng sớm càng tốt.
Kỹ năng mềm: một nhà quản lý dự án thành công tại Techcombank phải có kỹ năng giao tiếp tốt (cả tiếng Việt và tiếng Anh, cả đọc và viết). Các kỹ năng giao tiếp có thể không giới hạn trong bối cảnh công việc mà còn để thiết lập kết nối cá nhân và niềm tin với các thành viên trong nhóm/ các bên liên quan. Kỹ năng Quản lý các bên liên quan cũng rất quan trọng để thành công trong một mạng lưới phức tạp. Một PM giỏi ở Techcombank cần xác định rõ cách đúng tiếp cận cho đúng đối tượng.
Kiến thức về lĩnh vực: kiến thức về lĩnh vực sẽ mang lại cho PM một lợi thế cạnh tranh, để trở thành PM từ “giỏi” đến “giỏi hơn”. Có kiến thức về lĩnh vực, một PM có thể đặt những câu hỏi phù hợp, đi sâu vào việc lập kế hoạch và thấy trước những rủi ro/vấn đề có thể xảy ra.
Thuộc dự án “Inside GemTechnology“ do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Tôi năm nay đã 26 tuổi, maintain cũng dăm ba dự án rồi mà đôi lúc tôi cũng hay gặp những trường hợp mà một số bạn trong team hay làm thế này:
functionconvertBirthdayToAges (person) {
const year = newDate().getFullYear(); // 2021return person.map(p => p.age = year - p.year);
}
...
const persons = [{name: 'Nguyễn Văn A', year: 2000}];
convertBirthdayToAges(persons);
console.log(persons); // [{name: 'Nguyễn Văn A', year: 2000, age: 21}]
Thoạt nhìn cách viết hàm như trên có vẻ bình thường nhưng bạn hãy để ý sau khi persons đi qua hàm convertBirthdayToAges thì nó đã bị gắn thêm một attribute age.
Hay một ví dụ khác kiểu như là:
let year = 2020;
functionafterManyYear(num) {
return year + num;
}
afterManyYear(5) // 2025;
....
year = 2025;
afterManyYear(5) // 2030;
Ở ví dụ trên, ban đầu khi gọi hàm afterManyYear(5) kết quả là 2025 nhưng sau đó, do year bị thay đổi thành 2025 thì afterManyYear(5) lúc này lại trả về 2030.
Điều này có vẻ cũng bình thường nhưng hãy tưởng tượng trong giai đoạn bảo trì khi bạn không biết year bị thay đổi ở đâu thì quả là tai hại. Bạn cũng có thể nói thế thì sao không khai báo const với year: const year = 2020;? Thì tôi nghĩ khi đã khai báo với let thì trong đầu họ đã nghĩ sẽ sẵn sàng thay đổi year bất kì lúc nào rồi.
Nếu bạn là người thường xuyên làm những điều trên & thấy sự bất tiện của nó thì cũng là lúc các bạn nên biết về khái niệm Pure Function.
Side-effects là những “hiệu ứng” đi kèm trong hàm như:
Thay đổi giá trị của đầu vào.
console.log
HTTP calls (fetch/AJAX).
Thay đổi một file (fs).
Query DOM.
…
Nhìn chung thì ngoài những điều liệt kê ở trên thì side-effects còn bao gồm cả những công việc có trong hàm mà không liên quan đến kết quả tính toán cuối cùng.
Ở ví dụ 1 phần mở đầu ta đã thấy convertBirthdayToAges đã làm biến đổi giá trị của đầu vào là persons. Nếu chẳng may persons bị xoá mất một attribute nào đó thì chẳng phải là một điều rắc rối hay sao!
Để giải quyết vấn đề trên, thay vì chỉnh sửa trực tiếp persons, chúng ta hãy trả về một đối tượng mới:
functionconvertBirthdayToAges (person) {
const year = newDate().getFullYear();
return [...person.map(p => p.age = year - p.year)];
}
const persons = [{name: 'Nguyễn Văn A', year: 2000}];
const newPersons = convertBirthdayToAges(persons);
console.log(persons); // [{name: 'Nguyễn Văn A', year: 2000}];
Ví dụ trên tôi đã sử dụng toán tử spread syntax (…) để tạo ra một đối tượng mảng mới. Lưu ý rằng nó chỉ có thể sao chép “nông” (shallow copy) một đối tượng, để có thể sao chép “sâu” (deep copy) tôi khuyến nghị nên dùng package clone có sẵn trên npm.
Một ứng dụng không thể nào là không có side-effect
Đúng vậy, ứng dụng của bạn không thể nào hoạt động mà không bao gồm các “hiệu ứng” như đã liệt kê ở bên trên trừ chúng quá mức đơn giản. Chúng không thể hoạt động nếu như không đọc – ghi vào database hay select một phần tử trong DOM. Nhưng quan trọng là nên giảm thiểu tối đa hoặc cấu trúc những đoạn mã side-effects một cách độc lập nhất có thể.
Ví dụ như một hàm cập nhật dữ liệu:
// Ví dụ này giả sử Person là một sequelize model// Hàm update này mới là hàm trực tiếp có side-effectfunctionupdate(payload) {
returnPerson.update(payload);
}
functionupdatePerson(body) {
const name = body.name.trim();
const year = +body.year;
returnupdate({ name, year });
}
Tổng kết
Pure function không phải là khái niệm mới nhưng những lợi ích mà pure function mang lại trong quá trình phát triển & bảo trì sản phẩm là cực kì tốt dựa trên kinh nghiệm làm việc của tôi.
Qua những ví dụ trên tôi mong rằng các bạn sẽ nhận ra được những lợi ích khi áp dụng pure function vào các dự án trong hiện tại & tương lai. Chỉ cần thay đổi cách diễn đạt một chút sẽ mang lại nhiều lợi ích trong việc bảo trì code sau này.
System Admin hay quản trị viên hệ thống là những người chịu trách nhiệm thiết lập và bảo trì hệ thống máy tính, đặc biệt là máy chủ trong mạng của công ty; đảm bảo hệ thống hoạt động, vận hành một cách trơn tru và an toàn. Với vai trò quan trọng đó thì các nhà tuyển dụng luôn ưu tiên những ứng viên có kinh nghiệm và kiến thức tốt, với đòi hỏi cao khi phỏng vấn. Bài viết hôm nay chúng ta cùng tìm hiểu về những câu hỏi phỏng vấn vị trí System Admin thường gặp để có thể chuẩn bị tốt nhất nhằm chinh phục được nhà tuyển dụng nhé.
Công việc và trách nhiệm của một System Admin
System Admin có vai trò quan trọng trong một tổ chức/công ty không hề thua kém bất kỳ vị trí nào khác. Nói vui thì nếu System Admin đang làm việc thì lúc đó tất cả các bộ phận khác phải dừng lại để chờ hoạt động của hệ thống được khắc phục. Cụ thể thì trách nhiệm và công việc của quản trị viên hệ thống gồm:
Bảo đảm an ninh mạng và internet
Bảo đảm hệ thống vận hành trơn tru, hiệu quả
Hỗ trợ kỹ thuật trong quá trình vận hành
Khắc phục, sửa chữa lỗi hệ thống
Nghiên cứu và đề xuất phương án phát triển các hệ thống mạng
Top 4 câu hỏi thường gặp khi phỏng vấn vị trí System Administrator và câu trả lời chi tiết
VPS là gì? Nên chọn Hosting hay VPS cho công ty/ doanh nghiệp sử dụng
VPS Virtual Private Server là máy chủ riêng ảo được phân tách và chia sẻ tài nguyên từ server vật lý, nhờ công nghệ ảo hóa, VPS hoạt động giống máy chủ độc lập nhưng với lượng tài nguyên nhỏ hơn máy chủ chính. So với hosting (Shared Hosting) thì VPS có tính năng độc lập giống như một máy chủ riêng biệt, không phải chia sẻ tài nguyên cho nhiều tài khoản khác; nhờ đó tốc độ xử lý, hiệu năng, bảo mật của VPS cao hơn so với hosting.
Để lựa chọn cho công ty/doanh nghiệp sử dụng thì sẽ phụ thuộc vào nhu cầu, mục đích cũng như kiến thức của đội quản trị hệ thống; cụ thể thì VPS sẽ phù hợp cho:
Các hệ thống website có lượng truy cập lớn, cần sự ổn định, bảo mật và tối ưu tốt.
Đòi hỏi đội quản trị server có kiến thức và kỹ thuật quản lý
Ngược lại, lựa chọn hosting trong trường hợp bạn muốn nhanh chóng vận hành website, khả năng tài chính hạn chế và nhu cầu website có lượng truy cập thấp.
High Availability (HA) hiểu một cách đơn giản là quy trình/giải pháp/công nghệ có chức năng đảm bảo cho cơ sở dữ liệu và ứng dụng có thể truy cập 24/7 trong mọi điều kiện. Để làm được điều này thì HA cần tối thiểu 2 server chạy song song, hoạt động liên tục để nếu một trong các server gặp sự cố thì các server còn lại sẽ thay thế để đảm bảo cho hệ thống có thể hoạt động bình thường, luôn trong trạng thái sẵn sàng phục vụ, đồng thời giảm thiểu tình trạng gián đoạn của hệ thống.
Lợi ích khi sử dụng HA là việc dữ liệu trong server được lưu ở các vị trí khác nhau, tất cả đều được bảo mật đảm bảo an toàn. Các bản sao VPS được lưu trữ tại nhiều cụm khác nhau, nếu 1 VPS xảy ra sự cố thì dữ liệu sẽ không bị ảnh hưởng.
Trong Linux, toàn bộ log file của server được lưu trong thư mục var/log, để kiểm tra các file log chúng ta sử dụng lệnh di chuyển đến thư mục trên; sử dụng ls -l để liệt kê danh sách files trong thư mục. Để xem file log, chúng ta sử dụng lệnh tail hoặc lệnh less.
Các loại file log chính gồm:
auth.log: log về xác thực
boot.log: log về hoạt động khởi động hệ thống
cron: log các lịch hoạt động tự động
dmesg: log bộ đệm
message: log thông tin chung hệ thống
httpd: thư mục chứa log của Apache
maillog: log hoạt động mail
secure: log bảo mật
wtmp: log đăng nhập
yum: log của Yum
VPN là gì? Ưu và nhược điểm khi triển khai VPN cho công ty
VPN là viết tắt của Virtual Private Network hay mạng riêng ảo là một công nghệ cho phép tạo ra một kết nối mạng riêng ảo giữa thiết bị của người dùng và mạng Internet, đóng vai trò như một lớp bảo vệ thông tin cá nhân và duy trì sự riêng tự trên mạng. Về cơ bản, VPN chuyển tiếp tất cả lưu lượng (network traffic) của bạn tới hệ thống – nơi có thể truy cập từ xa các tài nguyên mạng cục bộ và vượt qua khỏi việc kiểm duyệt Internet.
Ưu điểm của VPN là khả năng bảo mật, lưu lượng cá nhân của người dùng được mã hóa và truyền an toàn qua Internet giúp bạn tránh được các mối đe dọa. Đối với một tổ chức, doanh nghiệp thì việc thiết lập VPN có đầy đủ chức năng và cấu hình mạnh đòi hỏi chi phí ngân sách không nhỏ, đây cũng là nhược điểm của VPN.
Nêu một số sai lầm mà System Admin thường gặp phải
Một số lỗi mà System Admin thiếu kinh nghiệm hoặc không cẩn thận để xảy ra trong quá trình làm việc thực tế có thể gây ra hậu quả rất lớn đối với công ty/ doanh nghiệp như sau:
Chia sẻ tài khoản quản trị với các thành viên trong team System, sau đó có người quản trị nghỉ việc, mật khẩu không được đổi kịp thời
Quên gia hạn SSL khiến các hệ thống không đảm bảo an toàn, người dùng cũng mất tin tưởng khi truy cập vào website của công ty
Không theo dõi log files thường xuyên khiến không phát hiện ra sớm lỗi hệ thống có thể xảy ra và ngăn ngừa trước.
Thực thi lệnh với quyền root hoặc trao quyền root cho người dùng khác ngoài team System, điều này tạo ra lỗ hổng lớn khi một người dùng có nguy cơ can thiệp sâu vào hệ thống máy chủ.
Không chấm dứt các tài khoản ngừng hoạt động khi có nhân viên trong công ty/ doanh nghiệp nghỉ việc. Điều này không chỉ khiến nguy cơ mất an toàn thông tin mà còn làm lãng phí tài nguyên của công ty.
Một số chứng chỉ System Admin phổ biến
Một số chứng chỉ dành cho System Admin dưới đây giúp bạn ghi điểm với nhà tuyển dụng:
Red Hat Certified System Administrator/ Red Hat Certified Engineer
CompTIA Server+/ CompTIA Security+
ServiceNow Certified System Administrator
Linux Professional Institute LPIC-1 Linux Administrator
Cisco Certified Network Associate
Microsoft Certified: Azure Administrator Associate
VMware Certified Professional – Data Center Virtualization
Kết bài
Trên đây là danh sách những câu hỏi phỏng vấn thường gặp dành cho vị trí System Admin. Quản trị hệ thống là công việc đòi hỏi kinh nghiệm và kiến thức về hệ thống mạng, máy chủ, phần cứng; vì thế các bạn hãy bổ sung thêm và học hỏi trong quá trình làm việc nữa nhé. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Lần gần đây nhất tôi đi phỏng vấn tìm việc là khoảng 4-5 tháng trước. Như bao người khác, đi nhiều nơi, mỗi nơi là một trải nghiệm thú vị và nhận thấy một điều là không ai hỏi giống ai. Tôi chuẩn bị cho mình một tâm lý thoải mái và đặt ra những tiêu chí về môi trường làm việc mới, không quá quan trọng lý thuyết mà sẽ trả lời dựa trên kinh nghiệm làm việc thực tế của mình.
Một ngày nọ, có một anh CTO hỏi tôi một câu “Em tự nhận thấy mình đang ở level nào?”. Tôi không chần chừ mà trả lời luôn: “Thực ra em chưa để ý nhiều đến level của mình, mục tiêu trước mắt là không ngừng học hỏi…”. – “Em chưa xác định được level của mình thì cũng cần phải xem xét lại nhé!”
Dễ nhận thấy là người phỏng vấn đang muốn tôi lựa chọn giữa 3 mức Junior, Mid-Level và Senior. Với một người có hơn 5 năm kinh nghiệm, có thể tôi sẽ lựa chọn mình ở mức Senior, bởi vì đây là một điều có thể chấp nhận được khi thị trường tuyển dụng trong nước thường hay cho rằng người có từ 5 năm kinh nghiệm trở lên có thể coi là Senior. Nhưng tôi nghĩ, hiện tại mình vẫn chưa đạt được cấp độ này, có thể mình chỉ đang ở mức Mid-Level. Nhưng vì quan niệm và thị trường đang có mâu thuẫn về sự phân biệt các cấp độ, hay nói cách khác 3 cấp độ này còn phụ thuộc vào suy nghĩ của mỗi người, cho nên tôi phân vân và không đưa ra được câu trả lời chính xác cho mình.
Lời của anh CTO nói là đúng, việc không xác định được Level của mình thì quả là nguy cấp, nhưng do không nói ra suy nghĩ cho nên bị hiểu nhầm là không xác định được mình ở đâu. Vì thế, bài viết ngày hôm nay chúng ta hãy thử bàn luận về 3 cấp độ Junior, Mid-Level và Senior để xem thực chất phải làm thế nào thì mới có thể coi là một Senior “xịn” nhé!
Hãy thử tìm kiếm Google với từ khóa “Junior, Mid-Level và Senior developer” sẽ có rất nhiều kết quả được tìm thấy, chứng tỏ đây là một chủ đề được rất nhiều người quan tâm. Đa phần chúng ta vào đọc để xem mình đang ở đâu và cần phải làm thêm gì thì mới có thể đạt được cấp độ tiếp theo.
Trong số đó, nhiều bài liệt kê ra số năm kinh nghiệm để đánh giá được một người đang ở cấp độ nào. Ví dụ, mới ra trường sẽ là Junior, 3-5 năm sẽ là Mid-Level, từ 5 năm trở đi thì thành Senior…!? Quả thật mà nói trước kia tôi cũng từng tin sái cổ vào những con số này. Cho rằng càng làm lâu thì “bậc” của mình cũng sẽ tự tăng.
Hoặc cũng có bài viết chỉ ra rằng số năm không hoàn toàn quyết định level của một người, mà dựa vào khả năng giải quyết vấn đề của người đó. “Họ biết cách tổ chức mã, quan tâm đến khả năng bảo trì sau này, cách đặt câu hỏi và cách giải quyết…” Nghe thì hợp lý, nhưng có lẽ vẫn chưa đủ. Đối với tôi, một lập trình viên không chỉ biết mỗi code. Do đó để đạt được cấp cao nhất trong lập trình thì phải vượt qua cả việc code và làm được nhiều điều hơn nữa.
Tình cờ tôi tìm thấy một bài viết nói rất chi tiết về những thứ có thể đạt được ở cả 3 cấp độ. Hơn nữa nó còn rất đầy đủ và chi tiết cũng như đưa ra lời khuyên làm sao để tăng được level. Bạn đọc có thể xem tại Levels of Seniority.
Để tóm tắt, bài viết tập trung nhất vào cấp độ Junior, nêu ra khái niệm, biểu hiện và những điều cần làm để tiến bộ hơn. Một vài ý nổi bật như là:
Câu thần chú chính của họ là “làm cho nó hoạt động” mà không chú ý nhiều đến giải pháp. Đối với họ, một phần mềm hoạt động được và một phần mềm tốt là tương đương nhau.
Họ không biết về khía cạnh kinh doanh của công ty, tức là không quan tâm hoặc không biết mình làm việc này cho công ty để làm gì.
Đổ lỗi cho người khác (Somebody else’s problem) khi cho rằng ai đó phải chịu trách nhiệm cho vấn đề của bạn.
Họ không tham gia thảo luận nhóm.
…
Sau đó, tác giải đưa ra những lời khuyên cho Junior như sau:
Đọc nhiều mã, không chỉ mã trong các dự án mà bạn đang làm việc, mà cả mã nguồn của các thư viện, Framework, mã nguồn mở…
Tự làm các dự án cá nhân.
Ngừng đổ lỗi.
Đừng để bản thân bị giới hạn bởi chức danh mà bạn có. Làm nhiều việc và chủ động hơn.
Tránh nói “nó hoạt động trên máy của tôi”, ý chỉ hãy đi tìm hiểu nguyên nhân tại sao ứng dụng không hoạt động ở đâu đó, vì chắc chắn người khác đang gặp phải vấn đề chứ không phải là bạn. Câu nói trên chẳng khác nào phủ nhận trách nhiệm vậy.
Tiếp xúc với các nhà phát triển cấp cao hơn, xem họ làm việc, nếu có thể thì tìm một người hướng dẫn mình. Không ai thích một người biết tất cả mọi thứ, nhưng hãy kiềm chế cái tôi của mình và khiêm tốn để tiếp thu những bài học từ những người có kinh nghiệm.
…
Một Mid-level bao gồm tất cả những yếu tố của Junior, kèm theo đó là khả năng tự giải quyết vấn đề. Họ có nhiều hiểu biết hơn Junior tuy nhiên còn lúng túng trong việc áp dụng chúng. Tác giải nhấn mạnh rằng Mid-level là rất phổ biến và đôi khi họ bị nhầm với “Senior”. Tuy nhiên, họ cần được cố vấn thêm để trở thành một Sernior “chính hiệu”.
Senior là cấp độ tiếp theo sau Mid-Level developer. Họ là những người có thể tự mình hoàn thành công việc mà không cần bất kỳ sự giám sát nào và không tạo ra bất kỳ vấn đề nào trong quá trình thực hiện. Một số điều mà một Senior làm được như:
Họ thực dụng trong công việc, không bị ảnh hưởng bởi một công cụ tốt nhất.
Họ có một bức tranh toàn cảnh về lĩnh vực này, biết đâu là công cụ tốt nhất cho công việc trong hầu hết các trường hợp.
Họ biết họ đang ở trong một đội. Họ coi đó là một phần trách nhiệm của họ trong việc hướng dẫn người khác.
Họ có hiểu biết sâu sắc về lĩnh vực đang làm.
Họ nghĩ nhiều hơn là chỉ viết mã.
Họ biết cách đưa ra phản hồi mà không làm tổn thương bất cứ ai…
…
Hay nói tóm lại, ngoài việc viết mã, một Senior có thể hướng dẫn, làm cố vấn cho người khác, hiểu biết sâu sắc về doanh nghiệp, lĩnh vực kinh doanh và cả yếu tố con người.
Tổng kết
Junior, Mid-Level và Senior là ba cấp độ của một lập trình viên, cấp độ Junior là thấp nhất cho đến Senior là người có hiểu biết sâu rộng. Việc xác định được mình đang ở cấp độ nào cũng như cần làm gì để đạt được Level tiếp theo là một điều hết sức quan trọng trong con đường sự nghiệp của mỗi người.
Kể từ thời điểm Node.js được công bố chính thức, nó đã chứng minh được giá trị của mình. Cũng vì có nhiều người quan tâm nên luôn có những cuộc tranh luận về Node.js. Có người khen, có người chê. Nhưng bạn có công nhận với mình là càng nhiều người ghét thì càng nhiều người sử dụng không? Càng nhiều người đâm đầu vào học Nodejs ^_^
Có một điều rằng, Node.js đang ngày càng phổ biến, được sử dụng ở nhiều ứng dụng lớn, hoặc rất lớn.
Tuy nhiên, để ứng dụng Node.js tốt theo đúng nghĩa thì nó phụ thuộc vào tài năng của người viết ra nó. Chứ một mình Node.js dù có tốt đến đâu thì cũng không thể “gánh team” được. Yếu tố con người luôn là yếu tố tiên quyết tới chất lượng sản phẩm.
Để sản phẩm có chất lượng kém thì dưới đây là 7 sai lầm khi học nodejs mà bạn nên mắc phải!
Sai lầm thường gặp khi học Nodejs
#Tạo vòng lặp dữ liệu lớn làm treo ứng dụng
Javascript trong Node.js (cũng giống như trong trình duyệt) là ngôn ngữ đơn luồng. Hay nói cách khác, ở cùng một thời điểm, chỉ có một luồng được thực thi, một task được thực hiện. Thay vào đó, để tăng hiệu suất ứng dụng, Node.js sẽ xử lý theo kiểu bất đồng bộ.
Ví dụ, truy xuất vào cơ sở dữ liệu từ ứng dụng Node.js để lấy dữ liệu. Trong lúc chờ cơ sở dữ liệu trả về kết quả thì Node.js có thể tranh thủ làm các task khác.
// Trying to fetch an user object from the database. Node.js is free to run other parts of the code from the moment this function is invoked..db.User.get(userId,function(err, user){ // .. until the moment the user object has been retrieved here})
Tuy nhiên, không phải mã nào cũng bất đồng bộ, bản thân Javascript là ngôn ngữ đồng bộ, nên cũng giống như các ngôn ngữ khác.
Nếu một đoạn code mà cần thời gian dài để thực hiện có thể làm treo ứng dụng. Đặc biệt là các vòng lặp. Bạn có thể xem đoạn code bên dưới đây:
function sortUsersByAge(users){ users.sort(function(a, b){ return a.age< b.age?-1:1 })}
Đây là hàm dùng để sắp xếp một mảng các users. Đây là hàm thuần túy đồng bộ, tức là phải làm xong hàm này thì mới thực hiện các hàm khác. Nếu mảng users có số lượng ít thì không sao. Nhưng nếu mảng users mà có rất nhiều phần tử thì sao?
Đấy là chưa kể ứng dụng Node.js còn phải phục vụ hàng ngàn khách truy cập nữa?
Đây chính là vấn đề, có thể làm sập server như chơi.
Để khắc phục vấn đề này thì có nhiều giải pháp, tùy vào hoàn cảnh ứng dụng. Ví dụ, nếu mảng users được lấy từ cơ sở dữ liệu (CSDL) thì tốt nhất nên để CSDL tự sắp xếp trước khi trả về cho ứng dụng Node.js.
Về nguyên tắc là không nên để ứng dụng Node.js (ứng dụng trực tiếp xử lý request từ người dùng) phải thực hiện một tác vụ quá lâu.
Callback có lẽ là khái niệm mà chắc hẳn ai học Nodejs đều phải biết. Tuy nhiên, cách sử dụng như nào cho đúng thì mỗi người một cách. Trong Node.js, callback là cách để cách thành phần bất đồng bộ tương tác với nhau.
Một vấn đề phổ biến của Node.js mà các bạn developer ít kinh nghiệm hay mắc phải đó chính là gọi Callback nhiều lần.
Thông thường, một API bất đồng bộ sẽ có một tham số cuối cùng là một hàm, được sử dụng task được thực hiện bởi API hoàn thành.
module.exports.verifyPassword=function(user, password, done){ if(typeof password !== ‘string’){ done(new Error(‘password should be a string’)) return } computeHash(password, user.passwordHashOpts,function(err, hash){ if(err){ done(err) return } done(null, hash === user.passwordHash) })}
Bạn nhìn đoạn code trên có thấy điều gì lạ không?
Tại sao lại phải sử dụng từ khóa return dưới mỗi callback vậy? Lý do họ làm như vậy vì khi gọi callback không làm kết thúc hàm, chương trình vẫn tiếp tục thực hiện các lệnh bên dưới. Đó là điều không đúng logic.
Tuy nhiên, nhìn việc return không có giá trị trả về cứ thế nào ấy. Mặc dù, trong các hàm kiểu bất đồng bộ thì việc return giá trị không có nhiều ý nghĩa lắm, ngoại trừ việc dùng return để kết thúc hàm.
Thay vào đó, chúng ta có thể return chính hàm callback, nhìn code sẽ đẹp hơn nhiều.
Sử dụng Callback lồng nhau tới mức mất kiểm soát, người ta gọi là “callback hell”. Đây là một bad smell cực tệ với các ứng dụng Node.js, làm cho việc bảo trì mã nguồn trở nên vô vàn khó khăn. Mình cũng đã có hẳn một bài viết riêng về Callback hell và cách xử lý. Các bạn có thể tham khảo: 6 cách “trị” callback hell trong javascript
Ví dụ một callback lồng nhau:
function handleLogin(..., done){ db.User.get(...,function(..., user){ if(!user){ return done(null, ‘failed to log in’) } utils.verifyPassword(...,function(..., okay){ if(okay){ return done(null, ‘failed to log in’) } session.login(...,function(){ done(null, ‘logged in’) }) }) })}
Có nhiều cách để xử lý callback lồng nhau, trong bài viết ở trên, mình có giới thiệu 6 cách để xử lý callback lồng nhau.
Nhân tiện bài viết này, mình giới thiệu thêm một cách nữa. Đó là sử dụng tiện ích Async.js:
Kỹ thuật bất đồng bộ với Callback tuy không phải là kỹ thuật chỉ có trên Javascript hay Node.js. Nhưng dường như sự phổ biến đã biến nó trở thành “tiêu chuẩn”. Giống như việc nói tới lập trình hướng đối tượng là người ta nghĩ ngay tới java vậy.
Với nhiều developer quen với các ngôn ngữ chạy đồng bộ như PHP, Java… Thì có xu hướng viết code đồng bộ trong Node.js. Và họ sử dụng Callback như một công cụ để viết code đồng bộ.
Tuy nhiên, Callback trong Javascript có thể không hoạt động như ý muốn của bạn.
Tham khảo đoạn code bên dưới:
function testTimeout(){ console.log(“Begin”) setTimeout(function(){ console.log(“Done!”) }, duration *1000) console.log(“Waiting..”)
}
Như đoạn code trên thì màn hình sẽ in log theo thứ tự như sau, có vẻ không đúng thứ tự phải không?
'Begin''Waiting..''Done!'
Bất kể điều gì bạn muốn thực hiện sau callback đều phải được gọi bên trong hàm đó.
#Nhầm lẫn giữa “exports” và “module.exports”
Node.js coi mỗi một file javascript là một module nhỏ, độc lập với các file khác. Người ta gọi là tính đóng gói. Để một hàm trong file javascript có thể được sử dụng bởi file thì bạn cần phải export nó ra.
Giả sử trong package của bạn có 2 file javascript: one.js và two.js
Để two.js có thể gọi một hàm verifyPassword(...) trong one.js thì nó phải được export.
Tuy nhiên, làm thế nào để export trực tiếp hàm verifyPassword() mà không phải định nghĩa nó như một thuộc tính của one.js? Câu trả lời là sử dụng module.export
Nhìn có vẻ đơn giản vậy thôi nhưng sự khác nhau giữa exports và module.exports đang trở thành chủ đề bàn tán của rất nhiều Node.js developer.
#Throwing Errors bên trong Callbacks
Javascript cũng có Exception như bao ngôn ngữ khác như Java, C++. Bạn hoàn toàn có thể “Throw” hoặc try-catch một Exception.
Ví dụ như đoạn code dưới đây, try-catch sẽ bắt được Exception.
function slugifyUsername(username){ if(typeof username === ‘string’){ thrownew TypeError(‘expected a string username, got '+(typeof username)) } // ...}try{ var usernameSlug = slugifyUsername(username)}catch(e){ console.log(‘Oh no!’)}
Tuy nhiên, try-catch lại hoạt động không như mong đợi trong trường hợp của hàm bất đồng bộ.
Ví dụ, bạn muốn đoạn code an toàn, không bị crash khi có Exception, nên bạn thêm try-catch cho cả một đoạn code lớn. Mà trong đó có nhiều hàm bất đồng bộ. Thì try-catch sẽ không hoạt động đúng.
Như trong trường hợp này, khi callback b.User.get(...) có lỗi mà bạn lại throw lỗi thì các Exception của các hàm tiếp theo sẽ không thể catch được nữa.
#Sử dụng Console.log một cách bừa bãi
Trong Node.js, Console.log cho phép bạn in tất cả mọi thứ ra màn hình console. Không giống như Java, bạn chỉ có thể truyền vào một String. Với Console.log, bạn có thể truyền vào một Object, nó sẽ in ra dưới dạng một Object theo đúng nghĩa đen.
Chính vì Console.log tiện lợi như vậy nên nhiều bạn developer sử dụng console.log ở khắp mọi nơi. Tuy nhiên, bạn nên tránh việc đặt console.log ở tất cả mọi nơi để debug. Sau này không cần thì comment nó lại.
Thay vào đó, bạn nên sử dụng một thư viện hỗ trợ đặt log. Tùy thuộc vào hình thức bạn release sản phẩm như: release chính thức, hay debug… mà bật/tắt việc in các log một cách tự động thay vì phải đi xóa console.log thủ công.
Với sự bùng nổ của cuộc cách mạng công nghiệp 4.0 ngày nay, các nhu cầu liên quan tới lĩnh vực Công nghệ cũng ngày càng tăng lên chóng mặt. Trường đại học là nơi đào tạo ra các lập trình viên tương lai, bạn có đang phân vân khi lựa chọn các trường Đại học đào tạo ngành IT – Công nghệ thông tin tốt và phù hợp với mình?
Trong bài viết này TopDev sẽ giới thiệu đến các bạn học sinh, sinh viên các trường Đại học công nghệ thông tin với chất lượng đào tạo tốt và uy tín ở TPHCM, Hà Nội và một số tỉnh thành khác để bạn có thêm nhiều lựa chọn khi quyết định theo đuổi con đường trở thành lập trình viên của mình.
Bài viết chỉ mang tính chất tham khảo và liệt kê, thứ tự trong bài không mang tính chất xếp hạng các trường nhé. Còn bây giờ chúng ta bắt đầu thôi!
Top 10 trường đào tạo ngành công nghệ thông tin tốt nhất hiện nay
Cùng TopDev tìm câu trả lời cho câu hỏi: Công nghệ thông tin học trường nào ngay bây giờ.
Đại học Bách Khoa Hà Nội
Một trong các trường đại học công nghệ thông tin top đầu Việt Nam – Đại học Bách Khoa Hà Nội
Được đánh giá là 1 trong top trường đào tạo công nghệ thông tin Hà Nội và là đại học kỹ thuật đa ngành trọng điểm của Việt Nam, là thành viên của Hiệp hội các trường đại học kỹ thuật hàng đầu của Châu Á – Thái Bình Dương AOTULE (Asian-Oceania Top University League on Engineering) cũng đủ khẳng định chất lượng giảng dạy của Đại học Bách Khoa Hà Nội.
Khoa Công nghệ Thông tin (tiền thân của Viện Công nghệ Thông tin và Truyền thông ngày nay) – Đại học Bách khoa Hà Nội được thành lập vào tháng 3 năm 1995, trên cơ sở sáp nhập 03 đơn vị thuộc Trường: Khoa Tin học, Phòng thí nghiệm chuyên đề xử lý tin (Khoa điện tử – viễn thông), và Trung tâm máy tính và tin học ứng dụng. Tại thời điểm thành lập, là một trong bảy khoa công nghệ thông tin trọng điểm được thành lập tại Việt Nam.
Trường đã đầu tư cơ sở vật chất tiện nghi, hiện đại phục vụ cho công tác dạy học và nghiên cứu khoa học
Bởi độ hot cũng như chất lượng giảng dạy tốt, ĐH Bách Khoa Hà Nội lấy điểm chuẩn khá cao: 28.29 điểm ngành Khoa học máy tính và 29.42 điểm ngành Khoa học máy tính (năm 2023), có thể thấy tỉ lệ cạnh tranh hết sức khắc nghiệt.
Ở cả hai bảng xếp hạng danh giá THE và QS, lĩnh vực Khoa học Máy tính, Đại học Bách khoa Hà Nội đều đứng thứ nhất Việt Nam và top 1000 đại học tốt nhất thế giới, sánh vai với một số trường đại học uy tín ở các nước phát triển tiên tiến, như: The University of Georgia (Mỹ), Technische Universität Braunschweig (Đức), Université de Bordeaux (Pháp), Université Laval (Canada), La Trobe University (Úc)…
Mức học phí cập nhật mới nhất năm 2024 của ĐH Bách khoa Hà Nội là từ 24 – 30 triệu đồng/năm cho chương trình chuẩn và tăng không quá 10% mỗi năm.
Trường Đại học Công nghệ Thông tin – Đại học Quốc gia TP.HCM
Một trong các trường đào tạo công nghệ thông tin tại Tp. Hồ Chí Minh, không thể không nhắc đến trường ĐH Công nghệ thông tin – Đại Học Quốc Gia TPHCM. Thành lập từ năm 2006, Trường Đại học Công nghệ thông tin đã sớm khẳng định vị thế của mình trong công tác giảng dạy và đào tạo về IT. Với cơ sở vật chất thuộc hàng khủng và cập nhật theo xu hướng mới cùng với việc đào tạo kết hợp nghiên cứu, Nhà trường hướng đến việc phát huy năng lực của từng sinh viên.
“Toàn diện, sáng tạo, phụng sự” – Đây cũng là giá trị cốt lõi trong vận hành và phát triển của nhà trường, giúp xác lập vị trí là trường Đại học hàng đầu trong lĩnh vực CNTT tại Việt Nam. Khẳng định là nơi đào tạo sinh viên phát triển toàn diện cả về kiến thức, kỹ năng chuyên môn lẫn thái độ sống tích cực phục vụ cộng đồng, năng động – bản lĩnh – tự tin hội nhập quốc tế.
Đại học Công nghệ thông tin còn liên kết với các tập đoàn hàng đầu như IBM, Microsoft, SunJava… nên rất chú trọng việc dạy tiếng Anh với những chương trình học theo chuẩn quốc tế. Sau khi tốt nghiệp, sinh viên sẽ nhận được chứng chỉ quốc tế, giúp việc ứng tuyển vào các tập đoàn, công ty nước ngoài được dễ dàng hơn.
Nếu bạn muốn theo chuyên ngành Kỹ thuật phần mềm, An toàn thông tin, Thương mại điện tử và nhất là Khoa học máy tính thì nhất định không thể bỏ qua Đại học Công nghệ Thông tin của Đại Học Quốc gia TP. HCM.
Tổng thể khuôn viên rộng rãi của Đại học Công nghệ Thông tin
Không gian tự học tại Thư viện của UIT
Năm 2024, Nhà trường tuyển sinh các ngành với bốn hình thức: Tuyển thẳng và ưu tiên xét tuyển (25% chỉ tiêu); xét tuyển dựa trên điểm thi (thi đánh giá năng lực, thi tốt nghiệp THPT, 60% chỉ tiêu); xét tuyển chứng chỉ quốc tế uy tín (15% chỉ tiêu); xét tuyển theo tiêu chí riêng (chương trình liên kết với Đại học Birmingham City, Anh).
Về điểm chuẩn thì trường ở mức khá cao, từ 2021 – 2022 – 2023, ngành Công nghệ thông tin lấy lần lượt là 27.3 – 27.9, 26.9 ngành An toàn thông tin là 27 – 26.95, 26.3 và ngành Kỹ thuật phần mềm với 27.7 – 25.55 – 26.9. Nhưng bù lại cách cửa cơ hội việc làm cho các bạn sau khi ra trường sẽ rất rộng mở.
Hiện trường Đại học CNTT chưa công bố học phí chính thức năm 2024, bạn có thể tham khảo học phí của trường vào năm 2023 là khoảng từ 30 triệu đến 150 triệu và tăng không quá 10%, học phí sẽ phụ thuộc vào chương trình đào tạo mà bạn chọn (đại trà, hệ tiên tiến,…)
Thông tin liên hệ:
Địa chỉ: Khu phố 6, P.Linh Trung, Tp.Thủ Đức, Tp.Hồ Chí Minh
Ngành công nghệ thông tin học trường nào? Trường Đại học Sư phạm Kỹ thuật TP.HCM
Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE) là một trong những trường đại học hàng đầu tại Việt Nam về đào tạo ngành Công nghệ Thông tin. Được thành lập năm 1962, HCMUTE không chỉ nổi tiếng với các ngành sư phạm kỹ thuật mà còn là địa chỉ tin cậy cho các bạn trẻ yêu thích và muốn theo đuổi ngành Công nghệ Thông tin. Với những ưu điểm nổi bật như:
Chương trình đào tạo chất lượng: HCMUTE cung cấp chương trình đào tạo hiện đại, liên kết chặt chẽ với các doanh nghiệp hàng đầu trong và ngoài nước, giúp sinh viên có cơ hội tiếp cận với công nghệ mới nhất và được thực hành thực tế.
Đội ngũ giảng viên: Trường sở hữu đội ngũ giảng viên có trình độ cao, nhiều kinh nghiệm và nhiệt huyết trong giảng dạy và nghiên cứu.
Cơ sở vật chất hiện đại: HCMUTE đầu tư mạnh mẽ vào cơ sở vật chất với các phòng thí nghiệm, thực hành hiện đại, đáp ứng tốt nhu cầu học tập và nghiên cứu của sinh viên.
Hợp tác quốc tế: Trường có nhiều chương trình hợp tác quốc tế, trao đổi sinh viên với các trường đại học uy tín trên thế giới.
Bên trong các dãy phòng học trường SPKT TPHCM
Học phí trường Đại học Sư phạm kỹ thuật TP.HCM được chia thành 3 hệ đào tạo như sau:
Hệ đại trà: 17.500.000-19.500.000/năm
Hệ chất lượng cao (tiếng Việt): 28.000.000-30.000.000/năm
Hệ chất lượng cao (tiếng Anh): 32.000.000/năm
Đối với hệ đại trà, học phí sẽ tăng mỗi năm 10%, với hai hệ chất lượng cao còn lại, thì học phí sẽ cố định qua mỗi năm.
Điểm chuẩn nhóm ngành Công nghệ thông tin năm 2023 của trường ĐH Sư phạm Kỹ thuật TPHCM là 25.98 – 26.64 tùy thuộc vào chương trình đào tạo.
Thông tin liên hệ:
Trụ sở chính: 1 Võ Văn Ngân, Phường Linh Chiểu, TP. Thủ Đức, TP.HCM.
Trường Đại học Bách khoa – Đại học Quốc gia TP.HCM
Công nghệ thông tin trường nào? Trường Đại học Bách khoa – Đại học Quốc gia TP.HCM
Để tiếp tục trả lời câu hỏi được nhiều bậc phụ huynh và học sinh quan tâm: Học công nghệ thông tin, trường nào tốt? Cùng TopDev giải mã ẩn số tiếp theo…
Là 1 trong những trường đại học trọng điểm, Đại học Bách Khoa TP.HCM luôn nằm trong top những đại học kỹ thuật và công nghệ hàng đầu tại miền Nam Việt Nam. Ngoài tuổi đời và danh tiếng của mình, trường còn là nơi đào tạo ra rất nhiều tài năng cho đất nước với hàng loạt giải thưởng lớn nhỏ trong và ngoài nước.
Nếu bạn muốn có cơ hội lớn khi học tập và làm việc trong môi trường quốc tế, đại học Bách khoa TP.HCM sẽ giúp bạn khi trường liên kết với nhiều đại học giảng dạy trong lĩnh vực công nghệ thông tin trên thế giới.
Cơ sở vật chất siêu hiện đại của HCMUT
Nhà Thi đấu thể dục thể thao Bách khoa với diện tích 3.000 m2
Vì chất lượng giảng dạy và học thuộc hàng đầu tại Việt Nam, nên điểm chuẩn cũng thuộc top cao nhất khu vực miền Nam. Năm 2023 ngành Khoa học Máy tính là 28; ngành Kỹ thuật máy tính 27,35.
Nếu bạn cảm thấy mình thực sự đam mê với ngành công nghệ thông tin thì hãy chọn đại học Bách khoa làm bến đỗ của mình. Tuy nhiên, chương trình đào tạo của trường khá nặng, nhưng không sao, ‘có công mài sắt có ngày nên kim’ mà. Sau khi tốt nghiệp bạn sẽ dễ dàng tìm được công việc phù hợp theo mong muốn của mình vì tấm bằng của đại học Bách khoa TP.HCM thực sự rất có trọng lượng.
Học phí dự kiến năm 2024 của trường Đại học Bách khoa TP HCM là 40 – 80 triệu đồng một năm.
Thông tin liên hệ:
Địa chỉ:
Cơ sở 1: 268 Lý Thường Kiệt, Quận 10, TP.HCM
Cở sở 2: Khu đô thị Đại học Quốc Gia TP. HCM, Thành phố Thủ Đức, TP.HCM
Trường Đại học Khoa học tự nhiên – Đại học Quốc gia TP.HCM
Được tách ra từ Đại học Tổng hợp TP. HCM từ năm 1996, Đại học Khoa tự nhiên TP.HCM (HCMUS) là đơn vị hàng đầu trong việc nghiên cứu và phát triển lĩnh vực Công nghệ thông tin.
Với Khoa Công nghệ thông tin và các ngành liên quan như Khoa toán tin, các sinh viên của trường sẽ luôn được trang bị vốn kiến thức vững chắc cũng như được rèn luyện khả năng tư duy phân tích dựa trên chương trình bài bản và chuyên sâu. Trải qua hơn 25 năm hoạt động, Khoa đã phát triển vững chắc và được Chính phủ bảo trợ để trở thành một trong những khoa CNTT đầu ngành trong hệ thống giáo dục đại học của Việt Nam.
Cũng giống như các trường CNTT hàng đầu, trường cũng được tài trợ khá nhiều bởi các doanh nghiệp và tập đoàn lớn bên cạnh các chuyên gia quốc tế đến để trực tiếp đánh giá nên chất lượng các chương trình học luôn thuộc hạng tiên tiến nhất trong khu vực.
Ngoài ra khi học tại Đại học Khoa học tự nhiên, bạn sẽ luôn tìm thấy những sân chơi bổ ích để nâng cao năng lực và bản lĩnh của mình qua các cuộc thi về CNTT trong và ngoài nước.
Nếu bạn muốn theo học các chuyên ngành hot nhất của Công nghệ thông tin như trí tuệ nhân tạo AI, nghiên cứu chế tạo robot, lập trình điều khiển tự động hóa thì chắc chắn Đại học Khoa học tự nhiên sẽ là nơi rất tuyệt cho bạn.
Hiện nay, trường còn thành lập các phòng nghiên cứu chuyên về mảng Trí tuệ nhân tạo với AILab hay câu lạc bộ Robotics cực tiên tiến đảm bảo bạn sẽ có khoản thời gian đầy thú vị khi tham gia bên cạnh những giờ học tập.
Điểm chuẩn tham khảo 2023: 26 – 28.05 điểm tùy thuộc vào chuyên ngành và chương trình đào tạo
Học phí tham khảo: 20 – 50 triệu đồng/năm
Thông tin liên hệ:
Địa chỉ:
Cơ sở 1: 227 Nguyễn Văn Cừ, Phường 4, Quận 5, TP.HCM
Cơ sở 2: Linh Xuân, Phường Linh Trung, Quận Thủ Đức, TP.HCM
Điện thoại: (028) 62884499
Website: https://www.hcmus.edu.vn/
Học viện Công nghệ Bưu chính Viễn thông
IT học trường nào? Học viện Công nghệ Bưu chính Viễn thông
Học viện Bưu chính viễn thông được thành lập từ năm 1997, là một trong các trường có ngành công nghệ thông tin đáng cân nhắc và lựa chọn, hiện trường có 3 cơ sở tại Hà Nội, TP. HCM và Thái Nguyên.
Với đội ngũ giảng viên nhiều năm kinh nghiệm thực tế tại học viện, bạn sẽ được đào tạo một cách bài bản. Tuyệt vời hơn, hệ thống mạng lưới viễn thông và công nghệ thông tin phủ sóng cả nước của VNPT là môi trường hoàn hảo cho các hoạt động đào tạo và khoa học công nghệ gắn liền với thực tiễn với các giáo viên giảng dạy và sẽ truyền đạt cho các bạn những bài học thực tế.
Samsung Lab được đánh giá là một trong những phòng Lab xịn nhất Học viện.
Danh tiếng của Học viện Bưu chính viễn thông cũng được nhiều người biết đến khi các tân cử nhân luôn được đánh giá cao và bạn sẽ có nhiều cơ hội xin việc khi ra trường. Do đó điểm chuẩn của trường cũng khá cao. Năm 2022, khu vực phía Bắc của trường lấy điểm chuẩn ngành Công nghệ thông tin là 27.25, An toàn thông tin là 26.70. Ở khu vực phía Nam năm 2022, ngành Công nghệ thông tin lấy 25.85 điểm, An toàn thông tin lấy 25.05 điểm.
Nếu bạn có thành tích học tập khá và có đam mê với các ngành nghề liên quan với Công nghệ thông tin, đây sẽ là nơi để bạn yên tâm phát triển cho tương lai vững chắc của mình.
Thông tin liên hệ:
Địa chỉ:
Trụ sở chính: 122 Hoàng Quốc Việt, Q.Cầu Giấy, Hà Nội.
Học viện cơ sở tại TP.HCM: 11 Nguyễn Đình Chiểu, P. Đa Kao, Q.1 TP Hồ Chí Minh
Cơ sở đào tạo tại TP.HCM: Đường Man Thiện, P. Hiệp Phú, Q.9 TP Hồ Chí Minh
Cơ sở đào tạo tại Hà Nội: Km10, Đường Nguyễn Trãi, Q.Hà Đông, Hà Nội
Điện thoại: 024 3756 2186
Website: https://portal.ptit.edu.vn/
Đại Học FPT
ĐH FPT TP HCM là một trong những công trình có kiến trúc xanh bậc nhất Sài Thành
Nhận giải thưởng trường Đại học đào tạo Công nghệ Thông tin xuất sắc tại Châu Á năm 2018 do ASOCIO Award trao tặng, đại học FPT đã nhanh chóng trở thành 1 trong những nơi hàng đầu về giảng dạy ngành Công nghệ Thông tin khi chỉ mới được thành lập hơn 10 năm.
Ngoài việc được các giảng viên giàu kinh nghiệm & chuyên gia từ các doanh nghiệp trong lĩnh vực trực tiếp giảng dạy, các bạn sinh viên còn có nhiều cơ hội được đi xuất ngoại để tham gia các thực tập nước ngoài (On-The-Job Training hay OJT) rất hữu ích. Các bạn còn được đào tạo kỹ về ngoại ngữ từ rất sớm để có thể làm việc ở những công ty nước ngoài.
Thêm nữa, toàn bộ sinh viên sẽ được thực tập ngay tại doanh nghiệp để cọ xát. Tốt nghiệp xong, bạn còn có thể làm việc luôn tại các công ty của tập đoàn FPT như FPT Software chẳng hạn.
Đặc biệt, bên cạnh các hình thức xét tuyển truyền thống, FPT còn đưa ra hình thức xét kết quả xếp hạng học sinh THTP dựa vào xếp hạng SchoolRank (công cụ xếp hạng năng lực học tập của học sinh THPT toàn quốc do Đại học FPT xây dựng và phát triển). Theo đó, điểm chuẩn của Đại học FPT là TOP40 Schoolrank theo học bạ (40% học sinh THPT có năng lực học tập tốt nhất cả nước) và TOP40 Schoolrank theo điểm thi THPT (40% học sinh có kết quả thi Đại học tốt nhất cả nước).
Địa chỉ:
Cơ sở Hà Nội:Khu Giáo dục và Đào tạo – Khu Công nghệ cao Hòa Lạc – Km29 Đại lộ Thăng Long, H. Thạch Thất, TP. Hà Nội
Cơ sở TP. HCM: Lô E2a-7, Đường D1 Khu Công nghệ cao, P. Long Thạnh Mỹ, TP. Thủ Đức, TP. Hồ Chí Minh
Cơ sở Đà Nẵng: Khu đô thị công nghệ FPT Đà Nẵng, P. Hoà Hải, Q. Ngũ Hành Sơn, TP. Đà Nẵng
Cơ sở CẦN THƠ: Số 600 Đường Nguyễn Văn Cừ (nối dài), P. An Bình, Q. Ninh Kiều, TP. Cần Thơ
Cơ sở QUY NHƠN: Khu đô thị mới An Phú Thịnh, Phường Nhơn Bình & Phường Đống Đa, TP. Quy Nhơn, Bình Định
Website: https://daihoc.fpt.edu.vn/
Học viện Kỹ thuật Quân sự (Đại học Kỹ thuật Lê Quý Đôn)
Giống như Đại học Bách Khoa Hà Nội, đại học Kỹ thuật quân sự cũng đào tạo với hệ 4 và 5 năm, được đánh giá cao trong top đầu cả nước, đảm bảo khi tốt nghiệp sẽ có việc làm và mức lương cao.
Đại học Kỹ thuật Lê Quý Đôn là viện đại học kỹ thuật tổng hợp, đa ngành, đa lĩnh vực trực thuộc Bộ Quốc phòng Việt Nam. Sứ mạng của nhà trường là đào tạo nguồn nhân lực chất lượng cao, nghiên cứu phát triển, sản xuất chế thử, chuyển giao công nghệ tiên tiến và hội nhập quốc tế, góp phần đắc lực vào sự nghiệp xây dựng và bảo vệ Tổ quốc, phát triển ngành khoa học công nghệ quân sự Việt Nam.
Phòng huấn luyện thực hành bộ môn An toàn thông tin.
Đội ngũ giảng viên của trường cũng rất hùng hậu với nhiều phó giáo sư và tiến sĩ, chương trình giảng dạy các chuyên ngành Công nghệ thông tin được trường sử dụng cũng theo chuẩn kiểm định quốc tế, các bạn có thể yên tâm học tập những kiến thức thiết thực để yên tâm đi làm khi ra trường.
Trong Cuộc đua số 2017 do FPT tổ chức cho sinh viên các trường Công nghệ thông tin toàn quốc, Học viện còn giành chức vô địch khẳng định chất lượng giảng dạy rất tốt, ngang ngửa với trường Đại học Bách Khoa về việc đào tạo.
Thông tin liên hệ:
Địa chỉ : 236 Hoàng Quốc Việt, Bắc Từ Liêm, Hà Nội
Điện thoại: 069.515200
Website: https://mta.edu.vn/
Đại học Công Nghệ (UET) – Đại Học Quốc Gia Hà Nội
Đại học Công nghệ dù chỉ mới được thành lập vào năm 2004 nhưng sớm đã trở thành 1 trong những trường đại học công nghệ thông tin Hà Nội hàng đầu tại Việt Nam về công tác đào tạo , nghiên cứu về công nghệ, kỹ thuật hàng đầu cả nước và từng bước tiếp cận chuẩn mực quốc tế.
Các bạn học tập tại Đại học Công nghệ có thể khá là yên tâm cho tương lai sự nghiệp của mình. Trường đang hợp tác với nhiều trường, viện nghiên cứu lớn trên thế giới giúp các chương trình đào tạo cũng như hỗ trợ phát triển đội ngũ giảng dạy chất lượng cao: Đại học Bang Arizona, Mỹ với dự án BUIL-IT; Đại học Công nghệ Sydney, Úc với Trung tâm Hợp tác nghiên cứu giữa VNU-UTS, chương trình học bổng toàn phần cho nghiên cứu sinh đạt trình độ quốc tế; Chương trình đào tạo IT định hướng thị trường Nhật Bản; Viện nghiên cứu Viettel với chương trình Cử nhân Hàng không Vũ trụ…
Đại học Công nghệ cũng là nơi có nhiều học bổng khuyến khích học tập bởi trường là đối tác tin cậy của những tập đoàn lớn như Samsung, Toshiba,… đó là nguồn động lực không nhỏ để thúc đẩy các bạn sinh viên nỗ lực hết mình, cũng là phấn đấu cho tương lai phía trước.
Ngoài ra việc hợp tác với các doanh nghiệp như Samsung, Viettel, FPT, Toshiba, VNPT cũng giúp các phòng thực hành đặt tiêu chuẩn, phòng nghiên cứu hợp tác về IoT, thiết kế vi mạch, hệ thống nhúng…
Điểm trúng tuyển ngành Công nghệ thông tin những năm gần đây ngày càng tăng. Năm 2022 và 2023, điểm chuẩn ngành Công nghệ thông tin lần lượt là 29.15 và 27.85 nên đây chắc chắn cũng là 1 thách thức không nhỏ cho các bạn học sinh có mong muốn được theo học tại trường.
Trường Đại học Quản lý và Công nghệ TP.HCM (UMT) được Chính phủ cho phép thành lập vào tháng 3/2021 và đặt mục tiêu trở thành một hình mẫu đại học kiểu mới, chuẩn quốc tế, và biểu tượng của giáo dục đại học mang thông điệp “Hạnh phúc và Thành công”. Trong tầm nhìn đó, UMT tập trung đặt sinh viên lên hàng đầu và vượt ra khỏi giới hạn của giảng đường hay những thành công chỉ đo bằng điểm số. Trường đáp ứng hầu hết các mong muốn chọn trường đại học của thế hệ trẻ bằng môi trường giáo dục cởi mở, kết nối toàn cầu, thực tế năng động, trải nghiệm thú vị, tôn trọng sự khác biệt, cơ sở vật chất hiện đại và tương lai tươi sáng.
UMT có sáu ngành đào tạo chủ lực, trong đó Công nghệ thông tin là một ngành rất quan trọng. Khoa Công nghệ thông tin được dẫn dắt bởi PGS. TS. Trần Đan Thư – một nhà giáo ưu tú có nhiều kinh nghiệm trong lĩnh vực công nghệ từ khi còn trên giảng đường đại học. Với sự dẫn dắt của PGS. TS. Trần Đan Thư, Khoa Công nghệ thông tin tại UMT trở thành gương mặt sáng giá trong top các trường đào tạo ngành công nghệ thông tin tốt nhất hiện nay.
Hội trường UMT với sức chứa gần 500 người, được đầu tư âm thanh ánh sáng, sân khấu chuyên nghiệp.
Chương trình Công nghệ thông tin của UMT được tối ưu hóa cho từng sinh viên trong quá trình học, đảm bảo đào tạo chuẩn xác, thành công và chất lượng tốt nhất. Khoa CNTT đáp ứng yêu cầu về nghiên cứu phát triển cũng như ứng dụng công nghệ thông tin trong thực tiễn. Sinh viên được trang bị kiến thức và kỹ năng cần thiết để làm việc trong môi trường công nghệ thông tin đa dạng và thúc đẩy sự phát triển bền vững của ngành này.
Năm nay, UTM tuyển sinh với 4 hình thức là: Xét học bạ THPT; Xét tuyển thẳng theo quy định của trường; Xét kết quả thi đánh giá năng lực của ĐHQGHCM năm 2023; Xét tuyển thẳng theo quy chế tuyển sinh của Bộ Giáo dục và Đào tạo.
Thông tin liên hệ:
Địa chỉ: Đường 60CL, Khu đô thị Cát Lái, Phường Cát Lái, TP. Thủ Đức, TP.HCM
Điện thoại: +84 28 3636 9119
Website: https://www.umt.edu.vn/
Lời Kết
Trên đây là một số thông tin về các trường đại học có ngành công nghệ thông tin và có được đánh giá tốt nhất hiện nay. Tuy nhiên, vẫn còn rất nhiều các đơn vị đào tạo IT khác đang ngày càng đổi mới công nghệ và chất lượng giảng dạy, mang đến nhiều sự lựa chọn cho các bạn học sinh mong muốn theo lĩnh vực này.
Ngoài các trường đại học, các bạn cũng có thể theo học tập ở các trường cao đẳng hay trung tâm dạy nghề, tùy vào năng lực và khả năng của mình. Có rất nhiều con đường để thành công trên sự nghiệp, chỉ cần siêng năng, chăm chỉ và luôn cập nhật những cái mới trong thời đại công nghệ, chắc chắn sớm hay muộn các bạn cũng sẽ đạt được thành tựu cho riêng mình.
Hy vọng qua bài viết trên sẽ giúp các bạn tham khảo về các trường đại học đào tạo CNTT tốt và phù hợp với bản thân. Chúc các bạn lập trình viên tương lai có 1 kết quả thi thật tốt và sớm đạt được nhiều thành tựu nhé!
Bạn cũng có thể tham khảo các vị trí tuyển dụng IT Parttime, Việc làm IT Intern cho các sinh viên đang muốn học hỏi nâng cao trình độ thực chiến ngành Dev tại đây. Hoặc vào web TopDev, tìm các vị trí cho sinh viên đều có hết nhé!
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Node.js nổi tiếng với vai trò là môi trường chạy mã Javascript trên máy chủ. Nhắc đến Node không thể không nhắc đến V8 Engine cho khả năng xử lý JS mạnh mẽ, cộng với sức mạnh của C++ vốn là ngôn ngữ tạo nên nó. Node.js được cung cấp miễn phí, dễ dàng cài đặt và triển khai. Cộng đồng dùng Node rất đông cũng góp phần tạo nên sự nổi tiếng và tin tưởng.
Tuy nhiên gần đây một cái tên khác nổi lên như một hiện tượng “đe doạ” đến Node.js chính là Bun.sh. Vậy thì Bun.sh là gì và tại sao lại khiến Node.js phải dè chừng thì mời các bạn hãy đọc tiếp bài viết dưới đây.
Bun.sh là gì?
Trước tiên phải nói rằng Bun.sh cũng chính là môi trường chạy mã Javascript tương tự như Node.js. Mục tiêu của Bun là chạy được hầu hết mã JavaScript “bên ngoài trình duyệt”, mang lại những cải tiến về hiệu suất và độ phức tạp cho cơ sở hạ tầng tương lai, cũng như năng suất của các nhà phát triển thông qua một công cụ tốt hơn, đơn giản hơn.
Bun.sh không sử dụng V8 làm Javascript Engine như Node mà nó dùng JavascriptCore vốn là Engine của trình duyệt Safari. Ngoài ra Bun được viết bằng Ziglang mà họ giới thiệu là một ngôn ngữ bậc thấp (low-level) với quản lý bộ nhớ thủ công. Điều này giúp cho chi phí sử dụng tài nguyên của Bun thấp và hiệu năng cũng tăng thêm đáng kể.
Bun.sh triển khai lại hầu hết các thứ như trình biên dịch JSX/TypeScript, npm client, bundler, SQLite client, HTTP client, WebSocket client… Và tất cả đều là cây nhà lá vườn do họ tự tay phát triển.
Ngoài ra Bun cũng triển khai thuật toán phân giải modules của Node bao gồm cả node_modules nên bạn có thể cài đặt và sử dụng các gói có trên npm giống như Node. ESM và CommonJS đều được hỗ trợ tuy nhiên Bun sử dụng ESM làm mặc định.
Bun triển khai đến 90% các API của Node (N-API) nên hầu như các module hoặc native module viết cho Node đều sẽ hoạt động với nó.
Bun trở nên đáng gờm bởi tốc độ. Ngoài việc tận dụng được hầu hết các tính năng giống như của Node nên Bun giúp bạn gần như có thể chạy được hầu hết ứng dụng viết bằng Node, nhưng Bun còn cho tốc độ tốt hơn cả.
Theo lời nhà phát triển Bun, sử dụng lệnh bun run thay cho npm run sẽ tiết kiệm được 160ms cho mỗi lần chạy. bun install cũng nhanh hơn 20x lần so với yarm là do Bun sử dụng “the fastest system calls” mà họ tự triển khai.
Ngoài ra là một vài hình ảnh Benchmarks so sánh tốc độ HTTP request Bun với hai môi trường chạy mã JS thông dụng là Node và Deno thì nó cũng cho con số ấn tượng.
Điều hạn chế của Bun đó là một công cụ mới đang còn trong giai đoạn phát triển, chưa có bản phát hành ổn định nên việc sử dụng Bun trong môi trường Production là hoàn toàn có thể xảy ra rủi ro. Tuy nhiên với những lợi ích mà Bun mang lại thì nó rất đáng giá để trải nghiệm. Hãy thử dùng Bun biết đâu bạn sẽ lưu được thêm một công cụ đáng giá cho mình thì sao?
Kết luận
Tuy là một công cụ mới tuy nhiên Bun.sh đã và đang gây sự chú ý trong cộng đồng phát triển Node.js. Hy vọng rằng vào một ngày không xa Bun sẽ phát hành phiên bản ổn định, đồng thời giữ vững tốc độ này thậm chí là hơn nữa để cộng đồng ngày càng lớn mạnh hơn.
Với những bạn đang chập chững bước vào nghề lập trình, việc lựa chọn học Front-End hay Back-End là một quyết định khó khăn. Bởi mỗi lựa chọn khác nhau sẽ dẫn đến những thứ cần học khác nhau. Vì vậy, bạn phải hiểu rõ hai lĩnh vực này để xem thử đâu là thứ mình phù hợp nhất rồi mới đưa ra quyết định chính xác. Bài viết này sẽ tổng hợp những thông tin bạn cần về Front-End và Back-End, giúp làm sáng tỏ những thắc mắc của bạn.
Front-end là gì? Back-end là gì?
Front-end là gì?
Front-end là một lĩnh vực trong phát triển web tập trung vào giao diện người dùng. Nhiệm vụ chính của front-end là tạo ra các trang web hấp dẫn, đảm bảo trải nghiệm tốt cho người dùng. Lập trình Front-end sẽ sử dụng các ngôn ngữ như HTML, CSS và JavaScript để xây dựng và tối ưu hóa các thành phần như layout, hình ảnh, màu sắc và hiệu ứng. Front-end đóng vai trò quan trọng trong việc đem lại giao diện thân thiện và hấp dẫn cho người dùng.
Trong lập trình Front-end, có nhiều framework phổ biến được sử dụng để tăng cường hiệu suất và hiệu quả trong quá trình phát triển. Đây là một số framework thường được sử dụng: ReactJS, Angular, VueJS, jQuery, EmberJS,… Bên cạnh đó, bạn cần phải biết một số kỹ năng về thiết kế đồ họa, UI/UX, cách thiết kế giao diện responsive,…
Back-end là gì?
Back-end là một phần quan trọng trong phát triển web, chịu trách nhiệm xử lý 3 nhóm công việc chính là tương tác với cơ sở dữ liệu, xử lý dữ liệu và giải quyết các vấn đề liên quan đến sever. Bên cạnh đó, back-end đảm bảo việc tương tác xử lý dữ liệu và tạo ra API để giao tiếp với front-end. Nó đóng vai trò quan trọng trong việc xây dựng ứng dụng web chất lượng và bảo mật. Một lập trình viên Back-end có thể sẽ làm việc với các ngôn ngữ như PHP, Python, Ruby, Node.js và cơ sở dữ liệu như MySQL, MongoDB.
Ngoài ra, để thực hiện tốt công việc backend, bạn cần có kiến thức về các framework như Django, ASP.NET MVC, Spring,… Kiến thức về một số CMS như WordPress, Umbraco, Joomla,…
Lập trình Front-end hay Back-end sẽ phù hợp với bạn?
Bạn phù hợp với lập trình Backend hơn hay Frontend, đây là một câu hỏi rất khó để trả lời. Mỗi lĩnh vực này đều có những đặc điểm riêng và cung cấp những cơ hội phát triển đáng giá. Dưới đây là một số khía cạnh cần được xem xét giúp bạn đưa r quyết định chính xác hơn.
Xem xét mục tiêu và định hướng của bản thân
Để xác định rõ liệu nên học lập trình Frontend hay Backend, hãy cân nhắc theo đam mê và sở thích của bạn, và nhận biết thế mạnh của bản thân để chọn lĩnh vực phù hợp.
Nếu bạn là một lập trình viên mới tốt nghiệp, Frontend là lựa chọn hợp lý để bắt đầu. Lĩnh vực này đơn giản hơn, dễ bắt đầu và có thể làm việc hiệu quả mà không gặp quá nhiều khó khăn. Bạn có thể bắt đầu từ HTML và CSS để xây dựng một trang web tĩnh đơn giản, sau đó học thêm JavaScript hoặc các framework như jQuery để làm cho trang web tương tác hơn.
Sau khi bạn đã có nền tảng kiến thức cơ bản về Frontend, bạn có thể học các ngôn ngữ lập trình Backend hoặc học Fullstack như PHP, .NET hoặc Java. Điều này sẽ giúp bạn xây dựng và quản lý hệ thống phức tạp, xử lý dữ liệu và cung cấp các chức năng mạnh mẽ cho ứng dụng web của bạn.
Cân nhắc về thu nhập của Front-end và Back-end
Theo báo cáo thị trường IT Việt Nam của TopDev 2022, mức thu nhập của lập trình viên back-end khá chênh lệch so với front-end. Cụ thể lập trình viên front-end 3 năm kinh nghiệm có mức lương khoảng 954 USD/tháng, trong khi đó lập trình viên back-end có mức lương đến 1.338 USD/tháng.
Sự chênh lệch về mức lương này là do tính chất công việc của back-end có độ phức tạp hơn hẳn so với front-end. Vậy nên, bạn có thể cân nhắc lựa chọn học Back-end hoặc Full-stack để nhận được mức thu nhập cao sau này.
Front-end và Back-end, cái nào dễ tìm việc hơn?
Nhìn tổng thể, Back-end có thể sẽ có lợi thế hơn trên thị trường bởi yếu tố phức tạp trong công việc, nhiều doanh nghiệp sẵn sàng bỏ ra mức lương cao để chiêu mộ nhân tài. Thêm nữa, lập trình viên back-end yêu cầu phải biết đa dạng các ngôn ngữ lập trình cộng thêm các framework như React, Regular nên cơ hội việc làm sẽ rộng mở hơn.
Tuy nhiên, trong một số trường hợp, việc tìm việc Frontend có thể dễ dàng hơn. Frontend đóng vai trò quan trọng trong trải nghiệm người dùng, do đó, có nhiều công ty và dự án đang tìm kiếm các chuyên gia Frontend để cải thiện giao diện và khả năng tương tác với người dùng cuối.
Điều quan trọng là trang bị cho mình kỹ năng và kiến thức chuyên môn vững vàng trong lĩnh vực mà bạn lựa chọn. Có một portflio hay dự án thực tế sẽ tăng khả năng tìm việc thành công. Ngoài ra, theo dõi xu hướng công nghệ mới và làm việc với các công nghệ phổ biến cũng là yếu tố quan trọng để tăng cơ hội tìm việc trong lĩnh vực Frontend hoặc Backend.
Tóm lại
Việc lựa chọn nên học front-end hay back-end không chỉ dựa trên tiêu chí dễ tìm việc mà còn phụ thuộc vào mục tiêu và đam mê cá nhân. Cả hai lĩnh vực đều có cơ hội việc làm tốt như nhau. Quan trọng nhất là chọn lĩnh vực phù hợp với sở thích và mục tiêu phát triển của bạn sau này. Hãy duy trì đam mê, sẵn sàng học hỏi và luôn nỗ lực để phát triển kỹ năng và thành công trong ngành công nghệ thông tin.
Lập trình viên làm việc trên hệ sinh thái của Apple chắc hẳn không còn xa lạ gì với Xcode, một IDE với đầy đủ các SDK độc quyền dành cho việc xây dựng, phát triển ứng dụng dành cho iPhone, Macbook, iMac, Apple Watch,… Mới đây thì phiên bản mới Xcode 15 được Apple cho ra mắt version beta 2 với nhiều cải tiến nâng cấp đáng giá; bài viết hôm nay chúng ta cùng nhau tìm hiểu về IDE này cũng như một số tips giúp anh em Dev sử dụng Xcode một cách hiệu quả nhất nhé.
Xcode là gì?
Xcode là một IDE (Integrated Development Environment) hay môi trường phát triển tích hợp của Apple được sử dụng để phát triển phần mềm cho macOS, iOS, iPadOS, watchOS và tvOS. Xcode được Apple phát hành vào năm 2003, trải qua hơn 20 năm phát triển, phiên bản mới nhất hiện nay là 15.0 beta 2 được Apple giới thiệu vào 21/6/2023 (phiên bản ổn định chính thức là 14.3.1 phát hành ngày 1/6/2023).
Xcode là một ứng dụng chứa các chương trình cơ bản cho phép người dùng dễ dàng tùy chỉnh để phù hợp với các công việc của mình như trình soạn thảo, trình biên dịch, tài liệu lập trình, công cu tạo máy ảo,… hỗ trợ cho việc phát triển các ứng dụng được thực hiện mạnh mẽ và hiệu quả nhất. Apple cung cấp Xcode hoàn toàn miễn phí thông qua AppStore hoặc bạn cũng có thể tải xuống các phiên bản cũ hơn thông qua website https://xcodereleases.com/
Xcode hỗ trợ nhiều ngôn ngữ lập trình khác nhau như C, C++, Objective-C, Objective-C++, Java, AppleScript, Python, Ruby, ResEdit (Rez) và Swift với nhiều mô hình lập trình khác nhau như Cocoa, Cacbon hay Java. Xcode có thể xây dựng các files nhị phân chứa mã cho nhiều kiến trúc với định dạng Mach-O gọi là universal binary files; nó giúp ứng dụng dễ dàng chuyển đổi từ PowerPC (kiến trúc máy tính Apple) 32-bit sang 64-bit, từ PowerPC sang Intel x86 (kiến trúc máy tính dòng vi xử lý Intel), từ Intel 32-bit sang 64-bit hay từ Intel x86 sang Apple SoC (kiến trúc trên các chip M1, M2 mới nhất của Apple).
Điều này giúp các nhà phát triển phân phối 1 ứng dụng duy nhất cho người dùng và cho phép hệ điều hành tự động chọn kiến trúc phù hợp khi chạy.
Xcode sử dụng bộ công cụ phát triển phần mềm (SDK) iOS, SDK tvOS, SDK watchOS để biên dịch và gỡ lỗi (debug) ứng dụng cho các nền tảng hệ điều hành tương ứng. Nói cách khác, Xcode là công cụ đầy đủ và duy nhất cho việc phát triển ứng dụng cho toàn bộ hệ sinh thái của Apple.
Xcode cũng cung cấp các công cụ tích hợp hỗ trợ để quản lý source code sử dụng Git, có thể kết nối lưu trữ trên các hệ thống phổ biến như GitHub, Bitbucket hay GitLab; lập trình viên có thể sử dụng command-line (dòng lệnh) hoặc thao tác trực tiếp trên UI với các chức năng Xcode cung cấp sẵn cho việc pull, push code một cách nhanh chóng.
Breakpoints là một công cụ hỗ trợ được tích hợp trong Xcode để giúp chúng ta ngưng việc xử lý của chương trình tại một thời điểm. Việc tạm thời dừng xử lý giúp chúng ta có thể đánh giá, kiểm tra, đảm bảo code của chương trình chạy đúng, đồng thời hỗ trợ điều tra dấu vết của bug khi có lỗi xảy ra ngoài ý muốn; chúng ta gọi việc này là Debug.
Bất kỳ đầu dòng nào của Xcode (khi đang mở file) đều có thể đặt breakpoint bằng cách click vào số dòng phía bên trái của khu vực code.
Snippet
Snippet là một tiện ích trong Xcode chứa danh sách các đoạn code có sẵn được Apple đưa vào hoặc do chính lập trình viên chúng ta thiết lập trong project để có thể kéo thả vào và sử dụng. Điều này giúp bạn vừa tiết kiệm được thời gian viết code, lại có thể chuẩn hóa được source code trong dự án một cách dễ dàng hơn.
Kết bài
Như vậy chúng ta đã cùng nhau tìm hiểu về Xcode, những cập nhật mới trên phiên bản Xcode 15 sắp ra mắt cũng như một số gợi ý giúp bạn sử dụng, khai thác IDE này một cách hiệu quả nhất. Còn rất nhiều tính năng và công cụ hữu ích khác được tích hợp trong Xcode mà bạn nên tìm hiểu và khám phá trong quá trình lập trình và làm việc trong dự án. Hy vọng bài viết 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.
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Chúng ta chắc hẳn ai cũng mong muốn kĩ năng code của mình ngày một tốt hơn. Bằng cách học nhiều hơn, làm nhiều hơn để tích luỹ thêm nhiều kinh nghiệm trong xử lý vấn đề. Sau này khi đối mặt với một vấn đề cũ thì có thể giải quyết nó một cách dễ dàng, đơn giản vì khi đó chúng ta đã có kinh nghiệm xử lý chúng.
Nhiều người thường dựa vào số năm kinh nghiệm để đánh giá một người code giỏi hay không. Điều này cũng khá hợp lý trong trường hợp chúng ta có quá ít thời gian để tiếp xúc và đánh giá họ, hay cũng có khả năng là không đủ năng lực để đánh giá. Thực tế vẫn có những người ít tuổi hơn nhưng vẫn có khả năng xử lý vấn đề rất giỏi. Số năm kinh nghiệm lúc này cũng chỉ mang tính tham khảo vì không chắc chắn rằng cứ code lâu hơn sẽ giỏi hơn người code ít hơn.
Như Malcolm Gladwell đã viết trong cuốn sách “Những kẻ xuất chúng” của ông về “10.000 giờ là con số kỳ diệu của sự vĩ đại” tức là bạn sẽ trở nên thực sự giỏi một vấn đề nào đó khi làm việc với nó ít nhất 10.000 giờ. Đến nay con số 10.000 giờ vẫn còn đang gây nhiều tranh cãi, liệu cứ phải trải qua một mốc thời gian đã định thì bạn sẽ giỏi lên hay là còn cách nào khác để vượt qua nỗi ám ảnh của con số này không?
Tư duy lập trình là gì?
Đơn giản đó là cách giải quyết vấn đề bạn gặp phải một cách hiệu quả. Nhưng thế nào là hiệu quả? Điều đó phụ thuộc vào vốn kiến thức và kinh nghiệm của mỗi người.
Nếu cho bạn lựa chọn giữa 3 thứ dao, kéo và liềm để mở một gói Snack bạn sẽ chọn cái nào? Chắc chắn bạn sẽ chọn kéo vì bạn biết kéo là cách đơn giản nhất để mở gói. Nhưng liệu một đứa trẻ sẽ biết lựa chọn thứ tốt nhất trong số chúng? Về cơ bản deo, kéo hay liềm đều có thể mở được gói snack nhưng bạn đã quá rõ về chúng nên bạn biết cách để sử dụng chúng sao cho hiệu quả.
Quay về thế giới của lập trình viên, việc bạn biết cách áp dụng một công cụ, phương pháp… để giải quyết một vấn đề sao cho phù hợp và chính xác nhất đó chính là tư duy lập trình của bạn.
Có một sai lầm phổ biến của những người mới học code là chăm chút vào học (thuộc) mã mà không rèn luyện khả năng tư duy. Có rất nhiều ngôn ngữ mà mỗi ngôn ngữ có rất nhiều cú pháp khiến bạn không thể nhớ hết được. Nhưng khả năng tư duy lại tồn tại xuyên suốt trong các ngôn ngữ.
Để đạt được điều đó đòi hỏi bạn phải bỏ ra một cơ số giờ để tìm hiểu và thực hành hết tất cả kiến thức. Điều đó sẽ mang đến cho bạn tư duy lập trình. Con số 10.000 giờ kia chỉ mang tính tham khảo khi bạn biết mình nên tập trung vào đâu để đến đích nhanh nhất.
Những người có tư duy lập trình tốt thường sẽ có suy nghĩ về cách giải quyết một vấn đề khá giống nhau. Ai cũng từng là thực tập sinh và khi nghe những người có kinh nghiệm hơn nói chuyện với nhau về cách giải quyết một vấn đề nào đó, trông họ có vẻ trao đổi rất trơn tru nhưng mình lại chẳng hiểu gì cả, đơn giản vì bạn chưa đạt đến trình độ của họ để có tư duy lập trình đó.
Lời khuyên: Cứ làm và làm cho đến khi bạn tìm ra được cách tốt nhất để giải quyết. Không bao giờ hài lòng với cách cách giải quyết vấn đề của bạn vì mỗi cách luôn luôn tồn tại những ưu nhược điểm khác nhau.
Để đạt được điều đó, chung quy có 4 bước để mô phỏng quá trình này đó là:
Hiểu
Đầu tiên bạn cần phải hiểu được chính xác yêu cầu là gì. Hầu hết các vấn đề khó là vì bạn chưa hiểu chúng. Vậy làm sao để bạn hiểu được? Hãy thử giải thích chúng, điều đó cũng góp phần hình thành nên phương pháp “vịt cao su” nổi tiếng. Mấu chốt của phương pháp là bạn giải thích vấn đề đó với vịt cao su, nếu hiệu quả bạn sẽ phát hiện ra những lỗ hổng trong kiến thức của bạn.
Vịt cao su là một phương pháp nổi tiếng trong ngành lập trình trên thế giới. Về cơ bản việc bạn giải thích cho vịt cao su cũng chính là cách để kiểm tra xem bạn có thực sự hiểu vấn đề, vì chỉ khi hiểu bạn mới có thể giải thích lại được. Hơn thế trong quá trình giải thích bạn sẽ nhận ra được nhiều vấn đề mới phát sinh để từ đó tìm ra cách giải quyết chúng.
Có một câu nói nổi tiếng trong trường hợp này là “Nếu bạn không thể giải thích điều gì đó bằng những thuật ngữ đơn giản, bạn thực sự không hiểu nó”. Khi nhận một yêu cầu hãy dành thời gian để “hiểu” chúng trước khi bắt tay vào làm. Đó cũng chính là nội dung của bước 2 dưới đây.
Lập kế hoạch
Đừng vội bắt tay vào code ngay lập tức mà hãy dành thời gian vạch ra cho mình một kế hoạch giải quyết vấn đề. Bạn có thể hiểu vấn đề nhưng nếu ghi ra từng bước giải quyết sẽ giúp bạn nhìn nhận vấn đề một cách rõ ràng hơn, có thể phát hiện ra được những trường hợp không ngờ tới.
Hãy lặp lại câu hỏi “Với đầu vào X, các bước cần thiết để trả về đầu ra Y là gì?” trong khi lên kế hoạch. Xác định được từng đầu vào với từng đầu ra đồng nghĩa với việc bạn biết mình đang cần gì để từ đó biết cách giải quyết chúng bằng cách nào.
Chia nhỏ vấn đề
Hãy chia nhỏ vấn đề càng bé càng tốt. Một vấn đề lớn nhìn qua có vẻ rất phức tạp nhưng khi chia nhỏ ra nó lại trở về những vấn đề đơn giản đến mức có khi bạn đã quá quen thuộc với chúng. Nếu chưa từng gặp một trong những vấn đề đó là một cơ hội cho bạn tìm hiểu.
Cuối cùng khi giải quyết được hết vấn đề nhỏ tự khắc vấn đề ban đầu sẽ được giải quyết. Hãy nhớ phương pháp chia để trị luôn hữu hiệu ở mọi mặt trong cuộc sống.
Bế tắc
Những vấn đề nhỏ ở trên có lúc bạn không hoàn toàn làm chủ được chúng. Đừng lo lắng, bất kì ai cũng từng gặp điều này. Sự khác biệt giữa người giải quyết vấn đề giỏi và người bình thường là tò mò về sự xuất hiện của lỗi hơn là khó chịu về chúng. Về cơ bản việc cần làm trong giai đoạn này là thực hành khả năng gỡ lỗi của bạn từ đó rút ra được kinh nghiệm khi đối mặt với những lỗi tương tự. Hiểu được bản chất của lỗi cũng là hiểu được cách tránh khỏi lỗi đó.
Giải quyết được bế tắc chưa phải là tất cả. Hãy áp dụng phương pháp “đánh giá quy lui” – Tức là lùi về bước trước đó xem có còn cách nào giúp bạn giải quyết được vấn đề nhanh hơn không? Kể cả khi bạn đã giải quyết được vấn đề thì hãy dành thời gian nhìn lại để đánh giá xem liệu chúng có thực sự hiệu quả? Có thể làm lại được gì để giúp giải quyết tốt hơn không.
Kết luận
Tư duy lập trình là thứ luôn tồn tại trong chúng ta. Bạn hoàn toàn có thể làm chủ được tư duy của mình bằng cách rèn luyện mỗi ngày. Hiểu được tầm quan trọng của tư duy lập trình giúp bạn tập trung hơn vào con đường phát triển bản thân và sự nghiệp sau này.
Bài viết được sự cho phép của tác giả Tống Xuân Hoài
Vấn đề
Phát triển dự án là một quá trình dài không phải code một lần mà dùng mãi mãi được. Trong một dự án thời gian phát triển có khi chỉ chiếm một phần nhỏ so với thời gian kiểm thử và bảo trì (maintain) dự án.
Với một thời gian dài như vậy, dự án có nhiều khả năng phải luân chuyển nhân sự thường xuyên. Điều đó làm cho trong dự án có thể có rất nhiều người tham gia viết mã và mỗi người thì lại có một phong cách (style) viết mã riêng. Chúng ta không nên cấm tiệt điều đó, nhưng với những quy định về cú pháp như ngắt dòng, dấu móc, dấu chấm phẩy… thì hoàn toàn có thể tạo ra một quy định chung và yêu cầu mọi người tuân thủ.
ESLint là gì
ESLint là một công cụ phân tích tĩnh mã của bạn để nhanh chóng tìm ra sự cố. Nó được tích hợp vào hầu hết các trình soạn thảo văn bản và bạn có thể chạy ESLint như một phần của quy trình tích hợp liên tục (CI/CD) của mình.
Để làm được điều này ESLint có một tập hợp các quy tắc mà bạn sẽ cấu hình để phát hiện và ngăn chặn các đoạn mã vi phạm những quy tắc (rules). Hơn nữa ESLint còn có thể sửa chữa (fix) hay định dạng (format) lại chúng theo cấu hình tích hợp.
ESLint cung cấp extension cho các trình soạn mã khác nhau, bạn chỉ cần cài đặt extension của ESLint thì nó sẽ tự động thông báo lỗi realtime. Để xem danh sách các trình soạn mã hỗ trợ các bạn bấm vào ESLint Integrations.
Bạn có thể cài đặt ESLint thông qua npm ở dạng global.
$ npm i -g eslint
Sau đó chạy init để khởi tạo cấu hình ESLint cho project. Lưu ý là chạy init ở trong thư mục chứa project muốn sử dụng ESLint.
$ eslint --init
Khi chạy --init, ESLint sẽ hỏi bạn một số câu hỏi để tạo cấu hình phù hợp, bạn chỉ cần trả lời theo đúng những gì mà dự án đang sử dụng. Sau đó một file .eslintrc.js sẽ được tạo ra có chứa các cấu hình mà ESLint sẽ sử dụng cho dự án của bạn. (Lưu ý nếu bạn chọn cấu hình dưới dạng file json hoặc yaml thì ESLint sẽ tạo file cấu hình tương ứng).
Một cấu hình mặc định lúc --init ra sẽ trông như thế này:
ESLint sẽ tự động tìm tệp cấu hình .eslintrc trong dự án và Lint theo cấu hình đó. Bạn cũng có thể chỉ định tệp cấu hình cho ESLint thông qua dòng lệnh.
Giả sử tất cả mã của bạn nằm trong thư mục /src và bạn muốn chạy Lint toàn bộ dự án:
$ eslint src
Nhưng tôi chỉ cần chạy Lint với các tệp .js thôi và hãy bỏ qua các file trong thư mục src/dist:
ESLint đưa ra rất nhiều rule và việc lựa chọn áp dụng rule nào rule nào là cả một quá trình tốn thời gian lẫn công sức thế nên đã có khá nhiều những bộ quy tắc được ra đời.
Nổi tiếng nhất là 2 bộ quy tắc của Airbnb và Google.
Để sử dụng chúng rất đơn giản bạn chỉ cần chạy npm install dưới cấu hình package develop (–save-dev), sau đó khai báo tên của cấu hình muốn sử dụng trong file cấu hình ESLint.
Airbnb và Google có mô tả rõ cách sử dụng & các quy tắc mà họ áp dụng tại Airbnb Style hoặc Google Style.
Còn không bạn cũng có thể sử dụng bộ quy tắc do chính ESLint khuyến nghị bằng cách đặt "extends": "eslint:recommended".
Kết hợp với Githook
Đặt ra các quy tắc để tạo một style xuyên suốt trong dự án, vì thế bạn cần ngăn chặn những hành vi “push” code do vô tình hay cố ý hoặc quên chạy Lint. Bằng cách kết hợp với Githook bạn có thể ngăn chặn được những commit như thế.
Tổng kết
ESLint là một công cụ phân tích và sửa đổi mã Javascript hiệu quả, ESLint giúp cho code style của dự án bạn luôn được xuyên suốt. Việc áp dụng ESLint vào dự án hết sức đơn giản, ngoài ra còn có extension tích hợp cho nhiều trình Code Editor hay IDE để bạn có thể dễ dàng làm việc nữa.