Home Blog Page 169

Làm quen với phương pháp Atomic để structure source code, design

Atom, molecule, organism, template, và page là những khái niệm chính của phương pháp Atomic này.

Đây là một trong những cách tiếp cận để thiết kế một system. Tác giả của structure này là Brad Frost, ám ảnh bởi một thạc sĩ hóa học người Việt Nam (chắc dạy ở Mỹ), dạy môn hóa học khi anh này đang học cấp II.

Lấy ý tưởng nguyên tử hóa học, sự kết hợp giữa các nguyên tử tạo ra một phân tử, kết hợp các phân tử lại tạo thành 1 sinh vật

Structure theo phương pháp Atomic

Những khái niệm chính của Atomic

  • Atom nguyên tử (nguyên tố), đơn vị nhỏ nhất
  • Molecule do 2 nguyên tử trở lên hợp lại tạo thành, những phân tử hóa học như H2O được cấu thành từ nguyên tử Hidro và Oxy
  • Organism là sự kết hợp của nhiều phân tử tạo thành

Chúng ta đã biết bảng tuần hoàn hóa học, thứ ám ảnh thời học sinh

Bảng tuần hoàn hóa học

Thì lớn lên chúng ta có bảng tuần hoàn HTML, ám ảnh thời web developer

Bảng tuần hoàn HTML

Sự kết hợp của các element chúng ta tạo ra những trang web khác nhau (Organism)

Ngoài 3 khái niệm chính trên của hóa học, tác giả đưa thêm 2 khái niệm vào của dân web chúng ta

  • Template
  • Page

Structure theo phương pháp Atomic

Atom

Những element nhỏ nhất trong giao diện, đó chính là các thẻ html

<input />
<label />
<button />

Molecule

Trong lập trình chúng ta thường gọi nó là component, thí dụ như search component sẽ bao gồm labelinputbutton

Structure theo phương pháp Atomic

Organism

Một component có ô search, có thanh navigation, logo, đố bạn đó là gì? Header

Structure theo phương pháp Atomic

Tất nhiên header cũng có thể có nhiều component khác

Structure theo phương pháp Atomic

Một component có thể gọi là Organism có thể bao gồm nhiều component lặp lại như danh sách sản phẩm, bài viết

Structure theo phương pháp Atomic

Template

Giờ tới khái niệm mà tất cả anh em làm web chúng ta điều biết

Template là page nhưng ở dạng skeleton, chúng ta chưa tô vẽ gì cụ thể, nó như một cái rập, chúng ta dùng để đập ra vài trăm bộ đồ.

Structure theo phương pháp Atomic

Page

Page là một một UI hoàn chỉnh với nội dung, hình ảnh, logic có đầy đủ hết rồi

Structure theo phương pháp Atomic

Một illustration tổng quát

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

Tìm hiểu thêm về HTTP/3 và so sánh với HTTP2

HTTP-over-QUIC là một giao thức (protocol) thử nghiệm đã đổi tên thành HTTP/3. IETF đã ra bản draft vào 03/2020.

Có một bước tiến dài trong quá trình phát triển từ HTTP/1.1 (ra đời vào năm 1999) cho đến sự xuất hiện của HTTP/2 (chính thức vào 2015) và mọi thứ đang tiếp tục phát triển với HTTP/3 dự kiến hoàn thành vào năm 2019. Bài viết có so sánh rất nhiều giữa HTTP/2 và 3 nên nếu chưa biết HTTP/2 là gì, bạn có thể đọc trước ở đây

Đường tới QUIC

QUIC (Quich UDP Internet Connections) một giao thức truyền tải internet đem đến rất nhiều cải tiến với thiết kế để tăng tốc lưu lượng HTTP cũng như làm cho nó bảo mật hơn, kèm theo mục tiêu cuối cùng sẽ dần dần thay thế TCP và TLS trên web. Trong bài blog này, chúng ta cùng điểm qua một vài tính năng chính của QUIC và những lợi điểm của nó cũng như những thử thách gặp phải trong quá trình hỗ trợ giao thức mới này. HTTP/3 bản chất là sự tiến hoá lên từ giao thức QUIC do Google phát triển, tất cả đều bắt đầu từ gợi ý sau của Mark Nottingham.

Thực tế là có 2 giao thức cùng có tên là QUIC:

  • “Google QUIC” (viết tắt là gQUIC) là giao thức gốc được thiết kế bởi các kỹ sư của Google nhiều năm trước, mà sau nhiều năm thử nghiệm đang được IETF (Internet Engineering Task Force) đưa vào thành chuẩn chung.
  • “IETF QUIC” (từ giờ ta sẽ gọi đơn giản là QUIC) là giao thức dựa trên gQUIC nhưng đã thay đổi rất nhiều khiến nó có thể được xem là một giao thức hoàn toàn khác. Từ format của các gói tin cho đến handshaking và mapping của HTTP, QUIC đã cải tiến rất nhiều thiết kết gốc của gQUIC nhờ vào sự hợp tác mở của rất nhiều tổ chức và nhân, cùng chia sẻ một mục đích chung giúp Internet nhanh hơn và an toàn hơn.

Tóm lại, QUIC có thể coi là kết hợp của TCP+TLS+HTTP/2 nhưng được implement trên UDP. Bởi vì TCP đã được phát triển, xây dựng sâu vào trong nhân của hệ điều hành, vào phần cứng của middlebox nên để có thể đưa ra sự thay đổi lớn cho TCP gần như là điều không thể. Tuy nhiên, vì QUIC được xây dựng trên UDP nên nó hoàn toàn không bị giới hạn gì cả.

Vậy đâu là những cải tiến mà QUIC đem lại?

Bảo mật là sẵn sàng (và cả hiệu năng nữa)

Một trong những điểm nổi bật của QUIC so với TCP đấy là việc bảo mật mặc định ngay từ mục đích thiết kế của giao thức. QUIC đạt được điều này thông qua việc cung cấp các tính năng bảo mật như xác thực và mã hoá (việc thường được thực hiện bởi lớp giao thức cao hơn TLS) ngay từ trong bản thân của giao thức.

Quá trình bắt tay (handshake) ban đầu của QUIC bao gồm bắt tay 3 bước (three-way handshake) như của TCP và đi kèm với bắt tay TLS 1.3, cung cấp xác thực cho end-points và đàm phán (negotiation) các tham số mã hoá. Đối với những ai đã quen với giao thức TLS, QUIC thay thế lớp bản ghi TLS bằng format frame của riêng mình trong khi vẫn giữ nguyên các message bắt tay TLS.

Hệ quả là không chỉ đảm bảo rằng kết nối luôn được xác thực vào bảo mật mà còn làm cho việc khởi tạo kết nối trở nên nhanh hơn: bắt tay thông qua QUIC chỉ cần 1 lần truyền tin qua lại giữa client và server là hoàn thành, thay vì phải tốn 2 lần: 1 lần cho TCP và 1 lần cho TLS 1.3 như hiện tại.

HTTP Request Over TCP + TLS

HTTP Request Over QUIC

Tuy nhiên QUIC còn tiến xa hơn, mã hoá luôn cả metadata của kết nối, thứ mà có thể bị lợi dụng bởi các bên trung gian nhằm can thiệp vào kết nối. Ví dụ: số lượng gói tin (packets) có thể được sử dụng bởi kẻ tấn công trên đường truyền nhằm tìm ra mối liên quan với hoạt động của người dùng trên nhiều đường mạng khác nhau khi connection migration (xem bên dưới) diễn ra. Bằng việc mã hoá, QUIC đảm bảo rằng không ai có thể tìm ra mối liên quan với hoạt động dựa trên thông tin này ngoài end-point mà người dùng kết nối tới.

Mã hoá cũng là một thuốc chữa hiệu quả cho ossification (tạm dịch: vôi hoá, là một hiện tượng trong thiết kết giao thức, nếu bạn thiết kế giao thức có cấu trúc linh hoạt nhưng chẳng mấy khi sử dụng đặc tính đó thì khả năng có một số implement của giao thức sẽ coi phần đó là cố định. Giống như bạn có một cánh cửa mở nhưng hiếm khi mở nó, thì phần bản lề (phần di chuyển) dần dần sẽ bị oxy hoá), cho phép ta thực hiện việc đàm phán nhiều version khác nhau của cùng một giao thức. Thực tế đây ossification chính là lí do khiến việc triển khai TLS 1.3 bị trì hoãn quá lâu, và chỉ có thể được thực hiện sau rất nhiều thay đổi, được thiết kế để tránh cho các bên sản xuất thiết bị hiểu nhầm và block version mới của TLS, được đưa vào thực tế.

Head-of-line blocking

Một trong những cải tiến HTTP/2 đem đến là khả năng multiplex nhiều HTTP request trên cùng một kết nối TCP. Điều này cho phép các ứng dụng sử dụng HTTP/2 xử lý các request đồng thời và tối ưu hơn băng thông có sẵn.

Đây thực sự là cải tiến lớn so với thế hệ trước, yêu cầu app phải tạo nhiều kết nối TCP+TLS nếu app muốn xử lý đồng thời nhiều request HTTP/1.1 (VD như khi trình duyệt cần phải tải đồng thời Javascript và CSS để hiển thị trang). Tạo nhiều kết nối mới yêu cầu phải lặp đi lặp lại việc bắt tay nhiều lần, đồng thời phải trải qua quá trình khởi động (warm-up) dẫn tới việc hiển thị trang web bị chậm. Khả năng multiplex nhiều HTTP tránh được tất cả những điều này.

Tuy nhiên, vẫn có nhược điểm. Vì nhiều request/response được truyền qua cùng một kết nối TCP, tất cả đều bị ảnh hưởng bởi việc mất gói tin (packet loss), VD: do nghẽn mạng (network congestion), kể cả khi chỉ phần dữ liệu bị mất chỉ ảnh hưởng đến một kết nối. Hiện tượng này được gọi là “head-of-line blocking”.

QUIC đã tiến một bước sâu hơn và hỗ trợ việc multiplexing sao cho: các luồng (stream) HTTP khác nhau sẽ được map với các luồng QUIC transport khác nhau, nhưng tất cả vẫn chia sẻ chung một kết nối QUIC, nên không cần phải bắt tay lại. Thêm vào đó, tuy trạng thái nghẽn mạng được chia sẻ nhưng các luồng QUIC được phân phát riêng biệt nên trong phần lớn các trường hợp việc mất gói tin của một luồng không làm ảnh hưởng đến luồng khác.

Việc này có thể giảm đi trông thấy thời gian cần đển hiển thị hoàn chỉnh trang web (với CSS, Javascript, ảnh và các thể loại media khác nhau) đặc biệt trong tình huống đường mạng hay bị nghẽn và tỉ lệ rớt mạng cao.

Nghe có vẻ đơn giản, nhỉ?

Để có thể đem đến những điều hứa hẹn như vậy, QUIC cần phải phá bỏ một số giả định mà rất nhiều ứng dụng mạng vẫn tin vào, dẫn tới khả năng cài đặt QUIC và triển khai nó trở nên khó khăn hơn.

Vì vậy, QUIC được thiết kế để hoạt động dựa trên giao thức UDP để dễ dàng cho vệc triển khai và tránh vấn đề xảy ra khi các thiết bị mạng lại bỏ (drop) các gói tin từ một giao thức không rõ ràng, vì cơ bản tất cả các thiết bị mạng đều có hỗ trợ sẵn UDP. Việc này cũng cho phép QUIC nhanh chóng được đưa vào các ứng dụng ở tầng user, VD: các trình duyệt có thể cài đặt các giao thức mới và chuyển đến tay người dùng mà không cần phải chờ hệ điều hành cập nhật.

Mặc dù mục tiêu thiết kế ban đầu của QUIC là để tránh việc phải “break” những cái đang có, thì với thiết kế này cũng đưa việc chống lạm dụng và điều hướng gói tin đến đúng end-point trở nên thách thức hơn.

Chỉ cần NAT để đưa tất cả vào và âm thầm binding từ phía sau

Về cơ bản, các NAT router có thể theo dõi các kết nối TCP chạy qua bằng cách sử dụng 1 tuple gồm 4 thành phần (source IP address, source port, destination IP address, destination port) và bằng cách theo dõi các packet TCP SYN, ACK, FIN được truyền qua mạng, router có thể theo dõi được khi nào thì kết nối mới được tạo và bị huỷ. Việc này cũng cho phép router quản lý chính xác thời gian NAT binding (NAT binding: là mapping tương ứng giữa IP address và và port nội bộ với bên ngoài)

Đối với QUIC, việc này vẫn chưa khả thi do các NAT router có mặt hiện nay vẫn chưa hiểu QUIC là gì nên khi xử lý chúng sẽ fallback về mặc định, nghĩa là coi gói tin QUIC như là 1 gói tin UDP bình thường và xử lý. Việc xử lý UDP thiếu chính xác, tuỳ ý và có time-out ngắn có thể gây ảnh hưởng đến các kết nối cần giữ trong thời gian dài.

Khi bị timeout sẽ có hiện tượng NAT rebinding, lúc này end-point ở phía ngoài phạm vi của NAT sẽ thấy các gói tin đến từ một port khác với port ban đầu khi kết nối được khởi tạo, dẫn đến việc theo dấu kết nối chỉ bằng tuple gồm 4 thành phần như trên là không thể.

Và không chỉ mỗi NAT gặp vấn đề, một tính năng khác mà QUIC đem tới cũng gặp tình trạng tương tự. Đó là tính năng connection migration: cho phép chuyển qua lại giữa các kết nối khác nhau, VD: khi một thiết bị mobile đang kết nối thông qua mạng di động (cellular data) bắt được Wifi có chất lượng tốt hơn và chuyển sang mạng wifi này, vẫn đảm bảo kết nối dù IP và port có thể thay đổi.

QUIC giải quyết vấn đề này bằng cách đưa vào một khái niệm mới: Connection ID. Connection ID là một đoạn dữ liệu có chiều dài tự ý ở bên trong gói tin QUIC cho phép định danh một kết nối. End-point có thể dùng ID này để theo dấu kết nối cần được xử lý mà không cần phải kiểm tra tuple 4 thành phần như trên. Trên thực tế có thể có nhiều ID trong cùng một kết nối (khi có connection migration, việc này sẽ xảy ra để tránh liên kết nhầm các đường mạng khác nhau) nhưng về cơ bản việc này được quản lý bởi end-point chứ không phải thiết bị trung gian nên cũng không sao.

Tuy nhiên, đây cũng có thể là vấn đề với các nhà mạng sử dụng địa chỉ anycast và ECMP routing khi mà duy nhất một địa chỉ IP đích có thể là định danh cho rất nhiều server ở phía sau. Vì các edge router (router ngoài cùng) trong mạng cũng chưa biết phải xử lý QUIC như thế nào nên có thể xảy ra trường hợp gói tin UDP ở trong cùng một kết nối QUIC (nghĩa là cùng connection ID) nhưng có tuple 4 thành phần khác nhau (do bị NAT rebinding hoặc do connection migration) có thể bị điều hướng đến một server khác dẫn đến đứt kết nối.

Để giải quyết vấn đề này, các nhà mạng cần phải triển khai giải pháp load balance thông minh hơn ở layer 4, có thể bằng các phần mềm mà ko cần đụng đến các router (có thể tham khảo dự án Katran của Facebook)

QPACK

Một lợi điểm khác được HTTP/2 giới thiệu là nén header (header compression (HPACK)) cho phép HTTP/2 end-point giảm lượng dữ liệu phải truyền qua mạng bằng cách loại bỏ các phần thừa trong HTTP request và response.

Cụ thể, HPACK có các bảng động (dynamic tables) chứa các header đã được gửi (hoặc được nhận) trong HTTP request (hoặc response) trước đó, cho phép các end-point tham chiếu các header trước đó với các header gặp phải ở trong request (hoặc resoponse) mới và không cần truyền lại nữa.

Các bảng động của HPACK cần phải được đồng bộ giữa bên mã hoá (phía gửi HTTP request hoặc response) và phía giải mã (nơi nhận chúng) nếu không thì phía giải mã sẽ không thể giải mã được.

Với HTTP/2 chạy trên TCP, việc đồng bộ này diễn ra rất rõ ràng vì lớp TCP đã xử lý giúp chúng ta việc truyền đi các HTTP request và response theo đúng thứ tự chúng được gửi. Khi đó, phía mã hoá có thể gửi hướng dẫn cập nhật bảng như là một phần của request (hoặc response) khiến cho việc mã hoá trở nên rất đơn giản. Nhưng đối với QUIC thì mọi chuyện lại phức tạp hơn.

QUIC có thể gửi nhiều HTTP request ( hoặc response) qua nhiều luồng đồng lập, nghĩa là nếu chỉ có một luồng, QUIC cũng sẽ cố gắng gửi theo đúng thứ tự nhưng khi nhiều luồng xuất hiện, trật tự không còn được đảm bảo nữa.

Ví dụ, nếu client gửi một HTTP request A qua luồng A, và request B qua luồng B, thì có thể xuất hiện trường hợp như sau: do việc sắp xếp lại thứ tự của gói tin mà request B được server nhận trước request A, và nếu request B được client encode và có tham chiếu đến một header từ request A thì server sẽ không thể decode được vì chưa nhận được request A ?!

Ở giao thức gQUIC, vấn đề này được giải quyết đơn giản bằng xếp thứ tự tất cả các header của HTTP request và response (chỉ header chứ không phải body) trên cùng một luồng gQUIC. Khi đó tất các header sẽ được truyền đúng thứ tự trong mọi trường hợp. Đây là một cơ chế rất đơn giản cho phép có thể sử dụng lại rất nhiều code của HTTP/2 nhưng ngược lại cũng gia tăng vấn đề head-of-line blocking, thứ mà QUIC được thiết kế để làm giảm. Do đó, nhóm IETF QUIC đã thiết kế một cách mapping mới giữa HTTP và QUIC (“HTTP/QUIC”) và một cơ chế nén header mới gọi là “QPACK”.

Trong bản draft mới nhất của phần mapping HTTP/QUIC và QPACK, mỗi trao đổi HTTP request/response sử dụng một luồng QUIC 2 chiều củả chính nó, do vậy sẽ không xuất hiện tình trạng head-of-line blocking. Thêm vào đó, để hỗ trợ QPACK, mỗi phía của kết nối sẽ tạo thêm 2 luồng QUIC một chiều, một dùng để gửi cập nhật bảng QPACK đến cho phía còn lại, một để xác nhận những cập nhật này. Theo cách này mã hoá QPACK có thể sử dụng bảng động tham chiếu chỉ sau khi nó đã được xác nhận bởi phía giải mã.

Chống lại tấn công Reflection

Một vấn đề thường gặp phải ở những giao thức dựa trên UDP (xem thêm ở đây và ở đây) đấy là chúng nhạy cảm với kiểu tấn công reflection (phản chiếu). Đây là hình thức tấn công mà kẻ tấn công lừa server gửi một lượng lớn dữ liệu đến nạn nhân bằng cách làm giả địa chỉ IP source của gói tin gửi đến server khiến chúng trông có vẻ như là được gửi từ nạn nhân. Hình thức này được sử dụng rất nhiều trong các cuộc tấn công DDoS.

Nó còn đặc biệt hiệu quả trong trường hợp, response gửi bởi server lớn hơn rất nhiều so với request mà nó nhận được (nên còn có tên gọi là tấn công “khuếch đại”).

TCP không thường được sử dụng cho hình thức tấn công này do những gói tin được gửi trong quá trình bắt tay (SYN, SYN+ACK,…) đều có chiều dài bằng nhau nên không có tiềm năng dùng để “khuếch đại”.

Quy trình bắt tay của QUIC thì ngược lại, không được đối xứng như vậy: ví dụ với TLS, trong lần gửi đầu tiên, QUIC server thường sẽ gửi lại certificate chain của mình, có thể rất lớn, trong khi client chỉ cần gửi có vài bytes (TLS ClientHello message chứa trong gói tin QUIC). Vì lí do này, gói tin QUIC ban đầu gửi từ client cần phải pad (gắn thêm dữ liệu) đến một chiều dài tối thiểu cho dù thực tế nội dung của gói tin nhỏ hơn nhiều. Kể cả như thế đi nữa thì biện pháp này vẫn chưa đủ, vì về cơ bản, response của server thường được chia thành nhiều gói tin nên vẫn có thể lớn hơn rất nhiều gói tin đã đc padding từ client.

Giao thức QUIC cũng định nghĩa một cơ chế xác thực địa chỉ IP nguồn, khi đó server thay vì gửi lại một response dài thì chỉ gửi lại một gói tin “retry” nhỏ hơn rất nhiều chưa một token mã hoá đặc biệt mà client sẽ phải echo (gửi lại đúng ý nguyên) về phía server trong một gói tin mới. Theo cách này, server có thể chắc chắn là client không fake địa chỉ IP nguồn của chính mình (vì client đúng là có nhận được retry packet) và có thể tiếp tục hoàn thành quá trình bắt tay. Nhược điểm của biện pháp này là nó tăng thời gian bắt tay thông thường từ 1 vòng trao đổi client-server lên thành 2 vòng.

Một giải pháp khác là làm giảm kích cỡ của response từ server cho đến một lúc mà tấn công reflection trở nên không còn hiệu quả quả nữa, ví dụ sử dụng chứng chỉ ECDSA (cơ bản nhỏ hơn nhiều so với chứng chỉ RSA tương đương). Cloudflare cũng đang thử nghiệm với các cơ chế nén chứng chỉ TLS sử dụng các thuật toán nén như zlib, broti (là một tính năng được giới thiệu ban đầu bởi gQUIC nhưng hiện không khả dụng trong TLS).

Forward error correction

Là kĩ thuật sửa lỗi cho phép phát hiện và sửa một số lỗi nhất định xảy ra trong quá trình truyền dữ liệu mà không cần phải truyền lại. HTTP/3 cũng hỗ trợ kỹ thuật này, đọc thêm tại https://http3-explained.haxx.se/en/quic-v2#forward-error-correction

Hiệu năng của UDP

Một vấn đề lặp đi lặp lại với QUIC là những thiết bị phần cứng và phần mềm hiện tại chưa hiểu được giao thức mới này là gì. Ở trên, chúng ta đã xem xét cách QUIC giải quyết các vấn đề phát sinh khi gói tin đi qua các thiết bị mạng, router nhưng có một vấn đề tiềm năng khác chính là hiệu năng gửi và nhận dữ liệu qua UDP ở trên chính các end-point đang sử dụng QUIC. Qua nhiều năm, rất nhiều công sức đã được bỏ ra để tối ưu TCP nhất có thể, từ việc xây dựng khả năng off-loading vào phần mềm (hệ điều hành) và phần cứng (card mạng) nhưng đối với UDP thì hoàn toàn chưa có gì.

Tuy nhiên, chỉ còn là vấn đề thời gian cho đến khi UDP cũng được hưởng lợi từ những công sức trên. Gần đây, ta có thể thấy vài ví dụ, từ việc implement Generic Segmentation Offloading for UDP on LInux thứ cho phép các ứng dụng có thể gửi nhiều đoạn UDP giữa user-space và network stack của kernel-space với chi phí tương đương (hoặc gần như tương đương) của việc chỉ gửi 1 đoạn. Hay là việc thêm zerocopy socket support on Linux cũng cho phép ứng dụng tránh được chi phí phát sinh khi copy vùng nhớ từ user-spacve vào kernel-space.

Kết luận

Giống như HTTP/2 và TLS 1.3, QUIC đem đến rất nhiều tính năng mới để nâng cao hiệu năng và bảo mật của web site, cũng như các thành phần khác dựa trên internet. Nhóm hoạt động IETF đang đặt ra mục tiêu đưa ra version đầu tiên của spec của QUIC vào cuối năm 2018.

  • Cloudflare cũng đã và đang làm việc chăm chỉ để có thể sớm đưa những lợi ích của QUIC đến với toàn bộ khách hàng. Update: Cloudflare đã hoàn thành việc hỗ trợ HTTP/3 bằng việc tạo ra quiche, phiên bản open-source của HTTP/3 được viết bằng Rust. 
  • Google nói rằng gần 1/2 tất cả những request từ trình duyệt Chrome tới server của Google được thực hiện qua QUIC và họ mong muốn sẽ tăng thêm lưu lượng thực hiện qua QUIC để tiến tới đưa nó thành phương thức mặc định từ kết nối client của Google, kể cả từ trình duyệt và thiết bị di động, đến server của Google.
  • Hỗ trợ cho HTTP/3 đã được thêm vào Chrome (Canary build) vào 09/2019, và mặc dù HTTP/3 chưa được bật mặc định tron bất kỳ trình duyệt nào nhưng ở thời điểm năm 2020, HTTP/3 đã được hỗ trợ trong Chrome and Firefox (cần bật flag thì mới có thể dùng được). Bạn có thể thử nghiệm với HTTP/3 theo hướng dẫn tại đây Chúng ta có thể mong chờ vào một tương lai tươi sáng với QUIC!

Bài viết được dịch và tổng hợp từ CloudFlare Blog và Medium

Trò chuyện cùng Lê Minh Nghĩa – Solution Architect tại TIKI

Để trở thành Solution Architect thì nên bắt đầu từ đâu? Đâu là những hiểu lầm và suy nghĩ sai về nghề Solution Architect? Làm sao để tiến xa hơn với vị trí Solution Architect? Hãy cùng trò chuyện và gặp gỡ “thủ lĩnh” Solution Architect tại TIKI – anh Lê Minh Nghĩa, sẽ chia sẻ tất cả những kinh nghiệm và góc nhìn lâu năm trong nghề mà bất cứ Architect nào cũng quan tâm.

Solution Architect là gì?

Theo anh một Solution Architect có vai trò như thế nào ở một công ty Thương mại điện tử (TMĐT)? Anh có thể giới thiệu một cách khái quát về công việc của mình ở thời điểm hiện tại?

Mình gia nhập team cách đây 3 năm từ hồi cuối 2016 với vai trò là Solution Architect, hiện nay mình đang là Senior Technical Architect tại TIKI. Đối với mình, công việc Architect khá thú vị, và điều mà mình thích nhất đó là trải nghiệm – mình có thể nhìn thấy toàn bộ hệ thống phát triển như thế nào, mở rộng làm sao và mình có thể có tầm nhìn đáp ứng nhu cầu phát triển của công ty bằng cách nào. Phần này khá thú vị, song cũng khá thách thức. Thách thức ở đây nằm ở chỗ làm việc vừa phải tổng thể vừa phải chi tiết. 

Architect không giống như nhiều bạn nghĩ vì không nhiều người từng trải qua công việc này. Architect thực chất là người “master builder”, là người phải hiểu rõ công việc xây dựng hệ thống đến mức nhìn thấy những thành phần nhỏ nhất, và biết rõ những thành phần ấy được cấu tạo ra sao. Đó không phải là công việc đơn thuần kiểu làm từ trên xuống (top-down), mà là công việc khá chi tiết và vất vả. Vì khi bạn vừa phải nhìn tổng thể vừa phải nhìn chi tiết, đồng nghĩa với việc bạn xử lý một lượng vấn đề rất lớn, và phải ra quyết định phù hợp tại từng thời điểm với từng hoàn cảnh với nguồn lực mình đang có.

Để trở thành một Solution Architect giỏi thì chúng ta cần phải chú ý phát triển những kỹ năng gì?

Đầu tiên, bạn phải là một engineer rất giỏi. Bạn phải là một “master builder”, nghĩa là một “bậc thầy” về xây dựng hệ thống. Chỉ khi nào bạn hiểu tường tận quá trình xây dựng hệ thống, lúc đó bạn có thể xây dựng bất cứ một hệ thống nào trong lĩnh vực mình đang tham gia – bạn sẽ hiểu được từng thành phần nhỏ được vận hành thế nào, thì bạn mới có khả năng trở thành một Architect. 

Tuy nhiên, đó mới chỉ là điều kiện cần. 

Điều kiện đủ ở đây là bạn phải có động lực, mong muốn nhìn từ trên cao xuống từng thành phần được cấu thành ra sao. Bởi vì đôi khi những engineer rất giỏi có thể giải quyết những vấn đề nhỏ nhưng lại không có khả năng nhìn tổng thể để kết nối tất cả các vấn đề lại thành hệ thống lớn, tức là bạn chưa có tầm nhìn của một Architect. 

Ngoài ra, để trở thành Architect bạn cần có khả năng về con người, tức là tố chất về leadership (tài lãnh đạo) của bạn phải rất là tốt – một yếu tố rất quan trọng. Bởi vì không phải lúc nào những giải pháp bạn đưa ra cũng gặp thuận lợi, bạn phải hiểu được rằng bạn đang có trong tay những người như thế nào, những người ấy có khả năng ra sao về mặt kỹ thuật, và làm sao có thể kết nối những con người này để đưa giải pháp trở thành hiện thực. Đó là công việc mà đòi hỏi khả năng kỹ thuật và cả khả năng con người rất tốt.

Anh có thể miêu tả một career path cụ thể cho một Solution Architect được không? 

Có 2 thứ theo quan điểm mình vừa chia sẻ.

  • Bạn phải là một engineer thật sự đam mê – đam mê về công việc của mình và phải là một engineer rất giỏi và có background ngôn ngữ vững vàng. Bạn phải có khát khao lớn hơn nữa – khi đứng đầu của một hệ thống bạn có thể nhìn tổng thể hệ thống vận hành ra sao. Bạn có khát khao làm sao có thể kết nối những thành phần nhỏ để tạo nên những gì lớn hơn. Cái khát khao ấy sẽ thôi thúc bạn hướng tới những sự hình thành kỹ năng, năng lực của một Architect, đó là khả năng nhìn từ trên xuống (top-down). 
  • Bạn cũng cần có động lực để vượt qua những khó khăn công việc của một Architect, đó là vừa phải nắm được tổng thể cũng như những chi tiết. Ngoài ra, bạn cũng cần có khả năng vượt qua rào cản về con người để thuyết phục mọi người rằng “Solution của tôi đúng”.

Kinh nghiệm bản thân khi công tác tại TIKI

Anh có thể chia sẻ về một kỉ niệm đáng nhớ cũng như kinh nghiệm xương máu về việc ứng dụng một công nghệ mới vào sản phẩm của công ty?

Kinh nghiệm đáng nhớ nhất của mình đó là khi bắt đầu apply những giải pháp giúp hệ thống có thể chia tách được. Tại thời điểm đó, nhiều khái niệm và thuật ngữ ngành còn rất mới với nhiều người. Khi đó những giải pháp của mình đưa ra không phải lúc nào cũng được mọi người ủng hộ ngay lập tức. 

Và kỷ niệm vui khi ở Tiki là khi ở đây, không phải lúc nào đưa giải pháp mới mọi người cũng hiểu, và ủng hộ theo kiểu là “Tôi hiểu giải pháp của bạn là sao” nhưng mọi người luôn luôn tạo điều kiện để người đó thực hiện. Người đó có quyền thử nghiệm, thực hiện ngay tại chỗ. Và khi giải pháp này đúng, mọi người sẽ ủng hộ và áp dụng chúng trên diện rộng. Khi mình đưa giải pháp đó ra, có thể mọi người chưa hiểu và chưa ủng hộ, nhưng mọi người luôn tạo điều kiện tối đa để mình thực hiện giải pháp đó. Và sau khi giải pháp đó thành hiện thực thì công nghệ nhanh chóng trên quy mô toàn công ty, mọi người có thể sử dụng công nghệ ấy để có thể replicate data, chia tách hệ thống tốt hơn. Nhờ vậy, Tiki có thể scale tốt hơn rất nhiều.

Đây là kỷ niệm rất ý nghĩa. Với bản thân mình, mình đã chứng minh được: 1 là giải pháp đúng, 2 là mình đã hiểu được giá trị văn hóa của chúng tôi là gì. Khi làm việc cùng nhau, không phải lúc nào công việc cũng mượt mà như mọi người thường nghĩ, nhưng ở đây chúng tôi có một thứ văn hóa tốt, đấy là mọi người có quyền thử nghiệm và khi đúng thì nó sẽ được nhân rộng một cách nhanh chóng. Điều đấy rất quan trọng đối với một công ty trẻ!

Ngành CNTT chưa bao giờ hết nóng, tuy nhiên các doanh nghiệp vẫn gặp khó khăn trong việc tuyển dụng các lập trình viên phù hợp, theo anh đâu là vấn đề?

Nguyên nhân đầu tiên là do nhu cầu quá lớn, không chỉ ở riêng TIKI mà nói chung tại các công ty công nghệ, vì đây là kỷ nguyên số và tất cả mọi người đều muốn số hóa nhanh nhất có thể. Mọi người muốn hệ thống thông minh hơn, muốn hệ thống làm được nhiều thứ hơn. Vì vậy, nhu cầu về IT vô cùng lớn ở Việt Nam và trên toàn thế giới. 

Về phía doanh nghiệp, bài toán này càng khó hơn và số lượng ứng viên chất lượng thì không nhiều. Tại TIKI, phía công ty cũng khó khăn trong việc tìm được người phù hợp với tiêu chuẩn của mình. Người có năng lực thấp thì rất nhiều nhưng các bạn ấy không sẵn sàng giải quyết các bài toán tại TIKI, và cũng không cảm thấy hạnh phúc khi giải quyết các vấn đề và TIKI cũng không thu được giá trị từ các bạn đó.

Anh có thể chia sẻ một số khó khăn về kỹ thuật khi mở rộng mô hình B2C sang mô hình marketplace?

Khi chuyển từ B2C to marketplace về phía công nghệ thì có 2 khó khăn lớn. 

Thứ nhất, B2C là mô hình mình mua hàng về và bán, nhưng hiện nay mình trở thành một cái sàn để các seller vận hành trên đó và có đến hàng chục, hàng trăm ngàn seller vận hành. Như vậy, tính phức tạp nghiệp vụ cũng tăng lên gấp bội, vì vậy đòi hỏi kỹ năng thiết kế hệ thống phần mềm (software) phải linh hoạt, dễ dàng hoạt động cho các nghiệp vụ mới, phát sinh liên tục.

Khó khăn thứ hai, đương nhiên là về mặt hiệu năng. Khi bạn có một lượng lớn giao dịch diễn ra trên hệ thống trong 3 năm marketplace, TIKI tăng trưởng trung bình 2 đến 3 lần mỗi năm, thì lượng giao dịch, đơn hàng và sản phẩm đều tăng gấp bội. Từ vài trăm nghìn sản phẩm lên đến hàng triệu sản phẩm, và như vậy lượng xử lý trở nên vô cùng khó khăn và phức tạp. Hạ tầng cũng phải mở rộng lên gấp nhiều lần. Vì vậy, để có thể build hệ thống đáp ứng nhu cầu về hiệu năng là một challenge lớn về mặt kỹ thuật. Người engineer tại TIKI cùng lúc sẽ phải giải quyết 2 việc, bạn phải build nên một phần mềm thật linh hoạt, mềm dẻo, thay đổi nhanh tương ứng với tăng trưởng vài ba lần mỗi năm. Bạn phải có system rất scale để có thể handle hàng trăm ngàn transaction mỗi ngày và xử lý lượng dữ liệu lên đến hàng triệu sản phẩm. 

Theo anh nền tảng Data và Devops đang đóng vai trò như thế nào cho những doanh nghiệp thương mại điện tử tại thị trường Việt Nam? 

Data và Devops là 2 khái niệm khác nhau, nhưng cả 2 đều rất quan trọng. Đối với data thì quá hiển nhiên, tất cả doanh nghiệp khi mở rộng thì mọi quyết định đều dựa trên dữ liệu. Mà dữ liệu là thứ quan trọng bậc nhất để mọi cấp bậc từ người nhân viên lấy hàng cho tới một manager C-level để make decision. Vì vậy, data ở TIKI cũng như tất cả các công ty E-commerce khác là vàng và thứ quan trọng nhất để chúng tôi đưa ra quyết định kinh doanh hiệu quả. 

Còn DevOps liên quan đến quá trình phát triển hệ thống, development và triển khai hệ thống. DevOps rất quan trọng với những công ty có scale quy mô lớn, như TIKI có đến hơn 400 services và ứng dụng khác nhau theo mô hình microservice và hàng ngàn backgroundworker để chạy của hàng trăm engineer để phát triển. Với lượng mã nguồn triển khai lớn như vậy mà nền tảng DevOps không tốt thì sẽ rất khó để scale và mở rộng. Vì vậy DevOps cực kỳ quan trọng khi mà bạn và quá trình phát triển phần mềm trở nên phức tạp với quy mô lớn. Bất kỳ công ty công nghệ nào muốn scale lên thì cần DevOps rất tốt, bạn không thể triển khai manual khi bạn chỉ có 1 – 2 project.

Lời khuyên từ chuyên gia

Anh có thể chia sẻ cụ thể về lộ trình học/nghiên cứu của các công nghệ hiện có để đảm bảo tối thiểu có thể làm việc cùng team với anh tại TIKI?

Phải hiểu một điều là công nghệ là thuật ngữ rộng, nó bao hàm những yếu tố nền tảng và học thuật. Để làm việc tại TIKI thì đầu tiên các bạn cần có background, nền tảng tốt, bạn tốt nghiệp Đại học hay tự trang bị kiến thức miễn vững vàng đều tốt. Đấy là những điều tối quan trọng để bạn có thể làm việc tại TIKI. Về công nghệ theo hướng ngôn ngữ lập trình, thì bạn chỉ cần thành thạo những ngôn ngữ phổ biến, như Java, PHP, NodeJS hay Python, đó đều là những ngôn ngữ chúng tôi đều đang sử dụng. Nếu như bạn có những khả năng cơ bản về những ngôn ngữ đó, bạn có thể làm việc tại Tiki. Tại Tiki, điều quan trọng nhất là bạn phải luôn chào đón việc học hỏi những cái mới.

Anh có thể chia sẻ quy trình tuyển dụng của Tiki Engineering không? Những điểm mạnh hoặc lợi ích, phát triển bản thân hoặc điều gì thú vị nhất khi trở thành thành viên của tech team nói chung và team của anh nói riêng?

Process tuyển dụng của Tiki khá chặt chẽ vì Tiki mong muốn rằng mình có những ứng viên thật sự chất lượng và họ phải hiểu rằng chúng tôi rất nghiêm túc trước tài năng của họ. Nếu không tính vòng lọc hồ sơ thì sẽ có 4 vòng phỏng vấn chính, trong đó: 

  • 2 vòng phỏng vấn về problem-solving (xử lý vấn đề) dựa trên kiến thức về cấu trúc dữ liệu và giải thuật
  • 1 vòng về system design (thiết kế hệ thống)
  • 1 vòng về culture fit văn hoá doanh nghiệp. 

Đây là 4 vòng cơ bản, nếu 1 bạn pass được 4 vòng đó thì đủ tiêu chuẩn để làm việc tại TIKI. Phía TIKI quan tâm đến những ứng viên, đầu tiên là có background tốt (1) về những kiến thức về cấu trúc dữ liệu và giải thuật tốt – là những thứ quan trọng để có thể giải quyết những vấn đề của Tiki. Thứ hai, bạn phải có khả năng xử lý vấn đề tốt (2), tức là bạn phải có những đề xuất giải pháp nhanh chóng khi có vấn đề phát sinh. Cái thứ ba tất nhiên là bạn cần có những kỹ năng cơ bản của những engineer về lập trình và thiết kế hệ thống (3). Trong thực tiễn những điều này rất quan trọng và cũng rất hữu ích, khi bạn đối mặt với những công nghệ mới, nếu bạn học nhanh thì sẽ có nhiều thời gian để làm hơn.

Có một điều mà dưới góc nhìn và trải nghiệm của mình và những bạn đã đồng hành cùng TIKI cảm thấy là điều “hấp dẫn” nhất của TIKI. Trong vòng 1 năm qua kể từ khi ứng dụng những quy trình hoạt động mới, thì TIKI có sự tăng trưởng kinh doanh cực kỳ nhanh và vượt trội – 2 đến 3 lần mỗi năm. Thế nhưng, TIKI có một hệ thống không tốt!

Mình gọi là “hấp dẫn” là vì, đó là 2 điều kiện mà mình nghĩ rằng nó rất cần thiết đối với một bạn engineer trẻ, khao khát được học, được làm và chứng minh bản thân mình. Bởi vì khi bạn có một hệ thống không tốt mà hệ thống ấy lại tăng trưởng rất nhanh tức là bạn có cơ hội để làm rất nhiều thứ. Với mình thì đây là những điều hấp dẫn nhất đối với một bạn engineer. Và những ai đã vượt qua giai đoạn thử thách thì đều cảm thấy rất xứng đáng, vì các bạn có thể làm rất nhiều thứ, có thể cống hiến và góp sức cho những thứ mà có tầm ảnh hưởng rất lớn đến hệ thống và bộ máy TIKI.

Anh chia sẻ về một ngày làm việc của mình và team tại TIKI?

Đối với một engineer, công việc hàng ngày khá là thú vị. Thú vị ở chỗ bạn gắn với một business tăng trưởng liên tục. Bạn thường xuyên nhận được những báo cáo đòi hỏi những yêu cầu, ý tưởng kinh doanh mới. Công việc hàng ngày của engineer nói chung là phân tích những yêu cầu về business để bạn thấy được cơ hội, và có thể mang lại lợi ích cho công ty và khách hàng và làm sao để biến ý tưởng ấy trở thành hiện thực nhanh nhất có thể. Hoặc đơn giản là làm sao để bạn giải quyết những vấn đề như phải scale hệ thống gấp 2, 3 đến 10 lần trước những vấn đề về hiệu năng. Đấy là những công việc hàng ngày của bạn engineer.

Anh hay dùng công nghệ và cách thức gì để quản lý công việc của team, cũng như đo đạc hiệu quả làm việc của họ?

Về cách thức quản lý, Tiki có một mô hình tổ chức tương đối phẳng và xem trọng tính linh hoạt mà nỗ lực để giải quyết những vấn đề có thể phát sinh. Vì vậy toàn bộ bộ máy engineer của TIKI được tổ chức thành những team nhỏ, thay đổi dựa trên nhu cầu về nghiệp vụ. Các team ấy được toàn quyền quyết định với những vấn đề thuộc phạm vi mình phải giải quyết. Bạn sẽ quyết định về giải pháp, quyết định về con người, để làm sao để giải quyết nhanh nhất và hiệu quả nhất. Bởi đặc thù của E-commerce là tăng trưởng rất nhanh, vì vậy việc ra quyết định trong quá trình xây dựng sản phẩm phải làm sao nhanh chóng nhất và hiệu quả nhất có thể.

Còn về công nghệ, ở Tiki mình không nghĩ có gì quá đặc biệt. Nó vẫn tuân thủ theo những công nghệ phổ biến trong cách thức quản lý công việc, về mã nguồn cũng như là về DevOps. Mọi thứ cũng phổ biến như là Genkin, Github mọi người theo dõi những nguồn quản lý để deploy.

Nỗi sợ lớn nhất của anh trong công việc công nghệ của mình?

Tùy vị trí mà mỗi người sẽ có những nỗi sợ khác nhau. Mình nghĩ rằng đối với những bạn engineer tại Tiki, các bạn cũng có áp lực giống như nhiều công ty khác – phải làm sao để hệ thống không chết. Khi các bạn engineer submit mã nguồn thì các bạn sẽ phải thận trọng để biết rằng nó không bị ảnh hưởng tiêu cực.

Áp lực thứ hai, cụ thể hơn là với cấp quản lý, công ty tăng trưởng rất nhanh, bạn cũng cần đưa ra những giải pháp nhanh chóng để làm sao không tạo ra những tình thế buộc bụng cho doanh nghiệp, bạn phải làm sao giải quyết những vấn đề về kinh doanh tốt nhất có thể để công ty tăng trưởng và mang lại doanh thu  cho khách hàng.

Công nghệ recommendation của Tiki do mình tự phát triển hay sử dụng giải pháp nào khác? Anh có thể chia sẻ thêm về công nghệ này

Thực tế thì công nghệ recommendation tại Tiki cũng là cái “bát đồng”. Cái cơ hội để hoàn thiện và phát triển là rất lớn. Điều Đáng mừng là công nghệ này do Tiki tự làm, Tiki không nói là nó đã hoàn thiện nhưng Tiki cảm thấy rằng khi làm chủ được nó, thì cơ hội để chúng tôi cải thiện là rất cao.

Tiki có ứng dụng công nghệ AI không? Nếu có anh vui lòng chia sẻ chi tiết về việc ứng dụng này

Việc ứng dụng về AI thì rất nhiều. Đối với Tiki, AI là công nghệ tiếp theo để chúng tôi có thể phát triển thị phần. Vì nhu cầu xử lý trong business đòi hỏi Tiki phải ứng dụng hoạt động này ngày càng nhiều lên. Nếu công việc xử lý bằng tay sẽ rất khó để mở rộng lên, quy mô hàng trăm nghìn khách hàng, hàng triệu seller và hàng chục triệu sản phẩm, những việc xử lý bằng tay sẽ không ra quyết định bằng cách tự mình xử lý dữ liệu. Vì vậy AI rất quan trọng trong việc scale-up và mở rộng doanh nghiệp. Tiki còn ứng dụng AI trong tự động hóa quy trình, tối ưu hóa trong Marketing, search và trải nghiệm người dùng.

Xin cảm ơn anh Nghĩa về phần chia sẻ rất chi tiết vừa rồi. Hy vọng qua bài phỏng vấn này các bạn độc giả đã học hỏi thêm về vai trò của một Solution Architect cũng như làm thế nào để trở thành master builder tại công ty. Đừng bỏ lỡ những bài phỏng vấn các chuyên gia công nghệ hàng đầu tại mục Chuyên gia nói nhé!

Xem thêm việc làm Solution Architect tại TopDev

“Cơ hội phát triển sự nghiệp AI với các ngành nghề là tương đồng” – Bảo Đại, AI Researcher tại Knorex

Là gương mặt quen thuộc với cộng đồng YouTube với dự án âm nhạc “Dân IT”, góp mặt là host của các buổi phỏng vấn chuyên sâu trên TopDev TV, Bảo Đại thật ra đang đảm nhận vị trí AI Researcher | Research Scientist tại Knorex, ngoài ra anh còn là một lecturer tại tổ chức Viet.AI. Cùng TopDev trò chuyện cùng anh chàng đa tài này và hiểu hơn về công việc cũng như học hỏi lộ trình anh Đại chọn để trở thành một AI Researcher nhé.
  25 thuật ngữ bạn nhất định phải biết khi lập trình web
  Bí kíp toàn thư về React mà bạn cần phải biết (phần 1)

Về khách mời Bảo Đại

Chào anh, là một “nghệ sĩ” trong giới công nghệ anh hãy cho độc giả biết hơn về cơ duyên đến với nghiên cứu trí tuệ nhân tạo cũng như con đường sự nghiệp của mình

Đối với câu hỏi này thì mình nghĩ không có cơ duyên nào. Thực ra thì đó là sự lựa chọn thôi. Ví dụ như mình thích cái gì đó mình sẽ try hard vì nó. Thực ra con đường nghiên cứu về AI cũng là sự lựa chọn của mình

Mình bắt đầu nghiên cứu AI từ năm 2, khi mà mình còn ngồi trên ghế nhà trường ở trường Đại học Khoa học Tự nhiên. Hồi đó mình cũng không thích lập trình lắm, mình thích học toán và làm bài tập toán nhiều hơn. Khi mình tiếp xúc về AI, mình cảm thấy là AI phù hợp với cái mình thích hơn cho nên từ đó mình định hướng cho career path sẽ lập trình ít lại. Mình không định hướng làm dev mà mình làm research nhiều hơn là dev. Cứ như vậy cho đến cho đến lúc ra trường cho đến lúc đi làm may mắn là mình vẫn theo đuổi công việc mà mình muốn.

Hiện tại công việc của mình là nghiên cứu về AI thì nó hơi chung chung. Công việc hiện tại của mình tại ở Knorex là AI Researcher, tức là research về NLP, viết tắt của từ natural language processing, hay còn gọi là xử lý ngôn ngữ tự nhiên. Các bài toán ví dụ có thể kể đến, như google translate: nó sẽ làm cho máy có thể hiểu được ngôn ngữ con người. Mình chủ yếu làm về mảng NLP nhiều hơn so với các mảng khác của AI, như computer vision hoặc là xử lý âm thanh.

Những kinh nghiệm khi theo đuổi ngành AI Reseacher

Theo anh thì học AI có khó không và một bạn sinh viên cần chuẩn bị gì để học tốt AI?

Thực ra thì đối với mình thì không riêng gì AI, mỗi ngành đều có cái khó riêng. Đối với AI thì cần chuẩn bị kỹ càng, có nền tảng toán vững chắc. Toán ở đây cũng khá là rộng cho nên là mình có thể recommend cho các bạn những thứ toán có thể chuẩn bị cho AI đó là calculus và linear algebra: đại số tuyến tính và giải tích. Khi bạn học AI sẽ liên quan đến 2 thứ này nhiều nhất, ngoài ra các bạn cũng cần kiến thức tí xíu về lập trình nữa. Theo kinh nghiệm của mình học lập trình để học được AI, mình không cần đi quá sâu về thuật toán và mà chỉ cần biết lập trình cơ bản. Ngôn ngữ lập trình ở đây mình recommend các bạn chọn python làm ngôn ngữ lập trình các bạn bắt đầu học về AI.

AI Reasearcher

Nếu đã có background là developer thì làm thế nào trở thành một AI researcher?

Mình cũng không phải là một developer đúng nghĩa. Mình thì chủ yếu tập trung vào research cho nên theo mình, để các bạn dev trở thành một AI researcher các bạn có rất là nhiều tiềm năng để có thể chuyển hướng qua ngành research hơn là những bạn khác. Tại vì các bạn đã có base lập trình sẵn cộng với tư duy logic nữa, thì điều kiện đủ để các bạn cần phải thêm vô cái kỹ năng của mình đó là các bạn cần phải có thói quen đọc nhiều. Đối với việc research, các bạn cần phải đọc nhiều, nhất là các bài báo khoa học (hay còn gọi là paper). Nếu kiên nhẫn và tích lũy kiến thức thì AI Researcher không phải là mục đích quá khó.

Đối với anh thì đâu là giải pháp tiếp thu nhanh những thuật toán trong quá trình học Machine Learning (ML)?

Đối với bản thân mình, trong giai đoạn đầu mình học về ML, Deep Learning (DL), mình cũng khá là sợ vì rất là nhiều công thức mình không hiểu gì cả. Cách mà mình để hiểu nó nhanh thì thật ra mình không có, nhưng mà mình biết cách để mà hiểu nó trước. Đôi khi một công thức trong một thuật toán bất kỳ của ML hay DL nào đó đọc qua tốn khoảng 1-2 tiếng để search về nó, để xem về nó, để hiểu tất cả các ký tự mà nó muốn nói. Thực ra các công thức này là những cái ngắn gọn nhất của một cái idea, một cái mô hình mà người ta muốn viết. Để ngắn gọn, người ta phải viết ra công thức. Từ đó khi mình đọc các công thức khó hiểu là chuyện đương nhiên và để hiểu nó thì mình phải làm cho nó phức tạp hơn. 

Ví dụ như khi mình học lớp 12 thì khi mà đưa ra công thức thì các bạn không muốn nhìn nó chút nào hết. Nhưng các bạn thích làm bài tập hơn, vì khi làm bài tập mình cảm thấy mình hiểu nó. Đó là kiểu phức tạp hóa vấn đề theo hướng tích cực. Tức là tất cả các bài tập đều áp dụng 1 công thức, mục tiêu của nó là phức tạp hóa vấn đề và để cho con người có thể hiểu công thức đó dưới dạng từng trường hợp một. Khi lên đại học và học AI, các bạn nhìn vô công thức các bạn sợ thì cứ thử học AI như cách các bạn học toán cấp 3. Tức là các bạn phải lấy giấy ra, lấy viết ra và ghi lên giấy những cái mình thử tính bằng tay từng cái một thì các bạn sẽ hiểu được công thức đó sẽ trở nên nhanh chóng.

Mình có 1 câu nói của thầy mình hồi trước – thầy Lê Hoài Bắc ở ĐH KHTN “Cái mà tụi em cần nhất đó là không phải các em lập trình đc trên máy tính khi các em học về AI, về ML. Cái các em cần nhất đó là khi các em chỉ có một cây viết, một tờ giấy, các em có thể viết được mô hình, làm được mô hình, biết được máy chạy ra con số gì trên giấy thì khi đó các em sẽ thành công. chứ k hẳn là mình sẽ ngồi lập trình trên máy ra được số thì tại vì vấn đề ở đây là khi các bạn làm về AI, có rất nhiều thư viện hỗ trợ sẵn, các bạn không cần phải làm gì nhiều. Đôi khi các bạn không cần phải hiểu nó chạy cái gì bên trong. Nó hoàn toàn là một hộp đen nhưng các bạn sẽ hoàn toàn thành công. Mình nghĩ câu đó của thầy rất là đúng và nó có rất nhiều impact cho mình trong quá trình học tập cũng như làm việc về AI.

Là lecturer tại Viet.AI, anh nhận thấy những bạn học trái ngành có thể học AI (researcher) không?

AI Reasearcher

Theo mình, tất cả những bạn học trái ngành đều có cơ hội trở thành 1 AI researcher, tương đồng với tất cả mọi người. Không phải là các bạn học về cơ khí sẽ có riêng về cơ khí, sẽ khó khăn hơn cho các bạn thì điều đó là không đúng. Tại vì có những ví dụ ở trong lớp Viet.AI mình đứng lớp dạy, những khóa trước mình đã gặp được những bạn đến từ những ngành khác nhau ví dụ ngành kinh tế, ngành cơ khí và hiện tại các bạn đang là bác sĩ nữa thì các bạn vẫn có base khá là ok. Đúng là dù các bạn không có thể nào lập trình hoàn toàn tốt như các bạn dev được nhưng các bạn có 1 cái kiến thức riêng về chuyên ngành các bạn thì các bạn có thể adopt AI, như là AI cho healthcare, hay AI cho cơ khí gì đó thì vì những người trái ngành như vậy làm cho cái việc học tập và phát triển AI ở Việt Nam ngày càng được đa dạng hóa hơn rất là nhiều. Mình không nghĩ các bạn đó gặp khó khăn nhiều hơn so với anh em dev khi bắt đầu học về ai.

AI Reasearcher

AI là thuật ngữ rất rộng, vậy có thể chia nhỏ các lĩnh vực của AI không?

AI có thể phân chia thành nhiều lĩnh vực nhỏ khác nhau. Sơ khởi nhất các bạn có thể nghĩ đến việc AI có thể xử lý được ngôn ngữ con người – NLP. Lĩnh vực thứ 2 là xử lý ảnh Computer Vision, chủ yếu tập trung đầu vào là ảnh và đầu ra là phân lớp, ví dụ con chó con mèo cái nhà chẳng hạn thì nó thuộc về CV. Mảng thứ 3 mình nghĩ có thể nhắc đến là Sound Processing. Như các bạn biết bài toán chị Google đặt ra là Text to speech – input là chữ, output là giọng nói hoặc ngược lại là speech to text thì cái đó là lĩnh vực xử lý âm thanh. Khi mà mình chia thành những lĩnh vực nhỏ như vậy, mình đang dựa trên ứng dụng mình chia. Ngoài ra nói về mặt các dạng mô hình thì mình có thể chia AI ra thành các dạng khác. Đầu tiên mình có thể nhắc tới Supervisor learning là học cái giám sát. Tức là khi mình đưa cái dữ liệu đầu vào trong cái máy học thì mình sẽ chỉ ra rõ đâu là con chó, đâu là con mèo để máy có thể biết được đó là những cái mình cần phải học. Thứ 2 là unsupervised learning – học không có giám sát, tức là mình đưa dữ liệu vào cho máy và máy sẽ phân loại ra những cái nó cho là khác nhau. Ví dụ mình đưa vào 2 loại là bút bi và bút chì, mình đưa rất nhiều hình ảnh cho máy và mình bắt máy phải phân ra 2 bên thì mình expect là máy sẽ phân ra bút bi, bút chì mà không đưa 1 cái label nào cho máy hết. Ngoài ra còn có những lĩnh vực khác như là reinforcement learning – học tăng cường. Nó được áp dụng cho lĩnh vực xe tự động rất là nhiều.

Anh có thể chia sẻ rõ hơn về ứng dụng NLP mà anh đang nghiên cứu, anh mong muốn sẽ đạt được kết quả gì?

Đối với ứng dụng NLP thì mình sửa lỗi chính tả, dịch máy (machine translation) ví dụ như google translate, text summarization – tóm tắt văn bản, input văn bản dài và output văn bản đã được tóm tắt bởi máy.

Riêng đối với bản thân mình khi làm việc tại Knorex thì bài toán mà mình tập trung nhất đó là bài toán text classification – phân loại văn bản. Mình muốn máy có thể học được văn bản đó đang nói tới chủ đề gì (vd: sport, du lịch,…) thì đầu vào là văn bản và đầu ra là label, topic của văn bản đó đang nói về điều gì. Ngoài ra mình còn làm những bài toán khác vd language detection – đầu vào là văn bản và đầu ra biết cái ngôn ngữ đó thuộc tiếng anh, tiếng việt, tiếng TBN chẳng hạn. Đó cũng là 1 bài toán của NLP

AI và những ứng dụng trong thực tế

Vậy theo anh đâu là sự khác biệt giữa AI và ML?

Thuật ngữ AI được sử dụng nhiều hơn còn ML đôi khi một số bạn cũng không biết rõ do không học trong ngành ngày.

Sự khác nhau rất rõ rệt đó là: AI là cha của ML, ML là tập con của AI. Khi nhắc đến AI thì mọi người nghĩ ngay đến cái gì đó rất là to, thông minh. Thì AI chung lại là những cách làm cho ML có thể thông minh hơn. Mình có thể code cứng luôn. Gặp trường hợp A thì nó gọi là A gặp trường hợp B trả lời B, những cái code cứng như vậy vẫn là AI. Mình sẽ đưa những cái luật để máy hiểu đc rồi trả về mà k cần học gì thì đó vẫn là AI.

ML là tập con AI nhưng nó không phải là code luật, không phải là if-else nữa mà nó sẽ kiểu đưa dữ liệu vào cho máy và máy sẽ tự động học và sau đó nó sẽ dựa trên những dữ liệu đó và trả lời câu hỏi người dùng dựa trên dữ liệu mình đưa.

ML cần dữ liệu nhiều hơn và mình thấy cái quan trọng của ML nằm ở dữ liệu. Mình không cần phải ngồi code if-else liên tục mấy trăm mấy ngàn dòng nữa để máy có thể thông minh hơn mà mình chỉ cần huấn luyện máy dựa trên dữ liệu mình tìm được. Nó tiết kiệm rất nhiều thời gian và hiện tại nó cũng đang là xu hướng.

Trong ML lại có một cái term khác là Deep Learning. Deep learning lại là tập con của ML. Deep learning sẽ nói về những cái neural network, sẽ có rất nhiều lớp sâu thiệt sâu và hơi chuyên ngành cho nên là mình chỉ nhắc sơ qua thôi.

Theo nhận xét của mình, anh có cảm thấy AI đang bị tâng bốc quá hay không?

Mình cũng cảm thấy 1 phần AI rất trendy. Thật ra lúc học năm nhất năm hai đại học, mình cũng không nghĩ nó sẽ trở nên trendy như vậy ở thời điểm hiện tại. Mình học chỉ vì mình thích nó thôi.

Mình cũng biết 1 nhãn hàng – không tiện nói tên, họ sử dụng keyword AI trong bài Thông cáo báo chí (TCBC) thì cái TCBC của họ được share rất là nhiều. Những nhà báo tò mò và đến với họ rất là nhiều. Họ sử dụng AI như thể là một keyword chứng tỏ là họ đang đi theo cái trend hiện tại. Và mình cũng hiểu tại sao lại có trend như hiện tại vì nó đem lại rất nhiều lợi ích cho user, nó cũng khá là thú vị. Mình nghĩ sự tâng bốc này có thể giải thích được và không có gì gọi là negative impact – ảnh hưởng tiêu cực nào cho tụi mình hết vì tụi mình cũng vui khi biết ah hiện tại AI cũng rất là hot.

Tại sao một số startup lại tuyên bố là họ sử dụng AI trong sản phẩm? Liệu có phải là chiêu trò marketing?

Thực ra có rất nhiều trường hợp.

Có thể họ không cần phải build full squad một cái API của họ. Tức là họ không cần phải build từ đầu tới cuối để cho sản phẩm  có AI mà có thể sử dụng nền tảng AI của bên thứ 3 để adopt cho sản phẩm của họ. Trường hợp này họ không cần làm gì cả, họ chỉ cần bỏ tiền ra để mua API của bên thứ 3 ví dụ như IBM. Điều đó không có gì sai cả, miễn là sản phẩm của họ có thể đưa ra những lợi ích nhất định cho ng dùng.

Tuy nhiên, mình vẫn muốn là khi mà nói về AI trong sản phẩm thì mình vẫn nên build full squad. Nếu như có chỉnh sửa trong quá trình phát triển sản phẩm thì mình có thể 100% làm được chuyện đó.

Quay trở lại câu hỏi trong việc họ có sử dụng AI hay không thì anh cũng không chắc là họ có sử dụng. Tuy nhiên nếu mà có thì mình vẫn có thể tin được vì họ có thể mua bên thứ 3 hoặc tạo full squad thì mình cũng không thể biết.

Khó khăn doanh nghiệp gặp khi áp dụng AI vào sản phẩm là gì?

Đầu tiên, tại sao phải sử dụng AI mà không phải những kỹ thuật khác?

Đôi khi họ muốn adopt AI vào những mặt khác của business là một chuyện khác. Tuy nhiên, cái đầu tiên mà mình nghĩ khá quan trọng là nếu doanh nghiệp có thể sử dụng những kỹ thuật khác mà vẫn có thể giải quyết bài toán thì họ nên sử dụng những kỹ thuật ấy, không nên sử dụng AI.

Thứ 2, nếu build AI từ đầu đến cuối, cái khó khăn ở đây chính là khi sản phẩm scale up, ai có hỗ trợ được không? Có đủ nhanh không?

Hiện tại, những kỹ thuật của AI rất phát triển. Họ cần rất nhiều computational resources để thực hiện những bài toán như vậy. Các bài toán về AI rất phức tạp, cần rất nhiều computational resources và các doanh nghiệp nhỏ không đủ để đáp ứng được.

Nếu doanh nghiệp nhỏ khọng đáp ứng được các resource thì câu nói “AI là cuộc chơi cho những ông lớn”  liệu có đúng?

Mình nghĩ nó đúng 1 phần. Vì hiện tại, tất cả các mô hình AI đưa ra những kết quả đúng, chính xác nhất hiện tại thường được đề cử bởi những ông lớn. Những thứ gọi là “state obvious”. Việt Nam mình chưa có đủ điều kiện tự propose một cái mô hình. Bởi vì ở Google có rất nhiều computational resource, rất nhiều máy CPU để huấn luyện mô hình, rất nhiều điều kiện để phát triển nghiên cứu. Thì đối với câu “sân chơi của những ông lớn” đúng nghĩa là họ đưa ra những cái mới và mình xài những cái mới của họ. Sân chơi ở đây là sân chơi research nhưng mà nó không đúng ở phần khi áp dụng nó vào sản phẩm. Đối với việc ứng dụng những sản phẩm của Google, Facebook thì nó vẫn là sân chơi của mình. Ví dụ có những sản phẩm của Google, Facebook không thực sự adopt cho thị trường Việt. Vẫn còn những con hẻm nhỏ, sân chơi, đất diễn cho doanh nghiệp Việt, họ sẽ cố gắng lấy những mô hình propose bởi Google hay Facebook, họ đọc hiểu và ứng dụng cho bài toán ở doanh nghiệp việt. Thì đó vẫn là sân chơi của mình!

Lời khuyên để “tồn tại” trong lĩnh vực

Theo kinh nghiệm của mình, anh có thấy quá trình phỏng vấn DEV với một AI researcher có khác nhau không?

Thực sự mình chưa có cơ hội phỏng vấn ở vị trí dev, nhưng mình cũng xin chia sẻ một ít. Khi mà mình join 1 team, quá trình phỏng vấn cũng diễn ra tương tự. Bạn vẫn có bài test cho bạn. Điều khác nhau là kiến thức thôi. Đầu tiên họ sẽ check về kiến thức AI của bạn là bao nhiêu. Tiếp theo mà AI researcher phải có chính là kỹ năng nghiên cứu – research. Tức là bạn cần có kỹ năng đọc hiểu bài báo khoa học để ứng dụng kiến thức của bài báo để giải quyết bài toán của công ty. Thì đó là cái cần thiết nhất bạn cần phải có để xin việc.

Anh có thể chia sẻ lời khuyên để CV của bạn nổi bật phỏng vấn vị trí AI Researcher.

Đầu tiên bạn phải có một vài project nho nhỏ về AI để show cho nhà tuyển dụng biết bạn đã có làm việc về Ai ít nhiều rồi. Bạn sẽ show cho họ biết những thư viện nào bạn đã học rồi.

Thứ 2, bạn có thể đưa đường dẫn repository của các bạn vô. Hiện tại các nhà tuyển dụng rất quan trọng việc bạn đã có đóng góp gì cho cộng đồng, nhất là công việc AI researcher.

Thứ 3, mình nghĩ hơi khó đó là các bạn hãy làm research, viết paper gửi về các hội nghị về AI. Thì khi các bạn có một cái bài báo các bạn nhận đang tải thì đó là một điều rất tuyệt vời cho CV của bạn.

Khi làm việc về AI, anh có những kỷ niệm đáng nhớ nào?

Hiện tại, ở Knorex thì mình có một bài toán khác không liên quan NLP, may mắn mình cũng là project holder cho dự án. Đó là dự án brand safety. Cụ thể là làm sao mình biết trang web user đang connect có phải trang web 18+ không. Mục tiêu cuối cùng của việc detect là để các brand sẽ không phải đặt quảng cáo của mình trên những trang web đó.

Bài toán: input web => output có phải web 18+ không?

Để làm được chuyện đó mình phải thu thập dữ liệu về để train một cái model sao có thể detect được đâu là ảnh bình thường, đâu là ảnh 18+. Thì mình phải lấy rất nhiều ảnh 18+ về máy, sau đó gắn nhãn đâu là ảnh 18 đâu là ảnh bình thường. Đôi khi mình hay bị đồng nghiệp chọc đó là Đại vô công ty vừa được coi hình 18+ còn được trả tiền nữa thì đó là một kỷ niệm khá lạ và vui.

Nhưng mà mình không sướng như các bạn nghĩ. Đôi khi có những trang web sensitive khác 18+ liên quan máu me, những hình ảnh gore thì những thứ này mình cũng phải làm và đôi khi thì mình không ăn nổi do mình coi những hình ảnh đó nhiều quá.

Xin cảm ơn phần chia sẻ rất mới mẻ về AI cũng như về lộ trình trở thành AI Researcher từ anh. Hãy cùng đón đọc “Chuyên gia nói” tại TopDev để không bỏ lỡ bất kỳ bài phỏng vấn chuyên sâu từ các chuyên gia công nghệ nào tại Việt Nam nhé.

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

Lời kêu gọi lập trình viên Việt Nam cùng chung tay đẩy lùi Covid-19

Ngoài hơn 900 kỹ sư công nghệ thông tin đang tham gia trên các mặt trận, nhóm thông tin phản ứng nhanh chống dịch covid-19 của ban chỉ đạo quốc gia cần khẩn cấp theo thứ tự các vị trí tech quan trọng, các bạn làm trong lĩnh vực công nghệ – lập trình có thể tham khảo phía dưới các danh sách mà các đơn vị chống dịch đang cần gấp và cân nhắc tham gia nhé, Việt nam đang cần chúng ta.

1. Ban Chỉ đạo Quốc gia chống dịch
2️⃣ Open Street Map Engineers (3+ năm kinh nghiệm)
2️⃣ Big Data Engineer có kinh nghiệm về Public Health Data
2️⃣ Hadoop Engineers (3+ năm kinh nghiệm)
1️⃣ Project Managers ((5+ năm kinh nghiệm)
2️⃣ Java Engineer (3+ năm kinh nghiệm)
2️⃣ Documentor ((3+ năm kinh nghiệm)
👉 Làm việc tại Hà nội
👉 Đầu mối liên hệ anh Trung Nguyen

2. Bộ Y tế
👩‍💻👨‍💻Chuyên gia Dịch tễ & Thống kê để tham gia nhóm xây dựng và Vận hành mô hình dự báo dịch
👉 Có thể tham gia từ xa
👉 Đầu mối liên hệ anh Duc Anh Ha.

Mọi người có thể chia sẻ và giới thiệu bạn bè để cùng chung tay đẩy lùi dịch bệnh nhé!

Hằng và biến trong Swift

 Trong bài này, chúng ta sẽ tìm hiểu những kiến thức cơ bản về biến số (Variable) và Hằng số (constants) trong Swift. Và cùng xem xét các hằng số(constants) tại sao chúng được khuyến khích dùng nhiều. Chúng ta bắt đầu tạo mới một playgrounds cho bài viết này, sử dụng nó chính là một cách tuyệt vời để học cú pháp và hiểu các khái niệm cơ bản của Swift. Chạy Xcode 9, tạo mới một playground bằng cách chọn: New-> Playground… từ menu File của Xcode, sau đó nhập tên cho playground và chọn nền tảng iOS, chọn Next, Xong chúng ta bắt đầu code nào.

Biến số(Variables)

Khai báo biến số

Trong Swift, chúng ta sử dụng từ khóa var để khai báo một biến số. Nó cũng tương tự như việc khai báo một biến trong các ngôn ngữ khác vậy, nhưng tôi khuyên bạn không nên nghĩ tới cách khai báo của ngôn ngữ lập trình khác khi sử dụng từ khóa var trong Swift. Vì có một vài sự khác biệt quan trọng ở đây. Từ khóa var là cách duy nhất để khai báo một biến số trong Swift.Từ khóa var được sử dụng phổ biến trong việc khai bào biến và gán giá trị cho biến.

var blogName= “Tự học Swift 5 cùng với cafedevn”

Và chúng ta hãy nhớ một điều là không nên sử dụng dấu (semicolon) sau khi kết thúc một dòng code, mặc dù có thể dùng dấu(semicolon), nhưng trường hợp nào bắt buộc dùng thì chúng ta mới dùng. Bạn có thể để ý biến blogName không có mô tả kiểu dữ liệu khi khai báo biến đó, đó chính là một tính năng của Swift khi khai báo biến, gọi là tính tự suy luận (Inference) kiểu dữ liệu.

Kiểu tự suy luận(Type inference)

Trong ví dụ trên ta thấy biến blogName được gán với trị “Tự học Swift 5 cùng với cafedevn”, Ở đây nếu bạn là một người mới học hoặc đã từ dùng JavaScript hoặc PHP, khi đó bạn sẽ nghĩ Swift là ngôn ngữ không bình thường và lỏng lẻo nhưng sự thât không phải vậy. Hãy để tôi nhắc lại cho bạn rằng Swift là ngôn ngữ để lập trình mạnh và an toàn.

Chúng ta mới bắt đầu và Swift đã cho thấy một vài điều kỳ diệu ở đây. Mặc dùng ví dụ trên không chỉ rõ kiểu dữ liệu nào nhưng biến blogName được hiểu với kiểu là String,  đó là kiểu tự suy luận(Type Inference) trong Swift.Giá trị gán cho biến blogName là kiểu String và Swift đủ thông minh để biết được, sau đó chỉ định ngầm biến đó kiểu String.

Ngoài ra chúng ta có thể khai báo một biến tương tự ví dụ trên nhưng theo kiểu tường mình hơn như sau:

var blogName= “Tự học Swift 5 cùng với cafedevn”

Swift yêu cầu bạn phải rõ ràng hoặc ngầm chỉ định kiểu dữ liệu cho biến(Varliable) hay hằng số(constants), nếu không Xcode sẽ thông báo lỗi “Bạn thiếu kiểu dữ liệu cho biến” nếu bạn khai báo như sau:

var number

Để fix lỗi trên thì chúng ta có 2 cách, một là khai báo biến với kiểu tường mình, hai là khai báo và gán cho biến một giá trị cụ thể nào đó.

var number: String
var number = “10”

Thay đổi kiểu dữ liệu

Bạn có thể xem ví dụ bên dưới việc gán mới một trị mới và rất bình thường, chẳng có gì khác biệt.

var blogName : String = “Tự học Swift 5”
var number: String
blogName = “Tự học Swift 5.0000”
number = “10”

Nếu chúng ta gán kiểu số vào biến number, Xcode sẽ thông báo lỗi, rằng chúng ta không thể gán kiểu Int cho biến kiểu String, Đây là một vấn đề lớn của ngôn ngữ lỏng lẻo, nhưng đây là Swift. Swift là ngôn ngữ khá mạnh và an toàn, nên mỗi biến sẽ có một kiểu dữ liệu riêng và chúng ta không thể thay đổi kiểu được.

Vậy để thoát khỏi lỗi đó, thì chúng ta cần phải mô tả lại kiểu cho biến number thành Int như sau:

var blogName : String = “Tự học Swift 5”
var number: Int
blogName = “Cùng học Swift 5.0000”
number = 10

Điều quan trọng, chúng ta phải biết khi khai báo biến trong Swift, chúng ta không cần mô tả tường mình kiểu dữ liệu cho biến hoặc hằng số và mỗi biến hoặc hằng chỉ có một kiểu dữ liệu nhất định, không thể thay đổi kiểu dữ liệu đó.

Hằng số(Constans)

Hằng số(constants) cũng giống như biến số, nhưng nó chỉ có một sự khác biệt duy nhất là không thể thay đổi được giá trị. Giá trị là một hằng số và không thay đổi.

Khai báo hằng số

Để khai báo một hằng số, bạn sẽ dùng từ khóa let. Hãy nhìn vào ví dụ bên dưới, chúng ta sẽ khai báo biến street thay vì dùng var thì chúng ta dùng let.

let blogName : String = “Tự học Swift 5”
var number: Int
blogName = “Cùng tự học Swift 5.0000”
number = 10

Nếu chúng ta chỉ cập nhật dòng đầu tiên var thành let thì Xcode sẽ thông báo lỗi là hằng số thì không thể đổi giá trị. Chúng ta sẽ fix như sau:

let blogName : String = “Tự học Swift 5”
var number: Int
blogName = “Cùng tự học Swift 5.0000”
number = 10

Sử dụng

Tôi hy vọng bạn sẽ đồng ý rằng việc khai báo một hằng số trong Swift thật đơn giản, ở đây không cần các từ khóa rắc rối và phức tạp, cũng như dễ dàng khai báo một biến số vậy.

Việc sử dụng hằng số trong Swift được khuyến khích. Nếu một giá trị không thay đổi hoặc bạn không thay đổi trị khi xử lý, khi đó chúng ta nên dùng hằng số. Đây là một điểm lợi, một điểm lợi trong hiệu suất, nhưng quan trọng hơn là lợi về sự an toàn. Bằng cách dùng biến hằng số ở bất cứ đâu có thể dùng, chỉ cần nó là hằng số thì biến đó sẽ được an toàn, vì trị không bao giờ thay đổi.

In (Print)

Vậy để xem kết quả, hiển thị kết quả ra màn hình console thì chúng ta nên dùng lệnh nào?, Trong Swift, có hỗ trợ hàm print(..) nó cũng tương tự như hàm NSLog() trong Objective-C.

Ví dụ:

var string = “this is a string”
let constant = 3.14
print(string)
print(constant)
print(10 * 50)
print(“Tự học Swift 5.0”)

Hoặc dùng cú pháp \() trong hàm print để hỗ trợ in trị của biến ra console:

Ví dụ:

let blogName = “Tự học Swift 5.0”
let number = 10
print(“Hãy cũng học và chia sẽ tại Blog: \(blogName ) \(number).”)

Biến và hằng là một trong nhưng kiến thức cơ bản mà bạn cần phải nắm thật kỹ khi học và sử dụng ngôn ngữ Swift cũng như các ngôn ngữ lập trình khác, Mặc dù phải mất một ít thời gian để nắm rõ về hằng và biến, một khi bạn đã thực hành tốt nó rồi thì chắc chắn một điều là code của bạn sẽ an toàn và đơn giản để dễ hiểu hơn nhiều. Trong các bài viết tiếp theo chúng ta sẽ tìm hiểu cùng  với nhau về hàm(Function) trong Swift.

TopDev via CafeDev

Xem thêm việc làm mới nhất về code swift cho bạn

10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết

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

Nhớ thời đại học quá nên ôn lại kiến thức vỡ lòng mấy bạn ơi

Nếu bạn là người theo chủ nghĩa viết code sao cho chạy được là đủ, bạn không nên đọc bài này. Còn mục tiêu là viết code và đặt cái tâm vào những gì mình viết ra thì bạn nên biết các nguyên tắc nền tảng này.

KISS

Nguyên tắc Keep it simple, stupid được áp dụng cho rất nhiều thứ trong cuộc sống, rất cần thiết cho các dự án từ vừa tới lớn.

Từ lúc bắt đầu code những dòng đầu tiên, chúng ta phải khắc cốt ghi tâm câu đơn giản nhất có thể, code càng phức tạp càng khó viết và đọc lại, càng có khả năng phát sinh bug, càng khó chỉnh sửa sau này. Cụ Antoine de Saint-Exupery có phán câu này:

Hoàn hảo không phải là khi không còn gì để thêm vào nữa, mà là không còn gì có thể bỏ bớt

DRY

Nguyên tắc vàng mà chúng ta nghe mãi nghe mãi. Don’t repeat yourself, không bao giờ để chuyện code chổ này giống hệt chổ kia, copy-paste một đoạn code ở nhiều chổ trong source. Nếu thấy một đoạn code mà cứ viết đi viết lại ở nhiều nơi trong source, người ta sẽ đánh giá trình bạn còn non và xanh lắm

Up up mở mở (Open/Closed)

Biết có thể viết thêm các tính năng bổ sung thoải mái, nhưng không được chỉnh sửa core chính. Cái này có thể lấy ví dụ bạn lấy những package trên npm, nó nằm trong node_modules, sẽ không được chỉnh sửa gì ở đó hết, nếu lỡ sau này người ta update lên, là bạn phải tự cập nhập thủ công nhé.

Hợp thể sẽ mạnh hơn được buff (Composition > Inheritance)

10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết

Nếu bạn có xem 5 anh em siêu nhân bạn sẽ hiểu, nếu 5 anh em siêu nhân mà hợp thể lại sẽ tạo ra một con robot với sức mạnh vượt bật, đánh bại mọi cả thể yêu quái, dù nó được buff rất nhiều đồ chơi để tăng dame.

Cái này có ví dụ cho anh em nào viết OOP, mà mình thì không rành OOP lắm, nên anh em tự tìm ví dụ nhé.

Ai làm việc nấy (Single Responsibility)

Mỗi function chỉ thực hiện một nhiệm vụ duy nhất, không ôm đồm nhiều thứ cùng lúc.

Nếu xác định ra đường là đi ăn cơm, thì ăn cơm rồi về, không có sẵn tiền mua thêm bịch chè, ly trà sữa hay vài trứng vịt lộn.

Bớt quan tâm con gái nhà hàng xóm (Separation of Concerns)

Cũng tương tự với ai làm việc nấy, nguyên tắc này có phần trừu tượng, khái quát hơn một chút.

Lấy ví dụ quan hệ trai-gái, để có thể quen một lúc 3 cô, bạn cần lập 3 tài khoản Zalo khác nhau, trên 3 cái điện thoại khác nhau, để khi đi chơi với cô nào thì không bị phát hiện mấy cô kia, đừng dùng 1 tài khoản trên 1 điện thoại mà chat với cả 3 cô cùng lúc.

Lấy ví dụ trong nghề lập trình nó là mô hình thiết kế MVC, còn trong nghề React nó là khái niệm Container và Presentation component. Nhưng anh em cứ nhớ ví dụ 3 cô gái cho dễ.

10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết

Bạn là lập trình viên không phải thầy bói (YAGNI – you aren’t gonna need it)

Nguyên tắc này nó nói là, bạn đừng viết ra những hàm mà bạn nghĩ, “ờ, có lẽ trong tương lai chúng ta sớm muộn cũng xài tới nó”. Cái gì cần thì viết, có sao lại viết trước?

Ví dụ, bạn viết sẵn một số lớp abstract và generic để tránh trùng lặp code, mà quá nhiều lớp abstract dẫn đến hậu quả không thể nào mà bảo trì nổi. Nói chung để đảm bảo nguyên tắc DRY, bạn cứ viết trước đi, nếu thấy bị trùng, thầy refactor lại, như ông bà có câu cứ có trâu rồi hả mua chuồng

Tối ưu hóa quá sớm (Avoid Premature Optimization)

Nếu bạn có xu hướng tối ưu các giải thuật được viết ra ngay từ đầu, vấn đề ở chỗ là bạn không thể biết được chương trình sẽ bị nghẽn cổ chai ở đâu cho đến khi có dữ liệu thực tế. Bạn có thể phỏng đoán, tất nhiên là được mà đôi khi hên hên lại đúng. Chỉ có một điều dễ thấy là bạn sẽ bỏ ra không ít thời gian để tăng tốc cho hàm đó, mà thiệt ra nó không chậm tới mức như bạn nghĩ, hoặc mức độ user sử dụng hàm đó sẽ không nhiều.

Hoàn thành những vấn đề mấu chốt trước, sau đó dò lại để biết đang bị thắt cổ chai ở đâu

Refactor, rồi lại Refactor, rồi lại Refactor

Sự thật ai cũng biết là khi bạn mới bắt đầu viết, thời gian sau nhìn lại, khi đã có cái nhìn cụ thể và rõ ràng hơn những gì mình đang làm trong dự án, bạn sẽ code trước đây mình viết thật sự chưa “ngon”. Công việc refactor là rất bình thường. Nếu bạn đang có việc cần thay đổi hoặc kiểm tra code cũ, nếu được thì cứ dọn dẹp một tí trước khi đi.

Thà anh code sạch, chứ anh không cần code cho cao siêu (Clean Code > Clever Code)

Nói về clean code, là phải bỏ đi cái tôi to bự sang một bên, đừng bao giờ nghĩ code thế cho ngầu, code mà để bạn khoe với thiên hạ rằng cách code của tôi mới thông minh hơn.

Ví dụ dễ thấy, một số thanh niên mình từng làm việc chung rất thích dùng câu điều kiện trên một dòng, anh ấy cứ && || && || && các kiểu trên một dòng, ai mà vô đọc thì chỉ có kiếm ảnh để nhờ giải thích là đang muốn làm cái gì.

Tổng kết

9 người thì 10 ý, nếu đi hỏi 9 người với câu hỏi “Thế nào được gọi là một lập trình viên tốt”, thì chắc nhận được không ít sự khác nhau về quan điểm, mà đôi khi còn trái chiều với nhau nữa.

Bạn thấy ý kiến này thế nào, một lập trình viên giỏi là người biết mình đang phục vụ người dùng cuối, người có thể làm việc hiệu quả với đồng đội, người có thể hoàn thành công việc được giao đúng yêu cầu, đúng tiến độ.

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

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

6 giải pháp công nghệ hữu ích cho phòng nhân sự của bạn

Rất ít bộ phận giải quyết nhiều nhiệm vụ hoặc quản lý nhiều thông tin như ngành nhân sự. Công nghệ hỗ trợ thực hiện các nhiệm vụ về tuyển dụng, tính lương và đánh giá hiệu suất, đồng thời cho phép các nhân viên nhân sự làm việc tốt hơn với nhân viên của công ty mình.

Dưới đây là sáu công cụ công nghệ về nhân sự mà bất kỳ doanh nghiệp thuộc mọi quy mô có thể có thực hiện nhằm xây dựng nguồn nhân sự dồi dào và phát triển tổ chức tốt hơn.

1. HRMS (Hệ thống quản lý nguồn nhân lực) hoặc HRIS (Hệ thống thông tin nguồn nhân lực)

Bộ phận nhân sự có rất nhiều thông tin để nhập, lưu trữ và theo dõi. Phương pháp phổ biến nhất để tổ chức thông tin này là thiết lập một hệ thống quản lý nguồn nhân lực toàn diện (HRMS).

Dù cho đó là giải pháp phần mềm hay phần mềm dưới dạng dịch vụ, HRMS có thể là người bạn tốt nhất về mặt nhân sự. Nó lưu trữ và tổ chức dữ liệu, ví dụ như hồ sơ nhân viên, lịch trình, hồ sơ tham dự và nhiều hơn nữa.

Các hệ thống thông tin nguồn nhân lực (HRIS) thường là các giải pháp dựa trên nguồn dữ liệu, cho phép bạn tạo ra các báo cáo chuyên sâu nhằm mục đích kiểm toán.

Phần lớn các dịch vụ HRMS, như PaychexWorkday, chúng hoạt động như nền tảng trung tâm của HR và thường dưới hình thức các mô-đun hoặc tích hợp cho phép người dùng truy cập các dịch vụ trả lương, quản lý lợi ích và đánh giá hiệu suất.

2. Giải pháp về hiệu suất

Các đánh giá và theo dõi về hiệu suất không chỉ là cuộc họp thường niên giữa người giám sát và nhân viên, mà còn được thể hiện thông qua việc các mục tiêu được thảo luận trong cuộc họp đó cần được xem xét lại trong suốt quá trình bởi HR. Để đánh giá hiệu suất và xây dựng mục tiêu tốt hơn cho từng nhân viên, HR có thể cung cấp cho người quản lý các công cụ giúp theo dõi hiệu suất của nhân viên trong suốt cả năm, lưu các ghi chú và phản hồi để chuẩn bị đánh giá cho cả người quản lý và nhân viên. Nhiều giải pháp HRMS và bảng lương, chẳng hạn như ADP, đi kèm với một mô-đun đánh giá hiệu suất tùy chỉnh.

3. Phần mềm tuyển dụng

Đúng như tên gọi, phần mềm tuyển dụng giúp hợp thức hóa quy trình tuyển dụng. Bạn có thể đăng quảng cáo việc làm, sắp xếp và thực hiện các ứng dụng, quản lý ứng viên và nhiều hơn thế, giúp tiết kiệm cho bạn những rắc rối phát sinh khi tự mình giải quyết mọi thứ.

Đối với các doanh nghiệp nhỏ (có tính riêng biệt), bạn nên kiểm tra giá cả và tính năng cho từng giải pháp đang được xem xét: Nhiều chương trình tuyển dụng nhằm hướng tới các công ty lớn hơn với số lượng đơn ứng tuyển lớn. Tùy thuộc vào quy mô, định hướng mà các doanh nghiệp nhỏ hơn cũng có thể đáp ứng những nhu cầu tuyển dụng khác nhau. Bạn có thể kiểm tra những tin tức kinh doanh và tham khảo những phần mềm tuyển dụng tốt nhất tại đây.

  KPI là gì? 5 bước xây dựng KPI hiệu quả

4. Dịch vụ trả lương

Xử lý biên chế là một nhiệm vụ khó khăn. Hãy làm cho nó dễ dàng với chính bạn (và nhân viên kế toán của bạn) bằng cách đầu tư vào một dịch vụ trả lương trực tuyến. Giải pháp này giúp tính toán và theo dõi tiền lương một cách tự động, các khoản khấu trừ, thời gian nghỉ, v.v. Một số thậm chí cho phép bạn nộp thuế lương và báo cáo tuyển dụng mới cho IRS. tiêu đề tuyển dụng

Chúng tôi đã tổng hợp danh sách các dịch vụ trả lương tốt nhất, bạn có thể tham khảo tại đây

5. Nền tảng quản lý lợi ích

Mặc dù một số dịch vụ trả lương cho phép bạn quản lý những lợi ích nhất định, ví dụ như thời gian nghỉ hè, thì một giải pháp tối ưu có thể giúp bạn quản lý tất cả các lợi ích của nhân viên bao gồm thời gian nghỉ, kế hoạch nghỉ hưu, bảo hiểm y tế, bồi thường cho công nhân và các đặc quyền khác.

Chen Amit, Giám đốc điều hành của công ty về những giải pháp thanh toán Tipalti cho biết một trong những quyết định tốt nhất mà ông ta đưa ra đối với công ty là thuê ngoài quản lý lợi ích.

“Nó mang lại cho doanh nghiệp của chúng tôi một cơ sở nền tảng cho các quy trình nhân sự được đảm bảo về tiêu chuẩn, một cái gì đó ít nhất đưa bạn ngang hàng với các tổ chức lớn hơn,” Amit nói. “Và sau đó, chúng tôi có thể tập trung thêm vào các lợi ích và đặc quyền vượt xa tiêu chuẩn nha khoa, sức khỏe, thị lực. Nó cũng làm đơn giản hóa dấu chân hoạt động của chúng tôi.”

Tuy nhiên, một dịch vụ quản lý lợi ích không nhất thiết giống như một tổ chức sử dụng lao động chuyên nghiệp (PEO), hoạt động theo thỏa thuận đồng tuyển dụng. PEO hoạt động như một chủ nhân hợp pháp về lực lượng lao động của bạn, đảm bảo sự tuân thủ trong việc phát hành tiền lương của nhân viên và quản lý lợi ích.

“PEO có thể cung cấp cho bạn quyền truy cập vào các đặc quyền bổ sung, các tùy chọn chăm sóc sức khỏe và chuyên môn thay vì tự mình quản lý mọi thứ”, Jacqueline Breslin, giám đốc dịch vụ vốn nhân lực tại TriNet cho biết. “Những lợi ích này cũng giúp cho việc tuyển dụng vì chúng làm cho bạn trở nên thu hút hơn.”

Để tìm hiểu thêm về PEO và xác định xem đó có phải là lựa chọn phù hợp cho công ty của bạn hay không, hãy đọc PEO nhé! 

 6. Công cụ tham gia của nhân viên

Sự cam kết đồng hành của nhân viên là ưu tiên cao đối với nhiều công ty. Với các công cụ công nghệ ngày nay, bạn có thể theo dõi văn hóa của tổ chức, đồng thời có cái nhìn sâu sắc hơn về những mong muốn của nhân viên mình.

“Tôi đã thấy các ứng dụng khuyến khích những phản hồi tích cực trong tổ chức đồng thời giúp hình thành văn hóa công ty”, Pablo Brenner, CEO của Collokia, một công cụ cộng tác doanh nghiệp cho biết.

Ví dụ cụ thể, các chương trình như YouEarnedIt cho phép mọi người nhìn nhận sự nỗ lực và biểu dương các đồng nghiệp khi họ không chỉ hoàn thành tốt công việc mà còn giúp phát triển những giá trị cốt lõi của công ty. Các công cụ khác, như TINYpulse, có ý nghĩa trong việc cải thiện văn hóa và hoạt động công ty thông qua việc thu thập những phản hồi ẩn danh.  

Khi bạn đang cố gắng cảm nhận những suy nghĩ, ý kiến và mục tiêu cụ thể ​​của nhân viên, chẳng hạn như loại thực phẩm nào sẽ được cung cấp trong cuộc họp tiếp theo hoặc thu thập ý kiến ​​của nhân viên về chính sách mới của toàn công ty, đôi khi tốt nhất là sử dụng các chương trình miễn phí như Google Forms hoặc Survey Monkey. Những công cụ này cho phép bạn tập hợp những phản hồi trung thực một cách ẩn danh.

Những sự lựa chọn khác về công nghệ mang tính chất tương tác bao gồm các nền tảng mạng nội bộ của công ty như Igloo, Podio và OneWindow Workplace; các ứng dụng mạng xã hội của công ty như Yammer, WeVue và Workplace (của ứng dụng Facebook); và nhiều công cụ cộng tác khác.

Ron Yekutiel, CEO và chủ tịch của nền tảng video Kaltura, đã đưa ra lưu ý rằng những công cụ video có thể được các bộ phận nhân sự quan tâm để cải thiện quy trình tuyển dụng và đào tạo của họ.

“Việc thực hiện các cuộc phỏng vấn hiệu quả hơn thông qua video, hội nghị video mang các nhóm phân tán lại gần nhau hơn, xem xét và đào tạo … nhân viên mới và hiện tại … lực lượng lao động ngày nay thích video hơn như một phương tiện cho giao tiếp và hợp tác,” ông nói.

Lựa chọn giải pháp

Sự hấp dẫn của việc lựa chọn những giải pháp được đánh giá cao nhất hoặc ít tốn kém nhất là không hề bàn cãi. Nhưng điều quan trọng là bạn phải nghiên cứu và tìm ra công cụ phù hợp với nhu cầu kinh doanh. Đừng đầu tư vào một số giải pháp nhất định chỉ vì lợi ích của riêng của họ – đơn giản là vì nó không xứng đáng đối với công ty vào thời gian này, Breslin nói.

“Nó thì quan trọng để tìm ra giải pháp giúp tự động hóa các nhiệm vụ và có thể sẽ chiếm hết lượng thời gian quý giá trong ngày của bạn”, cô nói. “Tuy nhiên, một số nhiệm vụ không bao giờ được tự động hóa, chẳng hạn như xử lý các khiếu nại hoặc xung đột nhân viên.”

Brenner lưu ý rằng các công cụ bạn sử dụng phải thân thiện với người dùng và không gây rắc rối hoặc thất vọng cho nhân viên của bạn. 

“Bạn sẽ không mong đợi việc đọc hướng dẫn về cách sử dụng ứng dụng mới trong một thiên niên kỷ, vậy tại sao bạn nên mong đợi nhân viên đọc hướng dẫn vận hành cho chương trình phần mềm nội bộ?” anh nói

Cho dù bạn đang xem xét loại công cụ công nghệ nào, hãy cân nhắc và tìm kiếm các giải pháp phù hợp có thể đưa tổ chức của bạn tiến xa hơn trong tương lai.

“Các đồng đội nhân sự đang tìm kiếm sự tiên phong trong những đường hướng phát triển nên kết hợp các công nghệ mới, chẳng hạn như … các hệ thống hợp tác kinh doanh trong khi để mắt đến các công nghệ như AR và VR khi chúng phát triển,” Yekutiel nói. “Đây là một chặng đường dài trong việc thu hút lực lượng lao động ở hiện tại và cả tương lai, cho phép các nhóm trong toàn tổ chức làm việc hiệu quả và gia tăng năng suất.”

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

Xem thêm việc làm Developers hàng đầu tại TopDep

 

400+ Khoá học Online hot nhất Ivy League “giết thời gian” trong mùa đại dịch

Hệ 08 trường Ivy League là một trong số các trường cao đẳng uy tín hàng đầu trên thế giới. Hệ thống bao gồm các trường ĐH Brown, ĐH Harvard, ĐH Cornell, ĐH Princeton, ĐH Dartmouth, ĐH Yale, ĐH Columbia, và ĐH Pennsylvania.

Tất cả 8 trường đều nằm trong Top 15 của Truyền thông Mỹ và Báo cáo toàn cầu (U.S. News and World Report).

Các trường Ivy League cũng nổi tiếng về việc chọn lọc rất cao và cực kỳ khó để đậu vào. Nhưng tin tốt là tất cả các trường đại học này hiện đã cung cấp các khóa học trực tuyến miễn phí trên nhiều nền tảng trực tuyến. Các khóa học này có tên là Massive Open Online Courses hoặc được gọi tắt là MOOCs.

Đến nay, họ đã cho ra 500 khóa học, trong đó khoảng 450 vẫn còn hoạt động. Class Central đã thực hiện một bộ tổng hợp tất cả những khoá này, bạn có thể khám phá dưới đây. Tôi đã chia các khóa học này thành các loại sau:

  • Computer Science
  • Data Science (Khoa học Dữ liệu) 
  • Programming (Lập trình)
  • Humanities (Nhân văn)
  • Business (Kinh doanh)
  • Art & Design
  • Science (Khoa học)
  • Social Sciences (Khoa học Xã hội)
  • Health & Medicine (Y học)
  • Engineering
  • Mathematics (Toán học)
  • Education & Teaching (Giáo dục)
  • và Personal Development (Phát triển bản thân)

Tôi cũng đã sắp xếp các khóa học này trên trang tổng hợp của Class Central cho Ivy League MOOCs. Bộ này sẽ được cập nhật tự động mỗi khi các khóa học mới được thêm vào. Bạn có thể đăng ký để nhận được cập nhật mới bằng cách nhấp vào  “FOLLOW” màu xanh nút.

Lưu ý rằng một số các khóa học Coursera thì hơi khó truy cập một chút, vì vậy tôi đã viết hướng dẫn này để cho bạn thấy làm thế nào.

Trang chủ của Class Central

Khoa học máy tính (Computer Science) (37)

  • CS50’s Introduction to Computer Science from Harvard University
  • Algorithms, Part I from Princeton University
  • Algorithms, Part II from Princeton University ★★★★★(21)
  • Bitcoin and Cryptocurrency Technologies from Princeton University ★★★★☆(17)
  • Machine Learning for Data Science and Analytics from Columbia University ★★★☆☆(15)
  • Machine Learning from Columbia University ★★★★☆(10)
  • Artificial Intelligence (AI) from Columbia University ★★★★☆(9)
  • Reinforcement Learning from Brown University ★★★☆☆(8)
  • Machine Learning from Georgia Institute of Technology ★★★★☆(6)
  • Software Defined Networking from Princeton University ★★★★☆(6)
  • Computer Architecture from Princeton University ★★★★☆(6)
  • Enabling Technologies for Data Science and Analytics: The Internet of Things from Columbia University
  • Analysis of Algorithms from Princeton University
  • Robotics: Perception from University of Pennsylvania
  • Machine Learning: Unsupervised Learning from Brown University ★★★☆☆(3)
  • Animation and CGI Motion from Columbia University
  • Networks Illustrated: Principles without Calculus from Princeton University ★★★★☆(3)
  • Linux Basics: The Command Line Interface from Dartmouth ★★★★★(2)
  • C Programming: Modular Programming and Memory Management from Dartmouth
  • CS50’s Computer Science for Business Professionals from Harvard University
  • CS50’s Introduction to Computer Science from Harvard University
  • CS50’s Understanding Technology from Harvard University
  • Networks: Friends, Money, and Bytes from Princeton University
  • C Programming: Pointers and Memory Management from Dartmouth ★★★★★(1)
  • C Programming: Using Linux Tools and Libraries from Dartmouth ★★★★★(1)
  • C Programming: Language Foundations from Institut Mines-Télécom ★★★★★(1)
  • CS50 for Lawyers from Harvard University
  • Algorithm Design and Analysis from University of Pennsylvania
  • [New] Robotics: Vision Intelligence and Machine Learning from University of Pennsylvania
  • Cryptocurrency and Blockchain: An Introduction to Digital Currencies from University of Pennsylvania
  • Data Structures and Software Design from University of Pennsylvania
  • Computational Thinking for Problem Solving from University of Pennsylvania
  • HI-FIVE: Health Informatics For Innovation, Value & Enrichment (Social/Peer Perspective) from Columbia University
  • Computer Science: Algorithms, Theory, and Machines from Princeton University
  • Computer Science: Programming with a Purpose from Princeton University
  • C Programming: Getting Started from Dartmouth
  • C Programming: Advanced Data Types from Dartmouth

Khoa học Dữ liệu (Data Science) (18)

  • Statistics and R from Harvard University
  • Statistical Thinking for Data Science and Analytics from Columbia University
  • Data Science: R Basics from Harvard University
  • People Analytics from University of Pennsylvania
  • Data Science: Visualization from Harvard University
  • High-Dimensional Data Analysis from Harvard University
  • Data Science: Machine Learning from Harvard University
  • Case study: DNA methylation data analysis from Harvard University
  • Data Science: Linear Regression from Harvard University
  • Causal Diagrams: Draw Your Assumptions Before Your Conclusions from Harvard University
  • Data Science: Wrangling from Harvard University
  • Data Science: Productivity Tools from Harvard University
  • Data Science: Probability from Harvard University
  • Data Science: Inference and Modeling from Harvard University
  • Big Data and Education from Columbia University
  • Data Science: Capstone from Harvard University
  • Principles, Statistical and Computational Tools for Reproducible Data Science from Harvard University
  • Data, Models and Decisions in Business Analytics from Columbia University

For a more in-depth overview of Data Science courses read this series:

  • I ranked every Intro to Data Science course on the internet, based on thousands of data points
  • The best Data Science courses on the internet, ranked by your reviews
  • Every single Machine Learning course on the internet, ranked by your reviews
  • If you want to learn Data Science, start with one of these programming classes
  • An overview of every Data Visualization course on the internet

Lập trình (8)

  • Using Python for Research from Harvard University
  • CS50’s Web Programming with Python and JavaScript from Harvard University
  • Programming for the Web with JavaScript from University of Pennsylvania
  • The Computing Technology Inside Your Smartphone from Cornell University
  • CS50’s Mobile App Development with React Native from Harvard University
  • CS50’s Introduction to Game Development from Harvard University
  • Software Development Fundamentals from University of Pennsylvania
  • [New] Quantitative Methods for Biology from Harvard University

Nhân văn (80)

  • Modern & Contemporary American Poetry (“ModPo”) from University of Pennsylvania
  • HOPE: Human Odyssey to Political Existentialism from Princeton University
  • Moralities of Everyday Life from Yale University
  • Greek and Roman Mythology from University of Pennsylvania
  • Ancient Philosophy: Plato & His Predecessors from University of Pennsylvania
  • Ancient Philosophy: Aristotle and His Successors from University of Pennsylvania
  • China (Part 1): Political and Intellectual Foundations: From the Sage Kings to Confucius and the Legalists from Harvard University
  • Visualizing Japan (1850s-1930s): Westernization, Protest, Modernity from Harvard University
  • Religious Literacy: Traditions and Scriptures from Harvard University
  • China’s First Empires and the Rise of Buddhism from Harvard University
  • Modern China’s Foundations: The Manchus and the Qing from Harvard University
  • Literati China: Examinations, Neo-Confucianism, and Later Imperial China from Harvard University
  • English for Career Development from University of Pennsylvania
  • English for Journalism from University of Pennsylvania
  • Effective Altruism from Princeton University
  • Buddhism Through Its Scriptures from Harvard University
  • Creating Modern China: The Republican Period to the Present from Harvard University
  • Introduction to Ancient Egypt and Its Civilization from University of Pennsylvania
  • The Civil War and Reconstruction – 1850-1861: A House Divided from Columbia University
  • The Civil War and Reconstruction – 1865-1890: The Unfinished Revolution from Columbia University
  • Invasions, Rebellions, and the Fall of Imperial China from Harvard University
  • Cosmopolitan Tang: Aristocratic Culture in China from Harvard University
  • Global China: From the Mongols to the Ming from Harvard University
  • China and Communism from Harvard University
  • Contemporary China: The People’s Republic, Taiwan, and Hong Kong from Harvard Uni
  • Masterpieces of World Literature from Harvard University
  • Global History Lab from Princeton University
  • Christianity Through Its Scriptures from Harvard University
  • Shakespeare’s Hamlet: The Ghost from Harvard University
  • Journey of the Universe: The Unfolding of Life from Yale University
  • American Capitalism: A History from Cornell University
  • The Ethics of Eating from Cornell University
  • Question Reality! Science, philosophy, and the search for meaning from Dartmouth
  • Islam Through Its Scriptures from Harvard University
  • Religion, Conflict and Peace from Harvard University
  • The Medieval Book of Hours: Art and Devotion in the Later Middle Ages from Harvard University
  • PredictionX: John Snow and the Cholera Outbreak of 1854 from Harvard University
  • Books in the Medieval Liturgy from Harvard University
  • The Ancient Greek Hero from Harvard University
  • Bioethics: The Law, Medicine, and Ethics of Reproductive Technologies and Genetics from Harvard University
  • Shakespeare’s Othello: The Moor from Harvard University
  • Wonders of Ancient Egypt from University of Pennsylvania
  • Poetry in America: Whitman from Harvard University
  • Ancient Masterpieces of World Literature from Harvard University
  • Hinduism Through Its Scriptures from Harvard University
  • Judaism Through Its Scriptures from Harvard University
  • Shakespeare’s The Merchant of Venice: Shylock from Harvard University
  • English for Business and Entrepreneurship from University of Pennsylvania
  • English for Science, Technology, Engineering, and Mathematics from University of Pennsylvania
  • The Tabernacle in Word & Image: An Italian Jewish Manuscript Revealed from University of Pennsylvania
  • Seeking Women’s Rights: Colonial Period to the Civil War from Columbia University
  • Women Have Always Worked: The U.S. Experience 1700 – 1920 from Columbia University
  • The American Renaissance: Classic Literature of the 19th Century from Dartmouth
  • John Milton: Paradise Lost from Dartmouth
  • Power and Responsibility: Doing Philosophy with Superheroes from Harvard University
  • China’s Political and Intellectual Foundations: From Sage Kings to Confucius from Harvard University
  • Introduction to Digital Humanities from Harvard University
  • PredictionX: Lost Without Longitude from Harvard University
  • Poetry in America: Modernism from Harvard University
  • Poetry in America: The Poetry of Early New England from Harvard University
  • Book Sleuthing: The Nineteenth Century from Harvard University
  • Poetry in America: The Civil War and Its Aftermath from Harvard University
  • Poetry in America: Whitman from Harvard University
  • China Humanities: The Individual in Chinese Culture from Harvard University
  • Sikhism Through Its Scriptures from Harvard University
  • Modern Masterpieces of World Literature from Harvard University
  • Women Making History: Ten Objects, Many Stories from Harvard University
  • Shakespeare’s Life and Work from Harvard University
  • The Worldview of Thomas Berry: The Flourishing of the Earth Community from Yale University
  • Women Have Always Worked: The U.S. Experience 1920 – 2016 from Columbia University
  • Wage Work for Women Citizens: 1870-1920 from Columbia University
  • Fighting for Equality: 1950–2018 from Columbia University
  • Indian & Tibetan River of Buddhism from Columbia University
  • Negotiating a Changing World: 1920-1950 from Columbia University
  • Writing Case Studies: Science of Delivery from Princeton University
  • Fantastic Places, Unhuman Humans: Exploring Humanity Through Literature from Brown University
  • The Ethics of Memory from Brown University
  • Libertarian Free Will: Neuroscientific and Philosophical Evidence from Dartmouth

Business (72)

  • Introduction to Marketing from University of Pennsylvania
  • Introduction to Financial Accounting from University of Pennsylvania
  • Introduction to Operations Management from Wharton School of the University of Pennsylvania
  • Financial Markets from Yale University
  • Introduction to Corporate Finance from Wharton School of the University of Pennsylvania
  • Viral Marketing and How to Craft Contagious Content from University of Pennsylvania
  • Customer Analytics from University of Pennsylvania
  • The Global Financial Crisis from Yale University
  • Financial Engineering and Risk Management Part I from Columbia University ★★★★☆(11)
  • Entrepreneurship 2: Launching your Start-Up from University of Pennsylvania ★★★★☆(9)
  • Global Human Capital Trends from Columbia University
  • Operations Analytics from University of Pennsylvania
  • Accounting Analytics from University of Pennsylvania
  • Introduction to Spreadsheets and Models from University of Pennsylvania
  • Entrepreneurship 1: Developing the Opportunity from University of Pennsylvania
  • More Introduction to Financial Accounting from University of Pennsylvania
  • A Preview Course on The 5 Killer Risks of Enterprise Risk Management from Columbia University
  • Fundamentals of Quantitative Modeling from University of Pennsylvania
  • Entrepreneurship 3: Growth Strategies from University of Pennsylvania
  • Entrepreneurship 4: Financing and Profitability from University of Pennsylvania ★★★★★(4)
  • Social Impact Strategy: Tools for Entrepreneurs and Innovators from University of Pennsylvania ★★★★☆(4)
  • Analytics in Python from Columbia University
  • Improving Your Business Through a Culture of Health from Harvard University
  • Introducción a las Finanzas Corporativas from University of Pennsylvania
  • Arts and Culture Strategy from University of Pennsylvania
  • Financial Engineering and Risk Management Part II from Columbia University
  • Entrepreneurship in Emerging Economies from Harvard University
  • Introducción al Marketing from University of Pennsylvania
  • Construction Project Management from Columbia University
  • Introduction to Global Hospitality Management from Cornell University
  • Decision-Making and Scenarios from University of Pennsylvania
  • Global Trends for Business and Society from University of Pennsylvania
  • Corporate Social Responsibility (CSR): A Strategic Approach from University of Pennsylvania
  • Crowdfunding from University of Pennsylvania
  • Financial Acumen for Non-Financial Managers from University of Pennsylvania ★☆☆☆☆(1)
  • Introducción a la Contabilidad Financiera from University of Pennsylvania
  • Leading the Life You Want from University of Pennsylvania
  • Construction Scheduling from Columbia University
  • Construction Cost Estimating and Cost Control from Columbia University
  • Construction Finance from Columbia University
  • Launching Breakthrough Technologies from Harvard University
  • Entrepreneurship and Healthcare in Emerging Economies from Harvard University
  • Modeling Risk and Realities from University of Pennsylvania
  • Modeling Risk and Realities from University of Pennsylvania
  • Managing Social and Human Capital from University of Pennsylvania
  • Optimizing Diversity on Teams from University of Pennsylvania
  • The Power of Team Culture from University of Pennsylvania
  • Lending, Crowdfunding, and Modern Investing from University of Pennsylvania
  • Application of AI, InsurTech, and Real Estate Technology from University of Pennsylvania
  • FinTech: Foundations, Payments, and Regulations from University of Pennsylvania
  • Business Strategies for Social Impact from University of Pennsylvania
  • Building High-Performing Teams from University of Pennsylvania
  • Creating a Team Culture of Continuous Learning from University of Pennsylvania
  • Introducción a la Gestión de Operaciones from University of Pennsylvania
  • What is Corruption: Anti-Corruption and Compliance from University of Pennsylvania
  • Influence from University of Pennsylvania
  • Creating a Team Culture of Continuous Learning from University of Pennsylvania
  • Management Fundamentals from University of Pennsylvania
  • Building High-Performing Teams from University of Pennsylvania
  • Introduction to Corporate Finance from Columbia University
  • Free Cash Flow Analysis from Columbia University
  • Demand and Supply Analytics from Columbia University
  • Marketing Analytics from Columbia University
  • Connected Strategy Capstone from Wharton School of the University of Pennsylvania
  • Developing Breakthrough Innovations with the Three Box Solution from Dartmouth
  • Executing Breakthrough Innovations with the Three Box Solution from Dartmouth
  • Omnichannel Strategy and Management from Dartmouth
  • Retail Fundamentals from Dartmouth

Art & Design (20)

  • Gamification from University of Pennsylvania
  • Introduction to Classical Music from Yale University
  • Design: Creation of Artifacts in Society from University of Pennsylvania
  • Roman Architecture from Yale University
  • The Architectural Imagination from Harvard University
  • Hollywood: History, Industry, Art from University of Pennsylvania
  • 18th-Century Opera: Handel & Mozart from Harvard University
  • First Nights – Beethoven’s 9th Symphony and the 19th Century Orchestra from Harvard University
  • First Nights – Handel’s Messiah and Baroque Oratorio from Harvard University
  • Reinventing the Piano from Princeton University ★★★★★(4)
  • First Nights – Monteverdi’s L’Orfeo and the Birth of Opera from Harvard University
  • First Nights – Stravinsky’s Rite of Spring: Modernism, Ballet, and Riots from Harvard University
  • First Nights – Berlioz’s Symphonie Fantastique and Program Music in the 19th Century from Harvard University
  • Introduction to Italian Opera from Dartmouth
  • Exposing Digital Photography from Harvard University
  • 19th-Century Opera: Meyerbeer, Wagner, & Verdi from Harvard University
  • Pyramids of Giza: Ancient Egyptian Art and Archaeology from Harvard University
  • Music and Social Action from Yale University
  • Age of Cathedrals from Yale University
  • Introduction to German Opera from Dartmouth

Khoa học (32)

  • Vital Signs: Understanding What the Body Is Telling Us from University of Pennsylvania ★★★★★(43)
  • Best Practices for Biomedical Research Data Management (HE) from Harvard Medical School ★★★★★(20)
  • Fundamentals of Neuroscience, Part 1: The Electrical Properties of the Neuron from Harvard University
  • Science & Cooking: From Haute Cuisine to Soft Matter Science (part 1) from Harvard University
  • Fundamentals of Neuroscience, Part 2: Neurons and Networks from Harvard University
  • Principles of Biochemistry from Harvard University ★★★★★(6)
  • Introduction to Environmental Science from Dartmouth ★★★★☆(6)
  • Super-Earths and Life from Harvard University ★★★★☆(5)
  • Sharks! Global Biodiversity, Biology, and Conservation from Cornell University ★★★★★(5)
  • Relativity and Astrophysics from Cornell University
  • Imagining Other Earths from Princeton University
  • The Climate-Energy Challenge from Harvard University
  • The Quantum World from Harvard University
  • Introduction to Bioconductor: Annotation and Analysis of Genomes and Genomic Assays from Harvard University
  • Case Studies in Functional Genomics from Harvard University
  • Cell Biology: Mitochondria from Harvard University
  • The Health Effects of Climate Change from Harvard University
  • Science & Cooking: From Haute Cuisine to Soft Matter Science (physics) from Harvard University
  • MalariaX: Defeating Malaria from the Genes to the Globe from Harvard University
  • Fundamentals of Neuroscience, Part 3: The Brain from Harvard University
  • High-performance Computing for Reproducible Genomics from Harvard University
  • Backyard Meteorology: The Science of Weather from Harvard University
  • Communicating Climate Change and Health from Yale University
  • Introduction to Climate Change and Health from Yale University
  • Communicating Climate Change and Health from Yale University
  • Introduction to Climate Change and Health from Yale University
  • Journey Conversations: Weaving Knowledge and Action from Yale University
  • Climate Adaptation for Human Health from Yale University
  • Bipedalism: The Science of Upright Walking from Dartmouth

Khoa học Xã hội (Social Sciences) (74)

  • Justice from Harvard University
  • An Introduction to American Law from University of Pennsylvania
  • Constitutional Interpretation from Princeton University
  • Moral Foundations of Politics from Yale University
  • The Age of Sustainable Development from Columbia University
  • Paradoxes of War from Princeton University
  • Contract Law: From Trust to Promise to Contract from Harvard University
  • America’s Written Constitution from Yale University
  • The Science of Well-Being from Yale University
  • Tangible Things: Discovering History Through Artworks, Artifacts, Scientific Specimens, and the Stuff Around You from Harvard University
  • Introduction to Key Constitutional Concepts and Supreme Court Cases from University of Pennsylvania
  • Designing Cities from University of Pennsylvania
  • Civil Liberties from Princeton University
  • Microeconomics: The Power of Markets from University of Pennsylvania
  • Global History of Capitalism from Princeton University
  • Revolutionary Ideas: Utility, Justice, Equality, Freedom from University of Pennsylvania
  • A Law Student’s Toolkit from Yale University
  • Monasteries, Schools, and Notaries, Part 1: Reading the Late Medieval Marseille Archive from Harvard University
  • Making and Meaning in the Medieval Manuscript from Harvard University
  • America’s Unwritten Constitution from Yale University
  • JuryX: Deliberations for Social Change from Harvard University
  • Monasteries, Schools, and Notaries, Part 2: Introduction to the Transitional Gothic Script from Harvard University
  • The History of Medieval Medicine Through Jewish Manuscripts from University of Pennsylvania
  • Positive Psychology: Resilience Skills from University of Pennsylvania
  • Introduction to Psychology from Yale University
  • Economics of Money and Banking from Columbia University
  • Making Government Work in Hard Places from Princeton University
  • Wiretaps to Big Data from Cornell University
  • Networks, Crowds and Markets from Cornell University
  • PredictionX: Diviner’s Guide from Harvard University
  • Scrolls in the Age of the Book from Harvard University
  • The History of the Book in 17th and 18th Century Europe from Harvard University
  • Central Challenges of American National Security, Strategy, and the Press from Harvard University
  • Print and Manuscript in Western Europe, Asia and the Middle East (1450-1650) from Harvard University
  • English for Media Literacy from University of Pennsylvania
  • Microeconomics: When Markets Fail from University of Pennsylvania
  • Revolutionary Ideas: Borders, Elections, Constitutions, Prisons from University of Pennsylvania
  • Positive Psychology: Applications and Interventions from University of Pennsylvania
  • Positive Psychology: Martin E. P. Seligman’s Visionary Science from University of Pennsylvania
  • Intellectual Property Law and Policy: Part 2 from University of Pennsylvania
  • Network Dynamics of Social Behavior from University of Pennsylvania
  • Social Norms, Social Change I from University of Pennsylvania
  • Intellectual Property Law and Policy: Part 1 from University of Pennsylvania
  • Corruption from University of Pennsylvania
  • Social Norms, Social Change II from University of Pennsylvania
  • Everyday Parenting: The ABCs of Child Rearing from Yale University
  • Global Muckraking: Investigative Journalism and Global Media from Columbia University
  • Risk & Return from Columbia University
  • Reclaiming Broken Places: Introduction to Civic Ecology from Cornell University ★★★☆☆(1)
  • U.S. Public Policy: Social, Economic, and Foreign Policies from Harvard University
  • Citizen Politics in America: Public Opinion, Elections, Interest Groups, and the Media from Harvard University
  • American Government: Constitutional Foundations from Harvard University
  • CitiesX: The Past, Present and Future of Urban Life from Harvard University
  • U.S. Political Institutions: Congress, Presidency, Courts, and Bureaucracy from Harvard University
  • Child Protection: Children’s Rights in Theory and Practice from Harvard University
  • Positive Psychology Specialization Project: Design Your Life for Well-being from University of Pennsylvania
  • Creating an Effective Child Welfare System from University of Pennsylvania
  • Trademark Law from University of Pennsylvania
  • Exploring Renewable Energy Schemes from University of Pennsylvania
  • Introduction to Intellectual Property from University of Pennsylvania
  • Positive Psychology: Character, Grit and Research Methods from University of Pennsylvania
  • The Top 10 Social Issues for the First 100 Days from University of Pennsylvania
  • American Contract Law I from Yale University
  • American Contract Law II from Yale University
  • Freedom of Expression and Information in the Time of Globalization: Foundational Course from Columbia University
  • Freedom of Expression and Information in the Time of Globalization: Advanced Course from Columbia University
  • Health, Housing, and Educational Services from Columbia University
  • Social Services for Families, Seniors and Those with Disabilities from Columbia University
  • US Social Services: Where did they come from? from Columbia University
  • Poverty & Population: How Demographics Shape Policy from Columbia University
  • US Social Services Compared from Columbia University
  • Freedom of Expression in the Age of Globalization from Columbia University
  • Protecting Children in Humanitarian Settings from Columbia University
  • Structuring Successful Business Deals from Cornell University

Y học (32)

  • Buddhism and Modern Psychology from Princeton University
  • Humanitarian Response to Conflict and Disaster from Harvard University
  • Introduction to Breast Cancer from Yale University
  • Introduction to Dental Medicine from University of Pennsylvania
  • Improving Global Health: Focusing on Quality and Safety from Harvard University
  • Going Out on a Limb: Anatomy of the Upper Limb from University of Pennsylvania
  • United States Health Policy from Harvard University
  • Fundamentals of Clinical Trials from Harvard University
  • AnatomyX: Musculoskeletal Cases from Harvard University
  • Anatomy of the Chest, Abdomen, and Pelvis from Yale University
  • The Science and Politics of the GMO from Cornell University
  • Global Health Case Studies From a Biosocial Perspective from Harvard University
  • Readings in Global Health from Harvard University
  • Health and Society from Harvard University
  • The Opioid Crisis in America from Harvard University
  • Health Care Innovation from University of Pennsylvania ★★★★★(1)
  • Essentials of Global Health from Yale University ★★★★☆(1)
  • Strengthening Community Health Worker Programs from Harvard University
  • Practical Improvement Science in Health Care: A Roadmap for Getting Results from Harvard University
  • Innovating in Health Care from Harvard University
  • Prescription Drug Regulation, Cost, and Access: Current Controversies in Context from Harvard University
  • Lessons from Ebola: Preventing the Next Pandemic from Harvard University
  • Feeding the World from University of Pennsylvania
  • The Oral Cavity: Portal to Health and Disease from University of Pennsylvania
  • The Economics of Health Care Delivery from University of Pennsylvania
  • [New] Addiction Treatment: Clinical Skills for Healthcare Providers from Yale University
  • Pediatric HIV Nursing from Columbia University
  • Fighting HIV with Antiretroviral Therapy: Implementing the Treat-All Approach from Columbia University
  • Soins infirmiers en VIH pédiatrique from Columbia University
  • Traitement antirétroviral pour lutter contre le VIH : mise en œuvre de l’approche « traiter tout le monde » from Columbia University
  • Beyond Medical Histories: Gaining Insight from Patient Stories from Brown University
  • Artful Medicine from Brown University

Engineering (15)

  • The Art of Structural Engineering: Vaults from Princeton University
  • Robotics: Aerial Robotics from University of Pennsylvania
  • The Art of Structural Engineering: Bridges from Princeton University
  • Robotics: Computational Motion Planning from University of Pennsylvania
  • Energy Within Environmental Constraints from Harvard University
  • Robotics: Mobility from University of Pennsylvania
  • [New] Robotics: Kinematics and Mathematical Foundations from University of Pennsylvania
  • Robotics from Columbia University
  • A Hands-on Introduction to Engineering Simulations from Cornell University
  • The Engineering of Structures Around Us from Dartmouth
  • Robotics: Estimation and Learning from University of Pennsylvania
  • MOS Transistors from Columbia University
  • [New] Robotics: Dynamics and Control from University of Pennsylvania
  • [New] Robotics: Locomotion Engineering from University of Pennsylvania
  • Introduction to Engineering and Design from Brown University

Giáo dục (21)

  • Leaders of Learning from Harvard University
  • Applying to U.S. Universities from University of Pennsylvania
  • American Education Reform: History, Policy, Practice from University of Pennsylvania
  • Saving Schools Mini-Course 1: History and Politics of U.S. Education from Harvard University
  • Saving Schools, Mini-Course 2: Teacher Policies from Harvard University ★★★★☆(1)
  • Saving Schools, Mini-Course 3: Accountability and National Standards from Harvard University
  • Saving Schools Mini-Course 4: School Choice from Harvard University
  • Introduction to Online and Blended Teaching from University of Pennsylvania
  • How to Apply to College from University of Pennsylvania
  • Orchestrating Whole Classroom Discussion from University of Pennsylvania
  • Analytics in Course Design: Leveraging Canvas Data (HE) from Dartmouth
  • Introduction to Family Engagement in Education from Harvard University
  • Introduction to Data Wise: A Collaborative Process to Improve Learning & Teaching from Harvard University
  • Understanding Classroom Interaction from University of Pennsylvania
  • The Science of Learning – What Every Teacher Should Know from Columbia University
  • Innovating Instruction: Reimagining Teaching with Technology from Columbia University
  • University Studies for Student Veterans from Columbia University
  • Inclusive Teaching: Supporting All Students in the College Classroom from Columbia University
  • Attaining Higher Education from Columbia University
  • Teaching & Learning in the Diverse Classroom from Cornell University

Toán học (14)

  • Introduction to Linear Models and Matrix Algebra from Harvard University
  • Calculus: Single Variable Part 1 – Functions from University of Pennsylvania
  • Calculus: Single Variable Part 2 – Differentiation from University of Pennsylvania
  • Calculus: Single Variable Part 3 – Integration from University of Pennsylvania
  • Fat Chance: Probability from the Ground Up from Harvard University
  • Statistical Inference and Modeling for High-throughput Experiments from Harvard University
  • Calculus: Single Variable Part 4 – Applications from University of Pennsylvania
  • Analytic Combinatorics from Princeton University ★★★★☆(2)
  • A Crash Course in Causality: Inferring Causal Effects from Observational Data from University of Pennsylvania
  • Calculus Applied! from Harvard University
  • Introduction to Probability from Harvard University
  • Single Variable Calculus from University of Pennsylvania
  • Causal Inference from Columbia University

Phát triển bản thân (7)

  • Introduction to Negotiation: A Strategic Playbook for Becoming a Principled and Persuasive Negotiator from Yale University
  • A Preview Course on Collaborative Knowledge Services from Columbia University
  • Success from University of Pennsylvania
  • Improving Communication Skills from University of Pennsylvania
  • Rhetoric: The Art of Persuasive Writing and Public Speaking from Harvard University
  • Find Your Calling: Career Transition Principles for Returning Veterans from Columbia University

Đừng bỏ lỡ:

TopDev via Freecodecamp

Có thể bạn muốn xem:

  Top những thuật toán machine learning mà bất cứ Data Scientist nào cũng cần phải biết (Phần 1)
  400+ Khoá học Online hot nhất Ivy League "giết thời gian" trong mùa đại dịch
Phân tích dữ liệu xổ số miền Bắc”]

Tùy biến code theo tốc độ mạng

Responsive với CSS chúng ta tùy biến code bằng @media, vậy với JS, ta thêm các điều kiện theo tốc độ mạng bằng cách nào?

Chúng ta sẽ sử dụng API của trình duyệt navigator.connection.effectiveType để tối ưu theo tốc độ kết nối mạng của user

Các thông tin về mạng của user có thể lấy qua navigator.connection, trong đó có giá trị effectiveType là một trong các giá trị ‘slow-2g’, ‘2g’, ‘3g’, ‘4g’

Chrome 62 trở về trước, chúng ta chỉ có giá trị navigator.connection.type, giá trị này không phải tốc độ mạng. Mặc dù type là wifi, nhưng lại là một wifi cùi mía, tốc độ ngang ngửa 2g, Chrome sau này có phát minh thêm giá trị effectiveType, tính theo tốc độ đi-về của cục dữ liệu cho chính xác.

Đáp ứng theo tốc độ mạng

Còn trường hợp, trong nhà có thanh niên nào đó mở link down film Nhật, tốc độ mạng đang “như tia chớp”, thì chuyển sang “cùi mía”, biết được sự thay đổi này cần add thêm cái listener cho đối tượng navigator.connection

function onConnectionChange () {
    const {
        rtt,
        downlink,
        effectiveType,
        saveData
    } = navigator.connection

    console.log(`Effective network connection type: ${effectiveType}`)
    console.log(`Downlink Speed/bandwidth estimate: ${downlink}Mb/s`)
    console.log(`Round-trip time estimate: ${rtt}ms`)
    console.log(`Data-saver mode on/requested: ${saveData}`)
}

navigator.connection.addEventListener('change', onConnectionChange)

Dùng Chrome DevTools để giả lập các tốc độ mạng khác nhau để test, chứ đừng down film để test tốc độ

Đáp ứng theo tốc độ mạng

Mấy trình duyệt xịn xịn như Chrome, Opera, Firefox là dùng được navigator.connection chứ không riêng gì Chrome

Dùng một regex để gom mấy kết quả gờ gờ là mạng chậm hết, 3g Việt Nam thì cũng như 2g thôi

if (/\slow-2g|2g|3g/.test(navigator.connection.effectiveType)) {
  this.connection = "slow";
} else {
  this.connection = "fast";
}

Mình sử dụng Vue.js, không phải HTML thuần nên đừng thắc mắc sao có cái v-if nhé

<template>
  <div id="home">
    <div v-if="connection === 'fast'">
      <!-- 1.3MB video -->
      <video class="theatre" autoplay muted playsinline control>
        <source src="/static/img/doodle-theatre.webm" type="video/webm">
        <source src="/static/img/doodle-theatre.mp4" type="video/mp4">
      </video>
    </div>
    <!-- 28KB image -->
    <div v-if="connection === 'slow'">
      <img class="theatre" src="/static/img/doodle-theatre-poster.jpg">
    </div>
  </div>
</template>

Đáp ứng theo tốc độ mạng

Nếu bạn viết React, có bài này cũng hay, nói về việc làm component đáp ứng theo tốc độ kết nối

TopDev via Vuilaptrinh

Viết câu điều kiện tốt hơn trong Javascript

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

Xem xét một trong những câu lệnh được sử dụng nhiều nhất trong lập trình: câu điều kiện

Một trong những món ăn mà anh em lập trình chúng ta phải nhai đi nhai lại trong suốt cuộc đời, dù là bạn đang viết ngôn ngữ gì là CÂU ĐIỀU KIỆN. Nếu không khéo trong lúc nấu code, thì món ngon đó đôi khi trở thành món dỡ ẹt, người sau vào ăn không thấy ngon, chúng ta tự ăn cũng không thấy ngon.

Bài này được viết trong một chiều chủ nhật đang đói bụng

Điều kiện lồng vào nhau

❌ Tạm, chưa ngon
let result;
if(condition) {
} else if(condition2) {
} else {
}
return result;

Có vẻ không vấn đề nhỉ? Nhưng thật ra nó sẽ chạy y chang khi chúng ta viết thế này

❌ Không ngon
let result;
if(condition) {
} else {
   if(condition2) {
   } else {
   }
}
return result;

Du là thế nào đi nữa, gặp lồng câu điều kiện else...if... là phải tìm cách khử liền

✅ Chuẩn cơm mẹ nấu
if (condition){
}
if(condition2) {
}

Array.includes

❌ Không ngon
if ( animal == 'dog' || animal == 'cat' || animal == 'turtle')

✅ Chuẩn cơm mẹ nấu
['cat', 'dog', 'turtle'].includes(animal)
hoặc
['cat', 'dog', 'turtle'].indexOf(animal) !== -1

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

return

❌ Không ngon
const printAnimalDetails = animal => {
  let result;
  if (animal) {
    if (animal.type) {
      if (animal.name) {
        if (animal.gender) {
          result = `${animal.name} is a ${animal.gender} ${animal.type};`;
        } else {
          result = "No animal gender";
        }
      } else {
        result = "No animal name";
      }
    } else {
      result = "No animal type";
    }
  } else {
    result = "No animal";
  }
  return result;
};

Nếu bạn vẫn viết code thế này thì mình cũng lại!

✅ Chuẩn cơm mẹ nấu
const printAnimalDetails = ({type, name, gender } = {}) => {
  if(!type) return 'No animal type';
  if(!name) return 'No animal name';
  if(!gender) return 'No animal gender';

  return `${animal.name} is a ${animal.gender} ${animal.type}`;
}

Dùng Object thay cho switch…case

Đoạn code return loại trái cây có màu sắc như điều kiện truyền vào

❌ Không ngon
function printFruits(color) {
  switch (color) {
    case 'red':
      return ['apple', 'strawberry'];
    case 'yellow':
      return ['banana', 'pineapple'];
    case 'purple':
      return ['grape', 'plum'];
    default:
      return [];
  }
}

Code như trên không sai, mà nếu dùng object làm thì sẽ ngon hơn nhiều

✅ Chuẩn cơm mẹ nấu
function printFruits(color) {
    const fruitColor = {
      red: ['apple', 'strawberry'],
      yellow: ['banana', 'pineapple'],
      purple: ['grape', 'plum']
    };
    return fruitColor[color] || [];
}

params mặc định và destructuring

❌ Không ngon
function printVegetableName(vegetable) {
   if (vegetable && vegetable.name) {
    console.log (vegetable.name);
  } else {
   console.log('unknown');
  }
}
✅ Chuẩn cơm mẹ nấu
function printVegetableName({ name } = {}) {
  console.log (name || 'unknown');
}

Array.every, Array.some

Đoạn code kiểm tra tất cả trái cây có màu đó

❌ Không ngon
const fruits = [
  { name: 'apple', color: 'red' },
  { name: 'banana', color: 'yellow' },
  { name: 'grape', color: 'purple' }
];
function test() {
  let isAllRed = true;

  for (let f of fruits) {
    if (!isAllRed) break;
    isAllRed = (f.color == 'red');
  }

  console.log(isAllRed); // false
}

Thay vì dùng vòng lặp for, có thể dùng Array.every

function test() {
  const isAllRed = fruits.every(f => f.color == 'red');
  console.log(isAllRed); // false
}

Chỉ cần vài item trong đó thỏa điều kiện là được, ta dùng Array.some

const isAllRed = fruits.some(f => f.color == 'red');

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

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

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

Trí tuệ cảm xúc là gì và áp dụng như thế nào trong ngành Nhân sự

Liệu rằng các chuyên gia về quản trị nhân sự có nên sở hữu trí tuệ cảm xúc?

Đó là một câu hỏi nhiều thách thức trong môi trường làm việc ngày nay, đặc biệt là khi các nhân viên tiềm năng cho phép và sử dụng trí tuệ của cảm xúc như một phần không thể thiếu trong quá trình đưa ra quyết định của họ. 

Thực chất EI là gì?

Theo Mike Poskey, chủ tịch của ZERORISK HR, EI (Emotional Intelligence) hay còn gọi là trí tuệ cảm xúc là một tập hợp các năng lực cho phép con người thể hiện và tự nhận ra được những hành vi, tâm trạng, sự dao động của bản thân và biết cách kiểm soát chúng trong từng tình huống cụ thể.

Trí thông minh của cảm xúc còn được hiểu theo nghĩa đơn giản hơn tức là cách một cá nhân nào đó biết nhận ra những cảm xúc mình đang tồn tại bên trong mình, từ đó họ có thể điều khiển được tích cách, suy nghĩ và hành động của mình một cách hiệu quả. Và khi ngành Nhân sự phát triển, trí tuệ cảm xúc đã trở thành một chiến lược quan trọng trong việc quyết định liệu một ứng viên tiềm năng có đủ sự phù hợp với vai trò mà họ đang ứng tuyển hay không.

Tuy nhiên, giữa việc quyết tâm xây dựng văn hóa công ty và thực sự bắt tay vào việc để cải thiện chưa thực sự kết nối với nhau chặt chẽ. “Các công ty dường như rất thích bàn luận về tầm quan trọng của con người cũng như đặt họ làm trọng tâm, tuy nhiên lại thất bại trong việc đẩy mạnh EI giữa các lãnh đạo và tổ chức” giám đốc của HBR-AS cho biết. Nhiều tổ chức gặp khó khăn trong việc xem trọng EI để đạt được các lợi ích cho tổ chức – như nhân viên có tâm trạng tốt hơn, có động lực để làm việc có năng suất cao hơn.

Lợi ích của EI đối với ngành Nhân sự 

Trí thông minh cảm xúc có thể đóng một vai trò quan trọng trong công việc của các chuyên gia nhân sự, vì nó cung cấp cho họ cái nhìn sâu sắc về quá trình đào tạo và phát triển nhân sự. Ngoài ra, sự hiểu biết từ EI có thể giúp các nhà quản lý nhân sự xác định xu hướng hành vi của tổ chức/doanh nghiệp. Chính lợi ích thiết thực này giúp họ thuận lợi hơn trọng việc phát triển các chương trình thúc đẩy giao tiếp lành mạnh tại nơi làm việc.

EI tạo ra cho chính bạn cơ hội để khám phá cảm xúc và những tác động đa chiều mà bạn đang gặp phải. Đồng thời, EI còn giúp hình thành nên một môi trường làm việc thân thiện, vui vẻ cho nhân viên và người quản lý nhân sự, từ đó thúc đẩy việc gia tăng hiệu suất công việc của toàn tổ chức.

Để có thể thấy rõ những lợi ích mà EI mang lại, hãy đảm bảo rằng bạn hiểu rõ 4 thuộc tính của EI:

  • Tự nhận thức và năng lực đồng cảm
  • Tự kiểm soát và thích ứng
  • Năng lực nhận thức xã hội
  • Quản lý các mối quan hệ 

Tự nhận thức và năng lực đồng cảm

Poskey đánh giá việc sự tự nhận thức là một năng lực đặc biệt vì nó giúp thúc đẩy khả năng tự phán đoán và xác định cảm xúc ảnh hưởng đến hành vi và suy nghĩ, tự đánh giá chính xác mong muốn của cá nhân. Biểu hiện của năng lực này chính là việc tự thích ứng và sáng tạo đổi mới trong môi trường nhân sự khắc nghiệt. 

Năng lực đồng cảm khiến bạn có sự thấu hiểu, kết nối hơn tốt hơn với những cảm xúc của đồng nghiệp. Đó cũng là nền tảng giúp phát triển con người và thúc đẩy sự đa dạng trong lối tư duy về cảm xúc. tiêu đề tuyển dụng

Tự kiểm soát và thích ứng

Kiểm soát các xung động và cảm xúc của bạn là yếu tố rất quan trọng để đạt được thành công. Hiệu quả công việc của bạn sẽ được gia tăng nếu bạn biết cách quản lý cảm xúc của bản thân trong một khoảng thời gian.

Khả năng thích ứng cũng có thể tạo ra sự khác biệt cho các bạn trong việc quản trị nguồn nhân lực. Ví dụ nếu bạn là người quản lý nhân sự, hãy khuyến khích các nhân viên của mình dành đủ thời gian cần thiết để quản lý cảm xúc của bản thân. Cụ thể như khuyến khích họ nghỉ ngơi 15 phút để có thể nhận biết, kiểm soát và đánh giá lại những cảm xúc cá nhân một cách tốt hơn. Đó là cơ hội để họ hiểu bản thân hơn đồng thời tạo ra sự thích ứng, tính cân bằng cảm xúc trước những áp lực từ môi trường làm việc nhân sự.

Năng lực nhận thức xã hội

EI giúp bạn có thể dễ dàng tiếp nhận các tín hiệu xã hội của người khác, cảm thấy thoải mái trong một tập thể năng động. Từ đó, EI sẽ kích thích sự tương tác qua lại giữa bạn và đồng nghiệp, giúp bạn tự tin hơn trong giao tiếp. Điều quan trọng là phải biết vai trò của bạn trong các môi trường làm việc khác nhau, hiểu cảm xúc của bạn và điều tiết nó để có thể hòa nhập một cách tốt nhất. 

Ví dụ, một chuyên gia nhân sự thành lập các hội thảo về các giải pháp thực tế có thể giúp người lao động phát triển nhận thức xã hội. Các nhân viên tham gia và hiểu được các tình huống hiện thực phổ biến có thể xảy ra, nắm bắt được cảm xúc của người lao động để có thể thoải mái giao tiếp, kết nối họ tốt hơn. 

Quản lý các mối quan hệ

Hầu hết các mối quan hệ đều có những mâu thuẫn và các nhà quản lý nguồn nhân lực có thể giúp nhân viên của mình khắc phục được điều này. Tổ chức các chương trình giao tiếp mở là cách tốt nhất để quản lý các mối quan hệ. Chính EI tạo ra cho bạn khả năng này chứ không một năng lực nào khác. 

Poskey cũng nhấn mạnh rằng trí thông minh cảm xúc là yếu tố giúp bạn chinh phục quá trình giao tiếp, thực hiện các công tác lãnh đạo, giải quyết xung đột và hợp tác lâu dài trong sự phát triển chung của ngành tuyển dụng nhân sự. Thông qua năng lực EI và lợi ích từ việc quản lý các mối quan hệ cũng giúp bạn xác định được những giá trị thật sự mà bạn đóng góp cho một tổ chức/doanh nghiệp.

Dù cho là năng lực xã hội hay năng lực cá nhân, thì đó đều là những năng lực xuất phát từ trí thông minh cảm xúc. Tùy vào kinh nghiệm hay tiềm năng sẵn có mà mỗi cá nhân sẽ có một giới hạn trí tuệ cảm xúc khác nhau. Song, mọi năng lực của EI đều có tính quyết định, chi phối và ảnh hưởng sâu sắc đến quá trình công tác nhân sự.

Nếu bạn đang tò mò liệu rằng mình có phải là người có trí tuệ cảm xúc cao, có khả năng duy trì tính ổn định về cảm xúc hay không, hãy làm một bài kiểm tra tính cách với công cụ trắc nghiệm tính cách của TopDev.

Lưu ý: Bài test dành cho Tất cả các lập trình viên/người làm trong lĩnh vực công nghệ thông tin.

  Các vị trí tuyển dụng ngành IT khiến nhà tuyển dụng đau đầu
  Những sai lầm phổ biến trong Tuyển dụng Nhân sự

Phát triển chiến lược nhân sự với EI

Với những lợi ích thiết thực từ trí thông minh cảm xúc, bạn nên áp dụng EI trong công tác thực hiện, sắp xếp và phát triển chiến lược nhân sự. Vậy phải làm thế nào để áp dụng EI trong việc phát triển chiến lược nhân sự?

Hãy ghi nhớ 3 bước sau đây:

Xây dựng văn hóa gắn kết từ trong ra ngoài

Đơn giản bạn hãy hình dung nền văn hóa gắn kết giống như một mạng lưới các mối quan hệ được liên kết chặt chẽ giữa con người và môi trường làm việc của họ, và tất nhiên có sự tương tác như một tổng thể mạch lạc. Khi nắm bắt được tổng thể, tức là bạn đã bước đầu xác định được giá trị văn hóa và định hướng phát triển.

Tập trung vào các nhà lãnh đạo

Mức độ EI của các nhà lãnh đạo ảnh hưởng trực tiếp đến mức độ tham gia và hiệu suất công việc từ nhân viên của của họ. Vì thế để phát triển chiến lược toàn diện, chúng ta nên tập trung vào các nhà lãnh đạo, sử dụng EI của bản thân để tạo sự kết nối. 

Lúc này, các năng lực EI cần được phát huy một cách tối đa như khả năng nắm bắt cảm xúc, hiểu được suy nghĩ và quản lý mối quan hệ xã hội. Đây là cơ hội tiếp cận, trao đổi để tạo ra cơ sở thông tin cần thiết giúp hoàn thiện chiến lược nhân sự tốt hơn.

Ưu tiên tạo ra sự kết nối cảm xúc

Kết hợp hai bước trên bạn sẽ xây dựng được một chiến lược nhân sự với giá trị văn hóa, định hướng và nguồn dữ liệu là thông tin từ các nhà lãnh đạo giàu kinh nghiệm.

Lưu ý rằng văn hóa gắn kết con người cần đặt lên hàng đầu vì nó là nền tảng quan trọng giúp phát triển chiến lược. Tạo ra sự kết nối rất quan trọng vì giúp thúc đẩy sự liên kết về cảm xúc của nhân viên và khách hàng, đồng thời ảnh hưởng đến mức độ tham gia và khả năng hình thành mối quan hệ mạnh mẽ giữa họ. 

Điểm hạn chế của EI – Trí thông minh cảm xúc

Một nghiên cứu mới từ Đại học Manchester Metropolitan và Trường Kinh doanh EMLyon ở Pháp cho biết: “Các nhà quản lý sở hữu năng lực trí tuệ cảm xúc ở mức độ cao, nhiều khả năng không nhận được sự đánh giá tích cực và đạt hiệu quả trong công việc khi được so sánh với các nhân sự khác cùng cấp bậc.”

Cũng theo đó, Giáo sư Nikos Bozionelos của EMLyon, một trong những nhà nghiên cứu cũng chỉ ra trí tuệ cảm xúc hoạt động “năng suất” đến một thời điểm nhất định và sau đó rơi vào trạng thái không hiệu quả, có thể phát sinh những tác động tiêu cực không mong muốn.

Đơn giản có thể giải thích như sau: Gia tăng sự thông minh về cảm xúc vượt quá mức giới hạn (Beyond limits) sẽ tạo ra tác động ngược. Khi một người lãnh đạo, cấp trên phụ trách quản lý nhân sự có quá nhiều trí thông minh cảm xúc sẽ dẫn đến sự khó kiểm soát về năng lực EI.

Chẳng hạn, do có quá nhiều EI liên quan đến sự đồng cảm, điều này vô tình khiến người quản lý nhân sự trở nên ngần ngại áp dụng các chính sách, biện pháp giải quyết về chuyên môn. Họ sợ sẽ tạo ra gánh nặng cho cấp dưới. Đây cũng chính là hạn chế khi một cá nhân bị chi phối quá nhiều về năng lực cảm tính, họ trở nên do dự, không quyết đoán trước những quyết định quan trọng. Vì thế, họ dần mất đi sự nhìn nhận chính xác về năng lực của mình trong mắt nhân viên.

Lời kết

Quay trở lại phần đầu của bài viết này, chúng tôi đã đặt ra câu hỏi: Liệu rằng các chuyên gia về quản trị nhân sự có nên sở hữu trí tuệ cảm xúc?

Câu trả lời là . Và tất nhiên cũng có nhiều lý do quan trọng để các chuyên gia nhân sự nên thành thạo về trí thông minh cảm xúc. Thực tế cho thấy, xu hướng chung hiện tại ở các công ty nhân sự là các quản lý cấp cao thường lựa chọn người thông minh từ những trải nghiệm, thay vì lựa chọn người thông minh từ sách vở. Cách lựa chọn như thế không có nghĩa là trí thông minh học thuật là không quan trọng. Điều đó chỉ có nghĩa là chúng ta cần phải hiểu rõ hơn về bản thân, nhận biết và kiểm soát tốt cảm xúc của chính mình. Có thế, bạn sẽ tìm thấy sự cân bằng giữa năng lực chuyên môn và năng lực trí tuệ cảm xúc, dung hòa nó để trở nên thành công hơn. 

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

Xem thêm Top Việc làm Developer trên TopDev

Lập trình viên … trưởng thành

Bài viết đã được sự cho phép của tác giả Vũ Công Tấn Tài

Người ta thường dùng những danh hiệu như Fresher, Junior, Senior, … để chỉ cấp bậc hoặc kinh nghiệm làm việc của một lập trình viên, những thứ này có thể các bạn đã quá quen thuộc. Chúng ta dành rất nhiều thời gian để phân loại, hoặc nói về việc như thế nào là Fresher, như thế nào là Junior, … Mọi thứ dường như có vẻ phức tạp.

  10 câu nói cực hay về lập trình
  10 hiểu lầm tai hại về lập trình

Mình không phản đối cách phân cấp này, tuy vậy mình muốn mang đến cho mọi người 1 góc nhìn mới, đơn giản và dễ hiểu hơn về cách phân cấp lập trình viên. Hình dung trong cuộc sống, dù chúng ta có nhiều tên gọi khác nhau cho các giai đoạn của cuộc đời (thiếu nhi, thiếu niên, thanh niên, trung niên, cao niên, …), chúng ta vẫn có thể nhìn 1 người nào đó dưới góc độ “sự trưởng thành”. Tương tự, chúng ta có thể đánh giá 1 lập trình viên dựa trên sự TRƯỞNG THÀNH của họ.

Trưởng thành là có trách nhiệm với việc mình làm

Đây có lẽ là yếu tố tiên quyết cho việc nhìn nhận một người thực sự trưởng thành hay chưa, và lập trình viên cũng vậy. Chúng ta cần có trách nhiệm với những gì được giao, chúng ta phải nỗ lực để đảm bảo các yêu cầu được hoàn thành đúng thời hạn. Hoàn thành không chỉ có nghĩa là tạo ra một kết quả đúng, mà còn phải hoàn thiện sao cho tốt nữa (code sạch, hiệu suất tốt, bảo mật, …).

Ở một vài khía cạnh nào đó, lập trình viên là người đầu tiên phải test sản phẩm, phải đảm bảo code của mình thực sự chạy đúng chứ không phải chỉ biết phó thác điều đó cho tester. Đôi khi một tester bắt được nhiều bug không phải là do người tester giỏi, mà đơn giản là người viết code đã không đủ tốt.

Trưởng thành là không dựa dẫm vào người khác

Khi mới đi làm, có thể bạn sẽ cần tới sự hướng dẫn và giúp đỡ của nhiều người. Điều này không có gì là xấu, tuy nhiên chúng ta cần phải có ý thức cải thiện khả năng của mình theo năm tháng. Đừng hỏi sự giúp đỡ 2 lần với cùng 1 vấn đề. Hãy tự biết rút ra kinh nghiệm cho bản thân.

Đừng chỉ biết thụ động đợi leader giao việc, thay vào đó hãy luôn cố gắng đóng góp ý kiến trong các buổi thảo luận, mạnh dạn đưa ra giải pháp và bảo vệ giải pháp của mình. Hãy biết cùng mọi người giúp đỡ lẫn nhau để hoàn thiện sản phẩm chứ đừng chỉ biết đổ lỗi cho người này đã viết code tệ hay người kia đã test không kĩ khi sản phẩm có lỗi.

Đừng xin lỗi, hãy trở nên tốt hơn. Dù xây dựng phần mềm là việc làm có tính teamwork nhiều người, nhưng hãy luôn sẵn sàng để có thể giải quyết được một mình.

Trưởng thành là biết thừa nhận khuyết điểm

Các cụ có câu: nhân vô thập toàn. Có nghĩa là không ai là không có khuyết điểm, ai cũng có điểm gì đó mà mình không thật sự giỏi. Đừng ngại thừa nhận điều mình không biết / làm sai, để học hỏi, để nhờ người khác giúp đỡ, và để tiến bộ hơn.

Nghe thì có vẻ hiển nhiên, nhưng thật sự là có rất nhiều người không bao giờ chịu thừa nhận mình sai dù cho đã được nhiều người góp ý. Họ luôn cho rằng giải pháp của họ là tốt nhất, công cụ này là nhất, công cụ khác là không tốt, … Mình đã từng gặp những người luôn cho rằng Web là nhất, Mobile chỉ là thứ nhỏ bé, React là nhất trong khi Angular là rác rưởi, ..v.v. Mình nghĩ rằng đây không phải là một thái độ tốt.

Khi quá tôn thờ một điều gì đó, bạn đánh mất cơ hội có được những điều khác tốt hơn.

Trưởng thành là luôn dám đương đầu với thách thức

Như đã nói, khi mới bắt đầu công việc, chúng ta có thể cần tới sự giúp đỡ và hướng dẫn của những người đi trước. Khi bạn còn ít kinh nghiệm, có thể là bạn chỉ được giao những nhiệm vụ nho nhỏ như fix một lỗi giao diện, làm một hàm ultility bổ trợ cho các lớp logic phía trên, …v.v.. Ít ai dám giao cho bạn công việc lớn như thiết kế nguyên một module phụ trách thanh toán, kiểm tra quyền truy cập …

Tuy vậy, theo thời gian, bạn cần phải chứng tỏ được khả năng có thể đảm đương được những công việc lớn hơn, có ảnh hưởng nhiều hơn. Nếu cấp không chủ động, thì hãy thử mở lời rằng bạn muốn làm thứ gì đó lớn hơn coi sao. Tất nhiên là bạn phải nỗ lực để hoàn thành công việc, để chứng minh rằng mình có thể làm được những việc phức tạp.

Không cần phải quá vội, nhưng hãy tiến bộ từng chút một. Đừng thấy việc khó mà thoái thác cho người khác, như vậy là bạn tự đánh mất cơ hội của chính mình đấy.

Trưởng thành là có thể giúp đỡ người khác

Điều này thì chắc là cũng dễ hiểu, lúc bắt đầu bạn được người khác giúp đỡ, sau đó thì tới lượt bạn dùng kinh nghiệm của mình giúp đỡ lại những người mới khác. Bạn cần phải giúp nhóm của mình nâng cao khả năng của từng thành viên, như vậy thì nhóm mới mạnh và làm được nhiều việc lớn hơn.

Ngoài ra, người ta còn cho rằng, khi hướng dẫn lại cho người khác, tức là bạn đang học tới 2 lần. Mình tin điều này là đúng. Trong lúc hướng dẫn người khác, có thể bạn sẽ phát hiện ra những góc nhìn mới rất thú vị. Bạn cũng có thể được lòng nhiều người khi đã giúp đỡ họ, điều này thật sự là cần thiết trong việc nâng cao uy tín cho bản thân.

Bởi vậy, đừng chỉ biết mỗi bản thân, hãy tỏ ra hữu ích và trách nhiệm bằng việc hỗ trợ những người khác.

Tổng kết

Mình từng gặp nhiều khó khăn khi cố vạch ra những giới hạn rõ ràng cho những khái niệm như Fresher, Junior, Senior, … Vì thế mà mình gặp phải khó khăn khi không biết làm thế nào để đạt được những mức độ tương ứng.

Khi nhìn nhận khả năng và vai trò của lập trình viên dưới góc nhìn của sự trưởng thành, mình cảm thấy nó dễ hiểu và dễ hình dung hơn, từ đó việc xây dựng kế hoạch rèn luyện và phát triển cũng dễ dàng hơn, và mình muốn chia sẻ điều đó với mọi người trong bài post này.

Cuối cùng, trưởng thành không chỉ gói gọn trong những điều trên, nó còn nhiều hàm ý rộng lớn hơn nữa, ví dụ như việc xây dựng tính kỉ luật, có được sự kiên trì, biết mình thật sự muốn gì và vạch ra con đường đi, sáng tạo, … Nhưng cũng giống như các giai đoạn của cuộc đời, bạn liên tục phải giải quyết nhiều vấn đề mới, vậy nên đừng ngại để luôn đối mặt và vượt qua nó.

Đừng để bạn chỉ lớn lên, mà không hề trưởng thành.

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

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

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

Cùng Hana’s Lexis tìm hiểu quy trình tuyển dụng của các công ty công nghệ hàng đầu tại Mỹ

Về Vlogger: Hana’s Lexis

Là cái tên nổi bật trong làng Vlogger, kênh YouTube của Hana’s Lexis đã thu hút tới hơn 520.000 lượt đăng ký theo dõi, bên cạnh trang blog facebook cũng hot không kém với hơn 130.000 lượt Thích và Theo Dõi. 

Không sở hữu gương mặt của các nàng hot girl, hay cuộc sống sang chảnh. Điều “mang” subscribers và followers đến Hana nằm ở những chia sẻ hết sức hài hước và thú vị về chủ đề học tiếng Anh, cùng những quan điểm rất chân thật của cô nàng. Tuy nhiên, ít ai biết ngoài trình tiếng Anh siêu đẳng với điểm IELTS tuyệt đối 9.0 của mình, Hana còn là 1 lập trình viên, và hiện chị đang sinh sống và làm việc tại Mỹ.

Chia sẻ về quá trình phỏng vấn những công ty công nghệ hàng đầu tại Mỹ, Hana cho biết chị không mang tư tưởng phải đậu hay với mục đích kiếm việc làm, mà chỉ để thử sức cũng như tích lũy kinh nghiệm, trau dồi vốn kiến thức, từ đó biết mình yếu chỗ nào để luyện tập và học hỏi thêm.

Hành trình “apply dạo” và trải nghiệm quy trình độc đáo

Lần này chị muốn chia sẻ 1 chút về chủ đề “Kinh nghiệm phỏng vấn ở các công ty Mỹ” và cụ thể hơn là tại 1 công ty startup tại San Francisco là Mapbox và đáng chú ý hơn hết chính là Amazon. Amazon thì đã quá nổi tiếng, và là 1 trong những trang thương mại điện tử hàng đầu thế giới, vậy còn Mapbox thì sao? Theo chia sẻ của Hana, họ là công ty tạo ra những ‘bản đồ’ mà bạn hay thấy trong những app khác, ví dụ như Google Maps chẳng hạn… hay là khi bạn mở các app không phải để chỉ đường ví dụ như Foody và có bản đồ những nơi ăn uống trong đó, thì Mapbox sẽ là nơi cung cấp các giải pháp bản đồ đó cho các công ty khác tùy theo nhu cầu của họ, quả là 1 startup thú vị phải không nào.

Hana’s Lexis cũng không ngại chia sẻ 1 chút về trải nghiệm phỏng vấn ở 1 công ty Mỹ như Mapbox, dù chỉ là 1 công ty startup, nhưng Mapbox cũng thuộc dạng khá là lớn. Đồng thời Hana cũng không quên khoe sự hào hứng của mình với văn hóa startup của họ, trụ sở của Mapbox chiếm nguyên 1 tầng (khá giống văn phòng của TopDev), sau đó trang hoàng lại thành nhiều phòng, ngoài phòng họp và làm việc sẽ là những phòng nghỉ ngơi, đọc sách giải trí cho các nhân viên.

Bằng cách ‘apply’ dạo trên mạng, Hana đã nhận được mail từ Mapbox có kèm link để làm bài test online, và ở đây họ còn không giới hạn thời gian làm bài như những nơi khác. Thay vì làm 1-2 bài như những nơi khác, trong vòng 60-90 phút cho 1-2 bài. Các ứng viên của Mapbox có thể làm 3 bài trong thời gian tận 6 tiếng. Điều này tạo cảm giác thoải mái cho các ứng viên, miễn sao “bạn tự giác, không copy, paste là được.”

“Quan trọng lúc làm test online là mình phải tự trung thực, vì nếu không thì tới khi bạn lên onsite phỏng vấn trực tiếp bạn sẽ thành trò cười cho thiên hạ”

Tại vòng phỏng vấn tiếp theo, vì một số lý do thời tiết và khách quan, Hana tới trễ 20 phút, và bị âm điểm về ‘behavioral’. Vòng behavioral bao gồm những câu hỏi về tiểu sử bản thân, tình huống xử lý qua lại, mình là người như thế nào, nhưng với khoảng 5 phút còn lại để trả lời nên Hana chưa thực sự hoàn thành tốt vòng này. Tiếp theo 2 câu sau sẽ là về phần ‘technical’ và chung với 1 người trong team của Mapbox. Hana chia sẻ thêm quan điểm cá nhân:

“Ở Mỹ sẽ có 2 dạng phỏng vấn. Dạng thứ nhất là leetcode (1 trang web để thực hành giải thuật toán). Dạng thứ hai, khác với leetcode, nhà tuyển dụng sẽ ghép đôi (pairing) bạn với 1 người trong team, để cùng giải quyết các vấn đề thực tế để họ thấy được năng lực làm việc hàng ngày cùng team của bạn sẽ ra sao. Nhưng những nơi mà mình đi thì sẽ phỏng vấn theo kiểu giải toán, giải các bài tập coding như trên leetcode hay là HackerRank.”


HackerRank như là 1 dịch vụ, là 1 nơi mà bạn có thể lên làm bài tập, luyện về coding. Và nó còn có 1 dịch vụ là tạo ra những room để những người phỏng vấn và người được phỏng vấn đăng nhập vào 1 link để code. Theo Hana, cách này cũng khá là hay vì sẽ không cần phải viết code lên bảng, việc gõ trên HackerRank sẽ giúp bạn cảm thấy quen thuộc hơn. Và ở Mapbox mỗi lần phỏng vấn họ sẽ cho bạn 1 link để làm bài trên HR.

“Lúc làm bài quan trọng là phải ‘communicate’ với người ta, cho họ biết là mình đang suy nghĩ gì, hướng giải quyết của mình là như thế nào, đồng thời giải thích tại sao mình lại chọn cách này không chọn cách kia và về độ không gian và thời gian nó có lợi như thế nào.”

“Nói chung mục đích của việc phỏng vấn ở các công ty Mỹ, chủ yếu sẽ là ‘problem solving – giải quyết vấn đề’ và vừa phải ‘communication – giao tiếp’ nữa, phải ‘thinking out loud – nghĩ gì nói đó’, phải nói ra suy nghĩ của mình để họ hiểu được hướng giải quyết của mình, vì cho dù có giải đúng mà bạn không nói gì, thì họ cũng không tha thiết lắm mà còn có thể đánh giá bạn là người khó làm việc cùng”.

Hai bài technical làm tại Mapbox theo tác giả không khó lắm, một bài là về kiểu design: thiết kế một function để đáp ứng yêu cầu, bài còn lại tương tự như giải thuật toán. Theo Hana, về bài design chị nhận help & hint khá nhiều nên bản thân chị cũng không cảm thấy ổn lắm. Bài cuối thì khá dễ, chị cho rằng mức độ của câu này chỉ tầm ‘trên mức dễ và thấp hơn trung bình 1 chút’.


Sau đó Hana tham dự phỏng vấn tại Amazon.

Mục đích của mình khi đi phỏng vấn Amazon, đậu là 1 phần, do mình biết năng lực bản thân cũng chưa đủ tầm, nên mục đích lớn nhất của mình là ‘KHÔNG LÀM TRÒ HỀ CHO THIÊN HẠ – make a fool of myself – in front of the interviewers.”

Nếu các buổi phỏng vấn tại Mapbox là tự túc di chuyển, các công ty lớn như Amazon sẽ hỗ trợ vé máy bay, khách sạn để đón ứng viên. Nhà tuyển dụng sẽ mất thời gian nếu ứng viên thực sự không đạt yêu cầu trung bình, và Hana không muốn mình là một trong số đó. Tuy nhiên, Hana đã không để chuyện đó xảy ra, tuy không được offer nhưng cô cho hay là buổi phỏng vấn không khó như mình nghĩ.

“Bắt đầu phỏng vấn từ lúc 9h và sẽ liên tục tới 9h50, nghỉ 10 phút rồi 10h tới 10h50, nghỉ 10 phút … thì tới 1h chiều là sẽ hoàn tất, bao gồm cả ăn trưa.”

Hana chia sẻ chị khá thích kiểu phỏng vấn như thế vì sẽ tạo cảm giác thoải mái và tạo hiệu quả tốt hơn cho các ứng viên,. Chị còn chia sẻ 1 điểm khá thích thú về Amazon đó chính là họ còn cho phép mang cún cưng vào văn phòng, và lúc ngồi ở sảnh chờ phỏng vấn chị còn thấy rất nhiều chó cưng ở khắp nơi, đủ thể loại, ‘dễ thương kinh khủng’ – Hana chia sẻ 1 cách chân thật. 

Trong bài phỏng vấn đầu tiên, người phỏng vấn chị là một người Ấn Độ, từng làm ở Amazon Nhật Bản. Và ở Amazon lúc nào cũng sẽ theo dạng câu hỏi behavioral trước rồi mới tới câu hỏi kỹ thuật trong khoảng 50 phút. Phần behavioral là 20 phút và technical sẽ là 30 phút. Nên bạn sẽ nhận được khá nhiều câu hỏi về behavioral với 20 phút x 4 là 80 phút chỉ để nói về tiểu sử, thời gian làm việc, kinh nghiệm làm việc. Hay là kể về 1 lần mà bạn cãi nhau với sếp, tại sao lại cãi, và cách mình bảo vệ chính kiến của mình ra sao, cách mà 1 lần mình giải quyết 1 vấn đề phức tạp bằng 1 cách đơn giản v..v.. Hana chia sẻ rằng bên Amazon hỏi nhiều tới mức mà khi xong buổi phỏng vấn thử 3 thì chị còn không biết mình còn gì để nói không vì họ đã hỏi hết cả rồi.

Đặc biệt ở Amazon, họ còn có ‘14 guiding leadership principles‘, và họ rất tập trung trong việc phác họa những candidate – ứng viên như mình. Dựa vào kinh nghiệm quá khứ của mình để họ xem mình có phù hợp với các ‘guiding leader principles’ đó không, ví dụ: 

‘ownership’ tức là làm chủ những gì đang làm, 

phải có ‘backbone’ để bảo vệ chính kiến của mình, 

‘customer obsession’ – cuồng khách hàng, là cố gắng làm vừa lòng khách hàng

Đó là những principles của Amazon và mỗi nơi sẽ có 1 principle khác nhau, riêng Amazon thì các principle này khá quan trọng cho việc phỏng vấn, và đôi lúc sẽ là ‘make or break’ luôn, tức là cho dù bạn làm rất tốt về phần technical nhưng lại không phù hợp với các principles đó thì có thể họ cũng sẽ không ‘hire’ – thuê bạn. 

Về phần phỏng vấn principles – behavioral này thì Hana cũng cảm thấy rất biết ơn về những người bạn gửi lời động viên, khuyên nhủ tới chị, dù chưa hề quen biết nhau như thông qua kênh Youtube của mình, chị đã được nhiều sự giúp đỡ từ những người đã từng làm hay có người quen ở Amazon để chia sẻ kinh nghiệm. 

Quay lại vòng phỏng vấn đầu tiên, Hana cho rằng phần technical này chỉ thuộc mức dễ trên Leetcode thôi, và chỉ còn chia sẻ thêm Leetcode là nơi để làm bài tập giải đáp câu hỏi về phỏng vấn lập trình. Và chị cảm thấy khá ok với bài đầu của mình và anh Ấn Độ cũng là người đánh giá chị tốt nhất. 

Ở vòng 2, có hai người phỏng vấn: 1 manager và ‘shadow interviewer’, tức chỉ học hỏi kinh nghiệm. Câu hỏi lần này là về design 1 function. nhưng do không hiểu câu hỏi lắm nên Hana khá là struggle và không hiểu lắm về ‘clarify’, những cái yêu cầu của đề bài, và họ cố tình đặt câu hỏi không rõ ràng như vậy để xem bạn có hỏi những câu hỏi đắt giá hay không, có tìm ra được những cái mấy chốt vấn đề để mà giải quyết hay không. 

Do chưa chuẩn bị kĩ nên Hana cũng không đưa ra được các câu hỏi đắt giá hay vào những chỗ cần phải tập trung nên chị cho rằng đây là phần phỏng vấn tệ nhất của ngày hôm đó. Đối với Hana, lần phỏng vấn onsite thứ 2, sau lần đầu tại Mapbox, hoàn toàn khác hẳn. Mapbox casual, thoải mái hơn nên so với công ty lớn như Amazon chị cũng có hơi khớp 1 chút.

Vòng thứ 3, người manager chỉ hỏi toàn bộ về behavioral, và Hana chia sẻ là ‘nói hết vốn luôn’. Chị cũng cảm thấy lạ 1 chút vì nó không có câu hỏi ‘technical’. Nên trong 4 vòng thì chỉ có 3 vòng là có câu hỏi ‘technical’ thôi.

Vòng thứ 4, phần cuối cùng, thì phần technical này Hana cho là phần giống các câu hỏi Leetcode nhất, giải các thuật toán, cấu trúc dữ liệu,…. Nhưng Hana không quen với ‘whiteboard coding’ cho lắm, nên lần này vẫn phải nhận hint từ người phỏng vấn, dù nhận hint xong vẫn giải được nhưng hint nhiều quá cũng không tốt, vì mình sẽ không tự lập được và để người ta chỉ hướng.

Sau tất cả, Hana nhận được sự đánh giá là ‘borderline candidate’, tức là 1 ứng viên ‘mém’ được offer, nhưng do phần technical còn yếu nên đành hụt mất cơ hội này. Còn phần behavioral thì Hana khá là tự tin, và chị còn cảm thấy rất biết ơn Amazon vì nhờ học và trả lời rất nhiều về phần ‘behavioral’ nên chị sẽ không phải học thêm về nó nữa. Chị còn khá nhẹ nhõm vì mình đã đạt được mục đích của mình là không tự làm bẽ mặt bản thân mà còn được nhận là ‘borderline candidate’.

Chị còn chia sẻ thêm mình là candidate được các người phỏng vấn bàn tán nhiều nhất, nhưng vì là 1 công ty lớn nên họ sẽ không mạo hiểm, và nếu không chắc chắn họ sẽ không tuyển. Vì dù sao bạn vẫn có thể về luyện tập thêm, để 6 tháng – 1 năm sau có thể thử lại. 

“Điều mình thích ở công ty lớn đó là bạn được nhận hay không là do bản thân bạn thôi!” bạn sẽ chỉ đấu tranh với bản thân mình thôi chứ không cần phải đấu tranh với ai khác, và phụ thuộc vào thực lực của bạn. Cũng như những công ty như Amazon, Facebook, Google, Microsoft, Netflix, Apple thì chỉ cần 1-2 ngày sau là họ đã có kết quả phỏng vấn, dựa vào ‘performance’ của mình để quyết định tuyển bạn hay không.


Đối với các công ty quy mô nhỏ, nhiều người cùng ứng tuyển cho 1 vị trí nên cũng có nhiều yếu tố hên xui trong đó, mặc dù bạn làm tốt nhưng có người khác làm tốt hơn, hay dù họ không làm tốt bằng bạn nhưng lại phù hợp với văn hóa của team hơn, được manager thích hơn thì bạn cũng có thể rớt dễ dàng. 

Sau các buổi phỏng vấn này, Hana chia sẻ chị đã có nhiều kinh nghiệm phỏng vấn ở công ty lớn, và làm cho chị tự tin hơn hẳn. Và chỉ cần luyện tập thêm, chị hoàn toàn có thể làm việc được ở những công ty lớn. Và theo resolution của mình, thì đây cũng chỉ là bắt đầu năm 2020, nên Hana cũng không cảm thấy buồn. Ngoài ra chị còn hào hứng chia sẻ với chúng ta là sắp tới Hana sẽ có 1 buổi phỏng vấn với 1 ông lớn trong lĩnh vực tech đó chính là Google.

Hãy cùng theo dõi kỳ tiếp theo khi Hana tham dự vòng tuyển dụng tại công ty công nghệ đáng mơ uớc nhất Google và cách chị chuẩn bị CV trước khi apply tại các công ty này nhé.

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

Xem thêm các việc làm Intern Developer tại TopDev

 

Cách tối ưu hóa hiệu năng khi lập trình Java

Trong Java việc tối ưu hoá hiệu năng là công việc rất quan trọng, nó không chỉ giúp code thông thoáng hơn, giúp tiêu tốn ít tài nguyên hệ thống hơn, mà các kĩ thuật được trình bày dưới đây sẽ giúp nâng cao hiệu suất (performance) làm việc của Java khi chạy chương trình!

Một lập trình viên Java có kinh nghiệm luôn coi việc tối ưu hoá hiệu năng như là 1 phần quan trọng của công việc lập trình, trang bị những kĩ thuật, thủ thuật tối ưu sẽ thể hiện một lập trình viên có trình độ và coi nó như 1 kĩ năng không thể thiếu khi làm việc với Java.

Các kĩ thuật dưới đây không phải là những giải thuật toán học cao siêu, cũng không phải triển khai 1 cách phức tạp, đôi khi chúng rất dễ để thực hiện nhưng rất nhiều lập trình viên không để ý hoặc chưa biết cách để triển khai nó.

  Dev Java đã biết đến 20 thư viện này chưa? (P1)
  Dev Java đã biết đến 20 thư viện này chưa? (P2)

1. Tổng quát

a. Sử dụng lại đối tượng

b. Lưu ý khi viết cấu trúc điều khiển(if, else, while, …)

– Phải sắp xếp đúng thứ tự ưu tiên cho các biểu thức logic

– Xem xét vòng lặp lựa chọn có phù hợp hay không(for, while, do while)?

– Xem xét vòng lặp điều kiện có kết thúc hay không?

– Tối ưu điều kiện kiểm tra của vòng lặp for

– Xem xét việc tính toán có thể được đưa ra ngoài vòng lặp không?

– Khai báo biến tạm để tránh phải gọi hàm tính toán nhiều lần.

c. Lưu ý khi thao tác I/O với file hệ thống

– Tắt line buffering

– Sử dụng các class Reader/Writer để đọc và ghi file theo dòng

– Caching

d. Lưu ý khi thực hiện lập trình đa luồng

e. Sử dụng StringBuilder để nối xâu

f. Phải có thời gian timeout trong các giao tiếp với hệ thống ngoài

g. Tránh ghi log ra console

2. Chi tiết thực hiện

a. Sử dụng lại đối tượng

Có 2 kỹ thuật chính là: Dedicated object reuse và Object pool. Tùy theo trường hợp mà sử dụng một cách hợp lý

– Dedicated object reuse: Khi đối tượng xử lý thường xuyên một công việc lập đi lặp lại.

VD: Cần thực hiện một công việc lập đi lập lại chuyển một đối tượng kiểu Date sang kiểu String. Trong trường hợp này ta nghĩ đến việc sử dụng lại đối tượng Date Formating.

private final SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss");

– Object pool:

+ Trường hợp chúng ta có một loại object(ví dụ object connection kết nối với database), và nhiều tiến trình khác nhau có thể sử dụng đoạn code mà sử dụng object này.

+ Để tránh xung đột giữa các thread trong việc dùng chung object, ta có thể sử dụng synchronized block với block object. Nhưng cách này sẽ chậm hơn việc tạo mới object trên từng thread.

+ Giải pháp trong trường hợp này là xây dụng object pool chứa tập các object có vai trò như nhau. Các thread khác nhau khi cần 1 object thì có thể lấy từ pool, sau khi dùng xong có thể trả lại object cho pool để các thread khác có thể sử dụng.

b. Lưu ý khi viết cấu trúc điều khiển(if, else, while, …)

– Phải sắp xếp đúng thứ tự ưu tiên cho các biêu thức logic

Với câu lệnh:

if(slowFunction() && (i>=0) && (j>i )){}

Phải chuyển thành

if((i>=0) && (j>i ) && slowFunction()){}

– Xem xét vòng lặp lựa chọn có phù hợp hay không(for, while, do while)?

Ví dụ:

while(!isOptimize()){
        doOptimize();
}

Nếu trạng thái đầu là chưa optimaze thì nên chuyển thành.

do{
       doOptimize();
while(!isOptimize());

– Xem xét vòng lặp điều kiện có kết thúc hay không?

public void sillyLoop(int i)
{
        while(i!=0){
               i--;
        }
}

Nếu trường hợp i<0 vòng lặp sẽ vô hạn.
Nên chuyển thành

public void sillyLoop(int i)
{
        while(i>0){
               i--;
        }
}

– Tối ưu điều kiện kiểm tra của vòng lặp for

for(int i=0; i<str.length();i++)

Nên chuyển thành

for(int i=0; len=str.length(); i<len;i++)

– Xem xét việc tính toán có thể được đưa ra ngoài vòng lặp không?

for(int i=0; i<n; i++){
double temp=Math.sin(Math.PI/5) + Math.cos(Math.PI/7);
if(check()==temp){
//
 }
}

Nên chuyển thành

double temp=Math.sin(Math.PI/5) + Math.cos(Math.PI/7);
for(int i=0; i<n; i++){
if(check()==temp){
//
 }
}

– Khai báo biến tạm để tránh phải gọi hàm tính toán nhiều lần.
Ví dụ:

if(max<calcScore()){
     max=calcScore();
}

Phải chuyển thành

temp=calcScore();
if(max<temp){
     max=temp;
}

c. Lưu ý khi thao tác I/O với file hệ thống

– Tắt line buffering: Khi sử dụng PrintStream để ghi dữ liệu ra file, thiết lập mặc định của PrintStream cho phép nó khi gặp ký tự xuống dòng(“\n”) thì sẽ thực hiện flush dữ liệu xuống file. Tuy nhiên trong trường hợp ta ghi nhiều dòng dữ liệu ngắn, việc tự động flush dữ liệu xuống file khi gặp “\n” làm giảm hiệu quả buffering.
VD: PrintStream ps=new PrintStream(bos, false);

– Sử dụng các class Reader/Writer để đọc và ghi file theo dòng: Sẽ nhanh hơn sử dụng class DataInputStream khoảng 20% và không có các vấn đề về convert byte thành character.

– Caching: Khi cần phải đọc các dòng dữ liệu trong file nhưng không theo một thức tự xác định trước, ta nên xem xét việc đọc tất cả các dòng của file trước, lưu(cache) vào vùng nhớ của chương trình trong một ArrayList hoặc Vector để tránh việc thao tác với file nhiều lần.

Kết

Như bạn đã thấy, đôi khi không cần quá nhiều công sức để cải thiện hiệu suất trong Java. Hầu hết những cách trong bài này chỉ cần thêm một sự cố gắng nhỏ là có thể áp dụng chúng vào code của bạn. Chúc anh em thành công nhé.

Đừng quên xem thêm các bài viết:

Cơ hội việc làm Java hấp dẫn tại TopDev đang chờ bạn!

Nhân sự nên làm gì giữa tâm bão Coronavirus

Ngày 11.3 vừa qua, Tổ chức Y tế thế giới (WHO) đã chính thức công bố căn bệnh viêm đường hô hấp cấp (Covid-19) do chủng mới của vi-rút corona gây ra là “đại dịch toàn cầu”. Tính đến thời điểm hiện tại, dịch bệnh đã lan nhanh tại hơn 160 quốc gia và vùng lãnh thổ với số người nhiễm bệnh lên đến hơn 180.000 ca.

Trong vài tuần trở lại đây, các công ty đã gặp phải những khó khăn lớn về việc kiểm soát và đề ra phương án bảo vệ nhân viên mình ở cả trong và ngoài nước. Vậy trong bối cảnh nguồn nhân lực đang bị ảnh hưởng như hiện tại, điều gì cần phải lưu ý? Bài viết sau đây sẽ giải đáp một số thông tin cần thiết cho nhà tuyển dụng nói riêng và giới nhân sự nói chung.

Vi rút corona là gì?

Những cái tên được giới chuyên môn về y tế kể ra như:

  • Chủng virus mới 2019 
  • Covid-19
  • 2019-nCoV

Đây là chủng mới của coronavirus được xác định ở Vũ Hán, tỉnh Hồ Bắc, Trung Quốc. Virus nCoV, hay còn gọi là coronavirus, một loại virus đường hô hấp mới, gây bệnh viêm đường hô hấp cấp ở người và cho thấy có sự lây lan từ người sang người. Đây là chủng virus mới chưa được xác định trước đó. Cùng với nCoV, đã có 6 chủng coronavirus khác được biết tới ngày nay có khả năng lây nhiễm ở người. 

Theo Trung tâm kiểm soát dịch bệnh tại Hoa Kỳ, nguồn gốc của chủng đặc biệt này vẫn chưa được phát hiện và vẫn chưa có vắc-xin phòng ngừa virus này. 

Ở người, vi rút lây từ người này sang người kia thông qua tiếp xúc với dịch cơ thể của người bệnh. Tùy thuộc vào mức độ lây lan của chủng vi rút, việc ho, hắt hơi hay bắt tay có thể khiến người xung quanh bị phơi nhiễm. 

Người làm Nhân sự và những hành động cấp thiết

Cho đến khi tìm được vắc-xin hay những phác đồ điều trị, ức chế được sự phát triển của virus, các công ty nên có biện pháp trấn an tinh thần nhân viên. Tránh tạo ra những nguồn thông tin sai lệch làm ảnh hưởng tiêu cực đến nhân viên.

Một số điều cần làm để chúng ta có thể ngăn chặn coronavirus lây lan như: các nhân viên hạn chế việc chạm vào mắt, mũi và miệng của bạn bằng tay khi chưa vệ sinh sạch sẽ. Nếu có bất kỳ triệu chứng như ho, sốt, khó thở, đau nhức, cơ thể mệt mỏi, ngay lập thức phải báo cáo để làm công tác kiểm tra, giám định. tiêu đề tuyển dụng

Để đảm bảo cho sức khỏe của toàn thể nhân viên, công ty cần có những kế hoạch phòng chống cụ thể. Chẳng hạn như đề xuất việc làm việc tại nhà, làm việc từ xa thay vì phải lên công ty. Trường hợp nếu vẫn còn nhiều vấn đề công việc quan trọng và cần phải theo dõi tiến độ chặt chẽ, nên có giải pháp làm việc luân phiên nhau để kịp thời cập nhật tình hình công việc. 

Các nhân viên nên hạn chế nói chuyện trừ những trường hợp khẩn cấp. Công ty cần hỗ trợ nhân viên những vật dụng cần thiết như nước rửa tay, khẩu trang,.. hoặc thông tin về những lưu ý cho nhân viên để công tác phòng dịch tốt hơn.

  Những sai lầm phổ biến trong Tuyển dụng Nhân sự
  6 Xu hướng quản trị nhân sự năm 2024

Không phân biệt đối xử

Trước tình hình dịch bệnh ngày một chuyển biến phức tạp, nhiều kế hoạch của các công ty vẫn phải thực hiện và việc gặp gỡ trao đổi các đối tác vẫn diễn ra.

Theo trang thông tin SHRM, vì đây là giai đoạn nhạy cảm nên có thể làm gia tăng sự phân biệt đối xử giữa nhân viên với các đối tác nước ngoài, thậm chí là giữa sếp với nhân viên của mình. 

Các nhà quản lý, lãnh đạo nhân sự cần đối xử với những nhân viên của mình một cách công bằng và bình đẳng dù cho họ có dấu hiệu nhiễm bệnh hay là không. Đây là thời điểm mọi người cần ra sức chung tay bảo vệ cho bản thân và toàn tập thể thay vì có những thái độ dè bỉu, lo lắng và bất an với chính những đồng nghiệp xung quanh.

Chú trọng đến chính sách ốm đau cho nhân viên

Nhiều nhân viên tỏ ra sợ hãi và xem đó là cớ để thoát khỏi môi trường làm việc. Vì thế, nhà quản lý nhân sự cần nắm rõ xu hướng tâm lý, cảm xúc của nhân viên mình để có những động thái giải quyết phù hợp. 

Trừ những trường hợp thật sự có những dấu hiệu về sức khỏe có liên quan đến dịch bệnh, thì mọi công tác nhân sự vẫn tiếp diễn như bình thường. Đây cũng được xem là thời điểm tốt để người quản lý nhắc nhở các nhân viên mình về các chính sách ốm đau và vắng mặt của công ty.

Thông báo về việc lưu trú

Một số nhà quản lý nguồn nhân lực và lãnh đạo cấp cao có quyền truy cập, giám sát và thông tin cho các nhân viên của mình về dịch bệnh. 

Chẳng hạn, Tổ chức Y tế Thế giới, công bố các báo cáo hàng ngày về coronavirus đồng thời cung cấp một bản tóm tắt thông tin tình hình về các triệu chứng, giải pháp chăm sóc, phòng ngừa và điều trị. 

Lúc này, HR có vai trò quan trọng trong việc tuyên truyền và triển khai thực hiện các kế hoạch đối phó với dịch bệnh đến với nhân viên; bảo vệ nhân viên và đảm bảo rằng họ luôn được theo dõi tốt về tình trạng sức khỏe, thông tin chính xác về diễn biến dịch bệnh. Đây là biểu hiện rõ nhất minh chứng vai trò của việc quản trị nhân sự trong các tình huống cấp thiết nhất.    

Chúng ta không biết được những gì sẽ xảy đến tiếp theo. Tuy vậy, việc cần làm lúc này là các nhà quản trị nhân sự và các nhân viên cần đồng hành cùng nhau để ứng phó với những vấn đề như: bảo vệ sức khỏe, phòng chống dịch bệnh hay việc sẵn sàng giải quyết những khó khăn mà ngành Nhân sự đang phải đối mặt.

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

Xem thêm Top Việc làm Developer trên TopDev

Sử dụng useReducer và useContext để làm global state

Thông thường chúng ta sẽ dùng một nhà kho để chứa dữ liệu state như Redux, một component container bọc ở nút đầu tiên trong app, các component con bên trong có thể truy xuất và cập nhập các dữ liệu một cách dễ dàng

Với các API mới được React bổ sung là useStatecreateContextuseContext chúng ta có thêm một lựa chọn để làm nhà kho mà ko cần dùng đến Redux

Ví dụ chúng ta có 3 dữ liệu như bên dưới

const teamMembersNames = ["John", "Mary", "Jason", "David"];

const [sharing, setSharing] = React.useState([]);
const [help, setHelp] = React.useState([]);
const [pairing, setPairing] = React.useState(teamMembersNames);

Câu hỏi là làm sao chúng ta đưa dữ liệu vào nhà kho. Chúng ta sẽ dùng API createContext (tạo em cái kho)

Khi sử dụng React.createContext chúng ta sẽ nhận về 2 component là Provider (anh tung) và Consumer (em hứng).

// ./src/utils/store.js
export const StoreContext = React.createContext(null);

export default ({ children }) => {
  // các em đã vào nhà kho
  const teamMembersNames = ["John", "Mary", "Jason", "David"];

  const [sharing, setSharing] = React.useState([]);
  const [help, setHelp] = React.useState([]);
  const [pairing, setPairing] = React.useState(teamMembersNames);

  const store = {
    sharing: [sharing, setSharing],
    help: [help, setHelp],
    pairing: [pairing, setPairing]
  };

  return (
    <StoreContext.Provider value={store}>{children}</StoreContext.Provider>
  );
};

Để các component bên trong <App/> đều dùng được <Consumer />

// ./index.js
import React from "react";
import ReactDOM from "react-dom";

import App from "./App";
import StoreProvider from "./utils/store";

ReactDOM.render(
  <StoreProvider>
    <App />
  </StoreProvider>,
  document.getElementById("root")
);

Với bất kỳ component nào muốn sử dụng, để lấy được dữ liệu trong store, chúng ta sử dụng useContext

import React from "react";
import { StoreContext } from "../utils/store";

const SomeComponent = () => {
  // dữ liệu dùng chung
  const { sharing } = React.useContext(StoreContext);
};

Hoặc nếu thích dùng cách viết render props, có thể dùng luôn component <Consumer/>

<StoreContext.Consumer>
  {store => <InputComponent store={store} />}
</StoreContext.Consumer>

Ứng dụng làm useAuth

Một trong những ví dụ dễ thấy, phần dữ liệu nên đưa vào nhà kho chung là phần thông tin user đang đăng nhập

Chúng ta sẽ cần 3 phần

  1. Khai báo một nhà kho bằng createContext
  2. Bộ reducer làm nhiệm vụ cập nhập xử lý state
  3. Một hook tùy biến useAuth cung cấp các API cần thiết để tương tác với nhà kho chung đã khai báo
  4. AuthProvider.js Khai báo nhà kho (bản rút gọn)
// AuthProvider.js
import authReducer from "authReducer";

export const AuthContext = React.createContext(null);

export const AuthProvider = ({ children }) => {
  // khởi tạo
  const [state, dispatch] = useReducer(authReducer, {});
  return (
    <AuthContext.Provider value={[state, dispatch]}>
      {children}
    </AuthContext.Provider>
  );
};
  1. authReducer.js (bản rút gọn)
// authReducer.js
function authReducer(state, action) {
  switch (action.type) {
    case "login":
      const { authResult, user } = action;
      const expiresAt = authResult.expiresIn * 1000 + new Date().getTime();
      localStorage.setItem("expires_at", JSON.stringify(expiresAt));
      localStorage.setItem("user", JSON.stringify(user));
      return { user, expiresAt };
    case "logout":
      localStorage.removeItem("expires_at");
      localStorage.removeItem("user");
      return { user: {}, expiresAt: null };
    default:
      return state;
  }
}
  1. Một hook tùy biến useAuth
// useAuth.js
import { AuthProvider } from "AuthProvider";

export const useAuth = () => {
    const { state, dispatch } = userContext(AuthContext);
    const login = () => {
        // làm gì đó ở đây
    }
    const logout = () => {
        // làm gì đó ở đây
        dispatch({ type: "logout" })
    }
    // ...  còn một số thức khác
    const isAuthenticated = () => {
        return state.expiresAt && new Date().getTime() < state.expiresAt;
    };
    // ...  còn một số thức khác
    return {
        isAuthenticated,
        user: state.user,
        userId: state.user ? state.user : null;
        login,
        logout,
        handleAuthentication
    }
}

Với cách làm này, bất kỳ component nào sử dụng useAuth đều sẽ truy xuất đến một kho dữ liệu chung

import useAuth from "useAuth";

const MyCom = () => {
  const {
    /* quá trời thứ linh tinh trả về */
  } = useAuth();
  //...
};

TopDev via Vuilaptrinh

 

Các cách sử dụng AS, AS?, AS! một cách hiệu quả và an toàn trong code Swift

Chào các bạn, hôm nay chúng ta sẽ cùng nhau tìm hiểu rõ và chi tiết về các cách sử dụng các toán tử as, as?, as! trong Swift. Các toán tử này cũng là một trong những yếu tố tạo nên tính an toàn trong code Swift. Nếu bạn hiểu rõ nó thì code của bạn sẽ rất an toàn, nếu không thì có thể gây ra bug và crash ứng dụng triền miên.

Việc làm code Swift cho bạn chưa có nhiều kinh nghiệm

Để bắt đầu cho bài hướng dẫn này, các bạn nên sử dụng Xcode Playground để thực hành code theo các ví dụ trong bài, nó giúp bạn sẽ dễ hiểu và nhớ lâu hơn. Trong bài này có một vài kiến thức về optional nếu bạn nào chưa hiểu về nó thì có thể tìm hiểu tại đây.

Trước tiên chúng ta sẽ tìm hiểu về 2 ký tự “?”, “!”: Trong khai báo biến, ký tự “?” có nghĩa là ta nói rằng biến đó có khả năng bị nil chứ không phải lúc nào cũng có giá trị. Trong câu lệnh thông thường, dấu “?” xuất hiện báo hiệu rằng biến đó có thể bị nil và khi sử dụng biến đó mà biến đó bị nil thì app sẽ không bị crash. Trong khai báo biến, khi dùng ký tự “!” có nghĩa là chúng cực kỳ chắc chắn rằng biến có “!” sẽ luôn luôn có giá trị. Nếu không có giá trị trong các biến đó thì khi sử dụng biến đó sẽ gây ra crash ứng dụng.

Lưu ý: Khi chúng ta khai báo biến mà không biết biến này có giá trị hay không thì nên dùng ký tự “?” và ngược lại nếu biết biến luôn luôn có giá trị thì chúng ta sẽ dùng ký tự “!”. Ví dụ:

var a:Int?
 
print(a) // Hiện thị giá trị nil. Không carsh
 
 
let b:Int!
 
print(b) // Sẽ bị báo lỗi ngay lập tức.(Bị crash)
 
//Chúng ta có thể sửa như sau:
 
let b:Int! = 1
print(b)
 
//hoặc
 
var b:Int!
b = 1
print(b)

As sử dụng trong trường hợp chúng ta muốn ép kiểu(upcasting) dữ liệu nào đó thành một kiểu dữ liệu ta mong muốn. Lưu ý: Khi dùng As bạn phải chắc chắn một điều là kiểu dữ liệu bạn muốn ép kiểu cũng chính là kiểu dữ liệu của biến bạn đang muốn ép, nếu không sẽ xảy ra bug. Ví du:

// Ép kiểu (Up casting)
   let button = UIButton()
   let view = button as UIView
 
// Khái báo biến và ép kiểu
   let string = "3"
   let nsString = string as NSString
   let value = nsString.floatValue // 3
 
   let rawString: AnyObject = "Tự học Swift"
   let optionalString: AnyObject? = "Tự học Swift"
   let nilString: AnyObject? = (nil as String?)
 
   let rawInt: AnyObject = Int(3)
   let optionalInt: AnyObject? = Int(3)
   let nilInt: AnyObject? = (nil as Int?)
 
// Sử dụng as
   let result1 = rawString as String       // AnyObject is not convertible to String
   let result2 = optionalString as String  // AnyObject? is not convertible to String
   let result3 = nilString as String       // AnyObject? is not convertible to String
   let result4 = rawInt as String          // AnyObject is not convertible to String
   let result5 = optionalInt as String     // AnyObject? is not convertible to String
   let result6 = nilInt as String          // AnyObject? is not convertible to String
Tuy nhiên chúng ta có thể sử dụng cách ép kiểu an toàn bằng cách dùng toán tử sau: As? Được dùng giống như As nhưng khác biệt ở chỗ là nếu trường hợp chúng ta ép kiểu không thành công nó sẽ trả về trị nil. Để hiểu rõ hơn chúng ta xem ví dụ sau: Ví dụ:
let string = "3"
   let nsString = string as NSString
   let value = nsString.floatValue // 3
 
   let rawString: AnyObject = "Tự học Swift"
   let optionalString: AnyObject? = "Tự học Swift"
   let nilString: AnyObject? = (nil as String?)
 
   let rawInt: AnyObject = Int(3)
   let optionalInt: AnyObject? = Int(3)
   let nilInt: AnyObject? = (nil as Int?)
 
// as?
   let result17 = rawString as? String // String? "Tự học Swift"
   let result18 = optionalString as? String // String? "Tự học Swift"
   let result19 = nilString as? String // String? nil
   let result20 = rawInt as? String // String? nil
   let result21 = optionalInt as? String // String? nil
   let result22 = nilInt as? String // String? nil
 
   let result23 = rawString as? String! // Không thể ép kiểu từ AnyObject sang kiểu optional String!
   let result24 = rawString as? String? // Không thể ép kiểu từ AnyObject sang kiểu optional String?
   let result25 = optionalString as? String! // String!? "Tự học Swift"
   let result26 = optionalString as? String? // String?? "Tự học Swift
   let result27 = optionalInt as? String? // String?? nil

As! Được dùng Giống như As vậy tuy nhiên nó sẽ bắt buộc biến của chúng ta muốn ép kiểu phải trở thành kiểu dữ liệu nào đó. Nếu trường hợp biến đó không thể ép về kiểu đó thì sẽ xảy ra crash ứng dụng ngay. Lưu ý: Sử dụng thèn này rất nguy hiểm, nếu không chắc chắn được rằng kiểu chúng ta muốn ép sẽ thành công thì sẽ gây ra crash ứng dụng. Nếu chúng ta cảm thấy không chắc chắn hay mơ hồ về việc ép kiểu dư liệu này thì chúng ta nên dùng as? Để bắt trường hợp không ép thành công và xử lý tiếp. Ví dụ:

if let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell {
    //Nếu chúng ta ép kiểu thành công thì sử dụng biến cell để làm gì đó
} else {
    // Ép không thành công thì chúng ta xử lý gì đó
}

Ví dụ:

let string = "3"
   let nsString = string as NSString
   let value = nsString.floatValue // 3
 
   let rawString: AnyObject = "Tự học Swift"
   let optionalString: AnyObject? = "Tự học Swift"
   let nilString: AnyObject? = (nil as String?)
 
   let rawInt: AnyObject = Int(3)
   let optionalInt: AnyObject? = Int(3)
   let nilInt: AnyObject? = (nil as Int?)
 
// as!
   let result7 = rawString as! String // String "Tự học Swift"
   let result8 = optionalString as! String // String "Tự học Swift"
//    let result9 = nilString as! String // unexpectedly found nil while unwrapping an Optional value
//    let result10 = rawInt as! String // Could not cast value of type '__NSCFNumber' (0x107c98130) to 'NSString' (0x1082afb00).
//    let result11 = optionalInt as! String // Could not cast value of type '__NSCFNumber' (0x101e95130) to 'NSString' (0x1024acb00).
//    let result12 = nilInt as! String // unexpectedly found nil while unwrapping an Optional value
 
 //    let result13 = rawString as! String! // Không thể ép kiểu từ AnyObject thành kiểu optional String!
 //    let result14 = rawString as! String? //Không thể ép từ kiểu AnyObject thành kiểu optional  String?
   let result15 = optionalString as! String! // String! "Tự học Swift"
   let result16 = optionalString as! String? // String? "Tự học Swift"

Lưu ý:As! Cũng không thể ép kiểu dữ liệu nào đó thành kiểu optionalAs? Và As! Ngoài việc ép kiểu để tạo ra biến mới và sử dụng nó thì chúng còn có công dụng để kiểu tra xem biến đó có chính xác thuộc loại kiệu dữ liệu mà mình muốn kiểm tra hay không. Nếu bạn ép kiểu thành công với as? Thì nó sẽ cho bạn một biến mới kiểu optional, ngược lại với as!, khi bạn ép kiểu thành công nó sẽ cho ra một biến bình thường. Để hiểu hơn chúng ta sẽ tham khảo ví dụ bên dưới:

Ví dụ 1:

var optionalString = dict.objectForKey(“SomeKey”) as? String

optionalString Sẽ là một biến optional kiểu String?, Nếu trường hợp chúng ta không ép kiểu thành kiểu dữ liệu String, có nghĩa là sẽ có trường hợp nào đó mà giá trị của dict.objectForKey(“SomeKey”) là một kiểu dữ liệu nào đó khác String thì khi đó dùng as? String sẽ ép kiểu không thành công thì biến optionalString sẽ được gián nil.

Ví dụ 2:

var optionalString = dict.objectForKey(“SomeKey”) as! String?

Trường hợp này thì bạn nói với hệ thống là kiểu dữ liệu của dict.objectForKey(“SomeKey”) là kiểu String?, chắc chắc là kiểu String?. Nếu khẳng định trên của bạn là đúng thì chúng ta sẽ có một biến optionalString  với kiểu String? Nhưng không may nếu khẳng định của bạn là sai, có nghĩa là dict.objectForKey(“SomeKey”) không phải là kiểu String?, thì sẽ xảy ra crash ngay lập tức. Vậy giải pháp ở đây là chúng ta sẽ sử dụng cú pháp if let hay guard let… để kiểm tra kiểu dữ liệu của biến đó, nếu ta không chắc chắn. Ví dụ:

if let string = dict.objectForKey("SomeKey") as? String { 
  //Sử dụng biến đó
  println(string) 
} else {
  // Làm gì đó nếu biến đó không phải kiểu String
}
Guard let string = dict.objectForKey("SomeKey") as? String else { 
  // Làm gì đó nếu biến đó không phải kiểu String
return
} 
//Sử dụng biến đó
println(string)

Kết thúc phần này tuy không mấy khó hiểu nhưng nếu các bạn thực sự không nắm chắc và hiểu rõ về các từ khóa as, as?, as! thì khi sử dụng có thể gây ra crash ứng dụng một cách vô lý. Nếu bạn nào chưa rõ nên thực hành các ví dụ bên trên với background để hiểu và nhớ lâu hơn các trường hợp nên dùng và không nên dùng các từ khóa trên. Hy vọng các bạn thích và học được nhiều kiến thức từ bài viết này. Mong các bạn chia sẽ nó để mọi người cùng học và cùng trao đổi. Mọi thắc mắc hay trao đổi về bài viết, các bạn có thể để lại bình luận bên dưới mình sẽ hỗ trợ sớm nhất.
Chân thành cảm ơn các bạn đã theo dõi.

Nguồn gốc bài viết từ CafeDev

Lời khuyên từ Việt Trần – CTO DOF Hunt “Cách quản trị tốt nhất chính là không quản trị”

Là CTO của công ty DOF Hunt, ít ai biết anh Việt từng kinh qua vị trí Software Architect tại trang thương mại điện tử Sendo. Trong mục “Chuyên gia nói” tuần này, hãy lắng nghe những kinh nghiệm được anh chia sẻ về con đường phát triển để trở thành Software Architect, cùng những góc nhìn độc đáo của một DevOps Manager khi quản lý dự án và hơn hết là kinh nghiệm triển khai hệ thống Microservices từ anh Việt nhé.

Những công việc của Software Architect

Chào anh Việt. Khi còn là Software Architect thì anh thường xử lý những công việc gì?  

Chính xác thì vị trí của tôi là Technical Architect, hay còn gọi là Solution Architect nhiều hơn, và trang thương mại điện tử như mọi người biết đó là Sendo. Software Architect sẽ lo về mảng thiết kế và làm bên hệ thống là phần lớn, tuy nhiên thì Software Architect và Solution Architect có điểm khác nhau, nằm ở chủ yếu Solution Architect thì chúng ta phải thiết kế về hệ thống nhiều hơn còn Software Architect thì chúng ta thiết kế về phần mềm nhiều hơn.

Anh có thể chia sẻ cho độc giả biết thêm hành trình đến với vị trí Software Architect của anh như thế nào? 

Hành trình đến Architect của bản thân tôi khá là nhiều bước và vất vả, thông thường để làm 1 Architect thì chúng ta phải đưa ra những quyết định về giải pháp, về kinh nghiệm để lựa chọn giải pháp đó, theo tôi thì chúng ta bắt buộc phải đi qua một số thứ như từ 1 vị trí lập trình, đôi khi là tester nữa, cho đến thiết kế hệ thống.

Anh có thể chia sẻ thêm về mối tương quan giữa Software Architect và thương mại điện tử được không ạ? 

Về Architect, nó sẽ theo nghiệp vụ, như các bạn đã biết Sendo là 1 trang thương mại điện tử và thương mại điện tử nó sẽ yêu cầu lượt tải cao, tức traffic rất lớn, thường thì Architect bên tôi phải thiết kế hệ thống có những thành phần nào đó mà nó phải chịu tải lớn như Caching rồi về Online transaction nhiều hơn, đó là phần khác biệt theo mình là lớn nhất so với những vị trí Architect khác. 

Thường một ngày làm việc của anh như thế nào? 

Thật ra thì vị trí Architect của tôi là một vị trí vất vả nhưng cũng không vất vả lắm, ví dụ như các bạn thấy những bạn coder thì mấy bạn sẽ quan tâm tới code, tới debug, tới làm thế nào mà để có thể có được cái sản phẩm đấy, nhưng vị trí của mình thì liên quan tới thiết kế, các bạn thấy là bên mình sẽ thiết kế, vẽ và tính toán hệ thống nhiều hơn, đó cũng là một sự khác biệt lớn ở đây.

Một ngày tôi dành khoản 1 vài tiếng để lên tham khảo các công nghệ mới hiện tại cập nhật, như các trang Medium hoặc đọc TopDev cũng là 1 kênh mà tôi cũng thường xuyên vào. 

Anh có thể kể tên một vài công nghệ và công cụ mà anh sử dụng hàng ngày được không? 

Thật ra thì công nghệ và công cụ nó sẽ đi theo cái thiết kế là nhiều, và nó phải hợp lý với cái nghiệp vụ đó cần, nếu như mà tôi được phép lựa chọn ở đây thì chắc là tôi sẽ lấy 1 ví dụ cá nhân ra thôi: backend tôi thường sử dụng Golang, bên Database thì tôi sẽ xài MySQL, Mongodb và Elasticsearch để làm 1 search engine và những công cụ cache thì tôi có Redis Cache thì nó đã quá nổi tiếng rồi, rồi Message broker thì tôi sẽ dùng Kafka hoặc là NAS và những cái như mọi người biết về Docker Container thì sẽ xài qua Kubernetes, sơ sơ là như vậy còn thường thì cụ thể tôi mới biết là mình chọn cái gì, nó mới đúng hơn. 

Những kinh nghiệm xương máu khi ở vị trí Software Architect

Sai lầm lớn nhất anh từng mắc phải trong công việc Software Architect là gì?

Sai lầm lớn nhất ở vị trí Software Architect của tôi, thật ra tôi đã làm Software Architect được 1 thời gian rồi, chỉ qua là tôi không biết là mình đang làm về nó, đó là một điều thú vị. Mãi sau này thì anh mới biết thôi, thì cái sai lầm đến nó nhiều lắm, có những cái đến như là đứng hình ở IP là cái thường thấy nhất và hệ thống đang chạy nhưng mà đến lúc vào thời điểm quan trọng thì nó chết, thường những sai lầm mà cho tới ngày hôm nay tôi cũng sẽ gặp nhưng mà ít ra thì tôi cũng đã có những kinh nghiệm mà biết cách giải quyết nó tốt hơn rồi. 

3 lời khuyên anh muốn gửi đến các bạn mong muốn trở thành Software Architect là gì? 

3 lời khuyên của anh thật ra dành cho tất cả các bạn theo ngành này chứ không chỉ là Software Architect. Thứ nhất các bạn phải đam mê thật sự với ngành. Thứ hai là các bạn phải tò mò và thứ ba là các bạn phải can đảm. Theo anh thì đó là những tố chất mà anh hay dùng để tuyển dụng. 

Làm sao để trở thành một Software Architect

Từ vị trí Developer, cần phải trải qua những vị trí nào để trở thành Software Architect? 

Theo như anh nói thì Software Architect phải biết rộng, cho nên các bạn sẽ phải thử càng nhiều càng tốt, cho nên mấy bạn bắt đầu với vị trí gì cũng được, không nhất thiết sẽ phải là từ vị trí lập trình.

Thông thường thì chúng ta thấy 1 bạn từ background sysadmin thì sau này sẽ trở thành 1 bạn Solution Architect nhiều hơn là 1 bạn về lập trình, thậm chí 1 bạn chưa biết lập trình cũng được, các bạn chỉ cần đam mê công nghệ, các bạn có thể được trao cơ hội dấn thân vào nhiều hơn, anh nghĩ thì đó là 1 cái cơ hội tốt. 

Xem thêm các vị trí tuyển dụng Software Architect từ các công ty HOT

Theo quan điểm cá nhân của anh thì các bạn Developer tại Việt Nam nên có những hướng đi tiềm năng nào trong tương lai?

Theo quan điểm cá nhân của anh, hiện tại mấy bạn cũng biết, mobile app đang rất là phát triển và một thứ khác nữa là về mảng Data, cái đó các bạn có thể focus nhiều vào 2 mảng này, còn trong tương lai thì thật ra công nghệ thay đổi rất là nhanh, vấn đề ở đây anh thấy các bạn phải nên chọn 1 cái và lấy cái đó làm trọng tâm và thực sự hiểu biết nó, tức là theo anh cái về sau có thuật ngữ gọi là ‘domain knowledge’ rất là quan trọng, thành ra mình nên chuyên 1 cái gì đó trước, sau đó phát triển cái khác, còn nếu để lựa chọn về tương lai thì tôi vẫn tin Big Data sẽ là tương lai và xu thế. 

AI – Trí tuệ nhân tạo hiện nay đang là vấn đề nóng, anh có thể chia sẻ quan điểm cá nhân của anh về tiềm năng của AI không? 

Thật ra là tiềm năng và khả năng của AI thì anh cũng đã nhìn thấy được phần nhiều rồi, thật ra là chúng đang càng ngày càng len lỏi vào đời sống của mình nhiều hơn, thí dụ như ngày xưa, chúng ta chỉ nghe tới AI là những con robot trong phim thôi, thì bây giờ chúng ta thấy rất là nhiều thiết bị trong nhà mình, thậm chí cái bóng đèn chẳng hạn, cái quạt có bóng đèn, tủ lạnh cũng đã trang bị được AI rồi, theo anh đó là 1 hướng đi mà chắc chắn sẽ phải xảy ra và càng ngày càng bám liền với đời sống của mình nhiều hơn nữa. 

Tìm việc làm cho kỹ sư AI

Nếu có một điều mà anh biết trước khi bắt đầu làm, thì điều đó là gì? 

Nếu mà có một điều tôi biết trước khi bắt đầu làm thì thực sự là anh chỉ muốn ngày xưa mình sẽ can đảm hơn, mình dám làm nhiều thứ hơn và nếu mà tìm được 1 ai đó để mình theo đuổi học hỏi, mình biết người đó có thể giúp mình thì mình nên làm.

Anh có thể chia sẻ những resource cho các bạn muốn trở thành Software Architect không? 

Theo anh thì cái đó nó phụ thuộc vào lực học của mỗi người, nghĩa là có nhiều bạn tôi thấy hay xem youtube, có nhiều bạn thì hay xem facebook, có nhiều bạn thì tích lũy qua công việc của họ, nên ở đây mình sẽ không có 1 nguồn cụ thể nào nhưng mà nguồn anh hay đọc nhất là trang web Medium. 

Thì em được biết là anh ngoài Solution Architect, anh còn là DevOps chuyên tư vấn giải pháp triển khai Microservices cho các công ty. Anh có thể định nghĩa DevOps là gì không? 

DevOps thực ra là 1 từ ghép từ Develop và từ Operations, là chữ DevOps, điều đó có nghĩa là gì, có nghĩa là thứ nhất các bạn phải là Dev trước cái đã, điều thứ hai là các bạn phải ‘operation’ nó, tức là bạn phải quản lý được nó, điều hành nó. Nói một cách đơn giản hơn  thì DevOps cụ thể nó như thế này, nó là chúng ta sẽ phải liên quan tới cái phần triển khai, quản lý và cài đặt các service của mình trên hệ thống. 

Em có thắc mắc là DevOps Engineer là gì? Có phải là Sysadmin không ạ? 

2 cái này thực sự nếu so sánh thì nó sẽ có 1 cái khoảng cách rất mỏng bởi vì đa số hiện nay Sysadmin là background của DevOps, có nghĩa rất là nhiều bạn đi lên từ Sysadmin, tuy nhiên sự khác biệt ở đây phân rõ ra luôn thì Sysadmin đa số hiện tại như anh biết họ sẽ làm nhiều về infrastructure, nghĩa là người sẽ thiết kế máy chủ và đảm bảo các máy chủ nó sẽ nói chuyện được tốt với nhau, liên quan tới như là Data Center rồi các thiết bị phần cứng để mà vận hành cái hệ thống máy chủ đó. 

Còn về DevOps thì các bạn sẽ làm về phần mềm nhiều hơn, mặc dù nó không có liên quan tới phần lập trình nhiều, tuy nhiên nó lại liên quan tới phần làm thế nào để mà mình có thể giám sát được những hệ thống đó chạy và làm thế nào để mình triển khai được cái hệ thống đó khi mà lên Microservices. 

Anh có thể giải thích rõ hơn “Tư tưởng mới, Công cụ mới, Kỹ năng mới” trong công việc của DevOps Engineer là gì không ạ? 

Đó là lý do tại sao anh hay nói các bạn lập trình viên mới hay là những bạn theo ngành thì nên có tính tò mò cao, bởi vì tính tò mò sẽ cho chúng ta cái động lực để hiểu biết nhiều hơn, và công nghệ chúng ta đang ngày càng thay đổi thì mình phải cập nhật nhanh, đôi khi đối với cái chúng ta đang làm hiện tại đã có 1 ai đó 1 bên nào đó làm trước đó rồi hoặc là đang có giải pháp mới mà rất là phù hợp hơn rồi thì anh hay nói là mình phải làm đúng tức là tìm đúng công cụ cho đúng cái điều mình cần.

Theo anh, những kiểu Developer nào sẽ dễ trở thành DevOps nhất?

Theo như anh hiểu câu hỏi này thì những bạn Developer trong những lĩnh vực nào sẽ trở thành DevOps, thì ở đây theo anh, bạn Developer về Backend có khả năng dễ trở thành DevOps hơn, bởi vì DevOps hiện tại liên quan tới hệ thống, về server nhiều, ra là những bạn đang làm Backend thì có tốt chất dễ, tức là dễ đưa đến DevOps nhiều hơn.

Tuy nhiên, cần 1 yếu tố nữa, đó là những bạn nào mà yêu thích thiết kế cơ, tức là mình sẽ được phép làm nhiều, là mình được lựa chọn công cụ mình được thiết kế nó chạy như thế nào, đó là những người mà tôi tin chắc là họ sẽ lên DevOps rất nhanh.

Theo anh thì đâu là lợi thế của các bạn DevOps so với các bạn Developer khác? 

Lợi thế lớn nhất của các bạn DevOps so với các Developer khác thì đây là 1 vị trí rất là hot hiện tại, nó hot là vì chúng ta đang càng lúc càng cần những vị trí này nhiều hơn, vì các công ty đang muốn chuyển mình thành 1 công ty công nghệ và trở thành 1 công ty deploy được microservice, mà để lên microservice thì chúng ta cần những bạn DevOps để có thể làm được những chuyện đó, nên theo anh những bạn nào đang muốn trở thành DevOps, anh nghĩ đó là 1 quyết định rất sáng suốt vào lúc này. 

Ở cương vị là một DevOps Manager, tiêu chí quan trọng nhất để anh tuyển dụng một DevOps Engineer là gì? 

Những tiêu chuẩn và tiêu chí, theo bản thân anh thôi thì đó nên là 1 bạn có kiến thức về hệ điều hành Linux, và nên biết xài 1 số công cụ như chúng ta hay nghe thuật ngữ CI/CD, đó là những cái các bạn cần phải biết.

Bên cạnh đó thì DevOps là 1 từ để chỉ vị trí công việc thôi, nếu mà nói cụ thể thì ví dụ 1 công ty về thương mại điện tử, họ sẽ cần các DevOps cho các công cụ có liên quan, lúc đó lại cần chia ra như là DevOps cho mảng BigData, DevOps cho các mảng về thương mại điện tử và DevOps cho các mảng về rất là nhiều, rất là nhiều loại, theo tôi là như vậy.

Anh có thể chia sẻ thêm một chút về lý do tại sao anh lại chọn chuyển hướng sang DevOps Engineer không ạ?

Lý do rất là đơn giản thôi, bởi vì nó đi từ nhu cầu của mình, lúc đó mình đang làm giải pháp khách hàng và họ đang gặp rất nhiều vấn đề bên phía hệ thống, trong quá trình đó thì mình vừa làm vừa nghiên cứu và mình vừa đi chung với họ và 1 cách vô tình anh trở thành DevOps, thật ra anh không phải là người làm DevOps chuyên.

Sai lầm lớn nhất mà anh từng mắc phải khi làm DevOps Engineer là gì?

Sai lầm DevOps theo anh nghĩ sai lầm này đến phần nhiều là do những cái mình đã biết, tôi hay dùng những cái như chính những cái mình đang biết nó là cái rào cản cho những cái mình đang học, nghĩa là mình đem DevOps chúng ta sẽ phải làm quen với những khái niệm mới và đôi khi cách triển khai và cài đặt nó sẽ rất khác so với cách truyền thống của chúng ta và rất là nhiều cái nó sẽ phải yêu cầu mình gần như không được sử dụng những cái cũ thì mình phải làm việc trên những cái mới và thường thì những người như anh lúc trước chưa quen thì mình dễ mắc phải những sai lầm đó hơn.

Tham khảo các vị trí tìm việc làm cho kỹ sư Devops tại TopDev

Đa số các bạn Developer thường hay thức khuya, anh có thể chia sẻ về cách phân bố thời gian của mình và lời khuyên nào dành cho các Developer hay không?

Theo anh thì đây là một câu hỏi hay, vì anh vẫn thường hay khuyên những bạn Developer làm chung là bản thân các bạn Developer thì ai cũng giống ai hết, thường hay thức khuya rồi dậy muộn, chứ thức khuya dậy sớm thì nó còn dễ, lúc trước tôi là như thế, nhưng mà sau này khi mà mình làm việc với những công ty lớn và yêu cầu sự chuyên nghiệp và chuẩn chỉnh hơn thì theo tôi sự phân bổ thời gian nó nên thế này: nên dành thời gian mà mình cảm thấy mình sáng tạo và tập trung nhất, có người có thể là sau buổi giờ chiều, có người thì sẽ là đầu giờ mỗi ngày 5 6 giờ sáng, như tôi thì tôi hay dậy vào 6 giờ sáng, đọc Medium hoặc là ngồi suy nghĩ phân tích hệ thống nhiều hơn, còn những thời gian khác thì dành cho những việc mình đã biết rõ rồi chỉ cần xử lý chân tay thôi. 

Thí dụ bạn nào là Dev, theo tôi 1 ngày 8 tiếng để code, thì hãy code ít hơn, có 6 tiếng thôi; còn 2 tiếng mình tái đầu tư bản thân mình nhiều hơn, để mình học hỏi nhiều hơn. Theo tôi điều đó nó sẽ có lợi cho các bạn khá là nhiều.

Anh có thể chia sẻ về một kỉ niệm đáng nhớ cũng như kinh nghiệm xương máu khi chuyển đổi mô hình cho công ty khách hàng được không ạ? 

Lúc trước anh có làm 1 đơn hàng như sau, cũng là chuyển đổi 1 cái hệ thống monolithic sang microservice, tuy nhiên phần lớn khách hàng ở Việt Nam mình, đặc biệt là những khách hàng bự thì họ hay có 1 hệ thống đã rất là lâu năm rồi và cái việc chuyển đổi đó nó không phải là 1 chuyện đơn giản 1 sớm 1 chiều và đôi khi cái phần nhiều là đến từ những bạn đang xài những cái license, thí dụ như những hệ thống EIP, họ mua về luôn rồi thì anh lại không được phép can thiệp vào hệ thống của họ để anh làm, thì đó cũng là 1 khó khăn rất lớn, nhưng lần đó mình đưa ra 1 chiến lược là mình xây mới, tức là anh dời qua từ từ, cũng giống như câu chuyện ở Sendo thôi. Từ từ từ từ anh tìm cách chứng minh là nó tốt hơn, sau đó họ mới chấp nhận. Đó là 1 kỷ niệm hồi anh cũng chưa có chuyên nghiệp lắm về mảng này, thì anh đã có trải qua về nó.

Động lực nào có thể giúp các bạn lập trình viên có thể hoàn thành tốt công việc?

Anh có lời khuyên nào dành cho các bạn Developer, để tạo động lực cho các bạn để chạy KPI, chạy Deadline, chạy Task được không ạ? 

Đây cũng là 1 câu hỏi khá là thú vị với anh, thật ra cái chuyện mà anh chạy KPI, deadline này nọ đối với ai thì nó cũng có hết. Nhưng mà bên phía bọn anh thì có cái động lực nhiều hơn là 1 chuyện gì đó mà mình cảm thấy áp lực. Thì ở đây anh thường yêu cầu mấy bạn là để thành 1 Developer giỏi thì mình nên biết lười. Có nghĩa là những thứ mà chúng ta đang làm tay chân, những thứ mà mình cứ phải ngán ngẩm với nó thì mình nên có cách nào đó để mình cho nó tự động, mình nên dùng chất xám của mình vào những cái chỗ như vậy để mình khiến cho nó nhẹ nhàng hơn, càng về sau 1 phần là năng suất của các bạn nó sẽ tăng lên và 1 phần nữa là tự động những chuyện đó nó không còn là cái chuyện mà nó còn áp lực nữa. Mỗi lần như vậy thì chắc chắn là chúng ta sẽ có 1 giải pháp cho nó, vì anh là dân Technical – mình là dân Kỹ thuật, mình lập trình được thì anh tin là mình nên có cái cách nghĩ đó.

Anh hay dùng cách thức hay công nghệ gì để quản lý công việc của team, cũng như đo đạc hiệu quả làm việc của họ? 

Nhân câu hỏi này anh cũng muốn chia sẻ 1 điều là bên anh theo triết lý quản trị tốt nhất là không có quản trị. Bên anh rất ít khi nào phải thường khắt khe KPI, hay phải hối thúc các bạn cả. Vì ngay từ đầu mình nên xây dựng cái văn hóa, đó là lý do mà anh cần những bạn có đam mê thật sự và tò mò cũng như yêu thích những thử thách, những người như vậy sẽ mang đến cho mình 1 cái trải nghiệm rất khác. Bên tôi chỉ xài Trello thôi, đó là 1 chương trình để mình quản lý các task của mấy bạn và về mặt quan trọng khác, anh nghĩ yêu cầu quan trọng nhất ở đây là sự giao tiếp của team. Chỉ cần team mình giao tiếp tốt và đầy đủ thì đã giải quyết rất là nhiều rồi. Ví dụ như là mỗi buổi họp chúng ta nên có văn hóa là note lại, viết docs, hoặc viết tất cả hoặc là chia sẻ thì nhiêu đó thôi đã đủ cho việc quản lý của mình. 

Theo như anh chia sẻ thì cách của anh là quản trị như không quản trị, nhưng với những công ty, tập đoàn có hàng ngàn Developer. Anh có thể chia sẻ một chút trên góc nhìn của anh về vấn đề này được không?

Chia sẻ về việc này thì việc này nên làm từ đầu, nghĩa là khi bạn là 1 công ty nhỏ, 1 startup khoản chừng 5 tới 10 người thì mình nên làm trước, là mình đã quán triệt với nhau, sau đó những người mới vào họ sẽ theo cái văn hóa đó. Thật ra dùng từ ‘theo’ thì không đúng lắm, nó hơi bị gượng ép, đúng ra chúng ta sẽ tìm kiếm những người phù hợp, thì ngay từ đầu họ phù hợp rồi.

Còn đối với những công ty đạt con số tính bằng hàng ngàn người như vậy thì hiện tại có những quy trình rất là nổi tiếng ở ngoài như mọi người biết đó là Scrum và Agile hoặc là họ xài đơn giản hơn là OKR, thì tôi thấy OKR nó khá là hiệu quả, ở Sendo cũng xài OKR, nghĩa là mình chỉ cần quan tâm tới cái Key action thôi và cái result nó là gì.

Tham khảo thêm các vị trí tuyển dụng Scrum , tuyển dụng lập trình Agile mới nhất

Nỗi sợ lớn nhất của anh trong công việc công nghệ là gì? 

Nỗi sợ lớn nhất trong công việc lập trình thường nó đến từ chuyện không biết cái mình đang làm có thực sự tốt hay không, thì đó là phần lớn những cái tôi sẽ phải lo lắng nhiều hơn. Lý do là khi mình làm ở vị trí system là như mình đang giữ kho bạc của người ta vậy, chỉ cần 1 sai lầm rất nhỏ thôi cũng dẫn đến cái giá phải trả rất đắt, cho nên đó thường là những nỗi lo của người làm system, nhưng rất may mắn là hiện tại thì công nghệ nó đã giúp ích cho mình rất nhiều rồi, mình cũng không cần phải lo lắng nhiều như vậy nữa.

Đâu là những khó khăn trong việc tuyển dụng Lập Trình Viên

Hiện tại ngành công nghệ thông tin ở Việt Nam hiện nay rất HOT, “Cầu” vượt xa “cung”, dẫn đến hàng loạt doanh nghiệp gặp khó khăn trong vấn đề tuyển dụng, theo anh đâu là cốt lõi của vấn đề này?

Tôi cũng thường chia sẻ về vấn đề này, số lượng lập trình viên của Việt Nam mình nhiều, số lượng công ty cần cũng nhiều, nhưng 2 tập đối tượng này thường rất khó để tìm đến được với nhau. Lý do phần lớn theo tôi là do cái chất, ý anh là chất lượng lập trình viên của mình còn khá là thấp, tức là về mặt chung thì còn khá là thấp.

Thứ 2 là các bạn đang chạy theo xu hướng, tức là chạy theo yêu cầu tuyển dụng nhiều hơn. Ví dụ như: Cách đây 2 năm thì React Native mình mới phát triển thôi, lúc đó mọi người bắt đầu đổ qua học, sau đó mọi người thấy là sắp tới sẽ tuyển dụng React Native thì mình sẽ học React Native, rồi sau đó ai ai cũng học React Native thì nó lại như vậy, nghĩa là mình phải nhớ 1 điều là lương của mình nó sẽ tỉ lệ nghịch với độ hiếm kỹ năng hay là với mức độ tìm kiếm của người ta. Tức là nếu tuyển 1 bạn làm A mà ở đâu cũng có thì chắc chắn lương bạn sẽ thấp, nên chưa chắc là các bạn đi theo những xu hướng thị trường nó là tốt, nên như mình nói chắc chắn phải có 1 điều là phải đam mê thật sự với cái mình chọn.

Tham khảo thêm: Các vị trí tuyển lập trình React Native lương cao tại Topdev

Anh có thể chia sẻ cụ thể về lộ trình nghiên cứu hay học, của các công nghệ hiện có để đảm bảo tối thiểu có thể làm việc cùng với team của anh?

Theo tôi thì lộ trình của mỗi người nó sẽ phụ thuộc vào cái cách mà team và bản thân họ làm việc, cũng như cái trải nghiệm của mỗi người nó sẽ khác nhau. Nhưng tôi cảm giác ví dụ như 1 người mới hoàn toàn mà muốn bước chân vào lập trình thì điều đầu tiên nhất là phải nên làm luôn chứ đừng dùng tư duy là mình sẽ cần đến 1 nơi để học rồi mới làm được, đó là điều theo tôi không cần thiết.

  Báo cáo thị trường IT 2020: Việt Nam sẽ trở thành quốc gia IT với nhiều chỉ số trong top thế giới

Anh đưa ra ưu điểm nào của mình để thu hút được ứng viên?  

Bên tôi tuyển dụng, nếu cho DOF Hunt thì tôi thấy nó đơn giản hơn, thông thường tôi sẽ đưa ra những thách thức, những vấn đề của bên DOF Hunt, để xem các bạn phản ứng với nó như thế nào hoặc các bạn có giải pháp gì cho nó không, thì đó là tiêu chí hàng đầu của tôi. Còn nếu 1 bạn fresher, tức là chưa biết gì thì đến DOF Hunt tôi chỉ yêu cầu 1 thứ thôi, đó là bạn có yêu thích sản phẩm hay không, có thực sự yêu thích nó hay không. 

DOF Hunt như mọi người biết thì nó là 1 mạng xã hội dành cho nhiếp ảnh, nghĩa là liên kết mẫu ảnh và các bạn chụp ảnh, thành ra thường thì bên Developer mình sẽ không quan tâm nhiều lắm đến mảng này, nhưng nếu bạn có quan tâm thì tôi nghĩ mấy bạn sẽ là người phù hợp.

Những chia sẻ về DOF Hunt

Cơ duyên nào đưa anh đến với việc khởi nghiệp DOF Hunt? 

Thật ra tôi là 1 người rất thích khởi nghiệp, tuy nhiên tôi là 1 người làm về kỹ thuật, và tôi tin là rất là nhiều bạn kỹ thuật làm về khởi nghiệp thường hay thất bại nhiều hơn, vì thật ra kỹ thuật thì các bạn biết nó chỉ là ⅓ tấm vé để tham gia cuộc chơi khởi nghiệp thôi và bởi vì chúng ta là người làm kỹ thuật thì cái cảm giác cái gì chúng ta cũng làm được hết, nhưng về mặt làm thế nào để kiếm tiền hoặc là bán nó thì đó là 1 điều có cảm giác rất là khó, vì đó là thứ yếu của dân kỹ thuật nói chung. 

Còn về cơ duyên với DOF HUNT, thì 1 ngày đẹp trời thôi tôi được giới thiệu cái máy chụp hình, thật ra thì trước đó tôi có làm 1 giải pháp liên quan tới nén hình ảnh thì trong hình ảnh tôi phát hiện ra 1 thứ thú vị đó là cái EXIF. EXIF là thông tin hình ảnh đó, ảnh đó được chụp máy gì, lens gì, khẩu tốc bao nhiêu, tôi thấy nó khá là hay và tôi mới tìm hiểu thử 1 cái máy ảnh rồi từ từ tự nhiên mình trở thành 1 bạn giống như là đi học chụp hình luôn, rồi tôi đi tham gia 1 số các câu lạc bộ offline chụp hình. 

Từ đó tôi mới thấy được chuyện là những bạn mới vô máy ảnh đa số ở Việt Nam mình thì chắc chắn là chụp người nhiều, và mấy bạn đi kiếm mẫu ảnh rất là nhiều và mẫu ảnh thì cũng đang có nhu cầu ngược lại và bên cạnh đó thì những bạn làm về kinh doanh như là chủ shop thời trang và các thương hiệu thời trang thì cũng có nhu cầu, thì tôi mới nghĩ là nếu vậy thì tại sao mình không dùng cái hiểu biết của mình trong mảng kỹ thuật để mình giải quyết nhu cầu đó, nên đó là lý do tôi thành lập DOF Hunt. 

Xin cảm ơn anh Việt đã dành thời gian trao đổi cùng TopDev. Hy vọng bài phỏng vấn này cung cấp cho các bạn độc giả cái nhìn rõ nét về chức năng của một Architect trong ngành Lập trình, cũng như định hướng cho bản thân kiến thức chuyên sâu và tự đặt ra con đường phát triển sự nghiệp vững chắc. Đón chờ bài phỏng vấn tiếp theo trong mục Chuyên gia nói cùng TopDev nhé!

Đừng bỏ lỡ những bài viết hay:

Việc làm IT hấp dẫn nhất dành cho Lập trình viên tại đây. 

Giới thiệu Temporal Dead Zone trong Javascript

Bạn đã biết hoisted? Bạn cần biết thêm khái niệm Temporal Dead Zone là đủ một cặp

Khu vực tự trị, ngoài vòng pháp luật.

Đoạn code bên dưới sẽ cho kết quả thế nào, đố bạn

// có chạy được ko, chưa khai báo `Car`
new Car('red');

class Car {
	constructor(color) {
		this.color = color;
	}
}

hoặc gọi một hàm trước khi nó được khai báo

// có chạy được ko, chưa khai báo greet
greet('VuiLapTrinh');

function greet(who) {
	return `Hello, ${who}!`;
}

Đáp án là, với trường hợp sử dụng một class chưa được khai báo, kết quả là ReferenceError, còn sử dụng hàm chưa khai báo, chạy bình thường

Temporal Dead Zone (TDZ – khu vực tự trị) là nơi quản lý tính khả thi của letconstclass

Bắt đầu với khai báo const

white; // throws `ReferenceError`
const white = '#FFFFFF';
white;

Trước khi có sự xuất hiện của const white = '#FFFFFF', biến white sẽ nằm trong khu vực tự trị (TDZ)

Chúng ta không thể truy cập vào khu vực tự trị này, nên nó sẽ trả về lỗi ReferenceError: Cannot access 'white' before initialization

Khái niệm này giúp tránh sự lằng nhằng trong javascript trước đây, được phép sử dụng trước khi khai báo. Vì nó chỉ được thêm vào sau này, nên chỉ có hiệu lực trên các từ khóa sau này mới có là letconstclass

count; // throws `ReferenceError`
let count;
count = 10;

const myNissan = new Car('red'); // throws `ReferenceError`
class Car {
  constructor(color) {
    this.color = color;
  }
}

Nó cũng giải thích luôn tại sao chúng ta phải gọi super trong class trước khi gọi this, vì this tạm thời nằm trong khu TDZ khi chưa gọi super

class MuscleCar extends Car {
  constructor(color, power) {
    this.power = power;
    super(color);
  }
}

const myCar = new MuscleCar('blue', '300HP'); // `ReferenceError`

Chúng ta phải dùng this. sau khi gọi super

Với những cách khai báo cũ là varfunction nó không chịu chung số phận phải sống trong khu tự trị, nó sẽ chịu khái niệm Hoisting.

Hoisting là một cơ chế hoạt động gây khó dễ anh em chúng ta đã bao nhiêu thập kỷ nay.

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

Anh em ra đường gặp một em chưa hề quen biết, chúng ta nhẹ nhàng tới hỏi “Em nhà ở đâu thế?”, nhận được câu trả lời anh lên phường tra cứu, lên đến phường, “chẳng ai biết ẻm là ai”, phường chỉ lên quận tra cứu, quận lại bảo “có mà lên ủy ban thành phố chú ạ”, lỡ mà xui xui chúng ta phải lên đến trung ương để biết rằng em đã đăng ký hộ khẩu ở đâu.

// chạy như thường, nhưng đừng viết gì nhá
value; // => undefined
var value;

greet(‘VuiLapTrinh’); // => ‘Hello, VuiLapTrinh!’
function greet(who) {
return `Hello, ${who}!`;
}
greet(‘Andy’); // => ‘Hello, Andy!’

Cho nên bạn có thể làm được việc này, xài trước, import sau

myFunction();
import { myFunction } from './myModule';

TDZ còn phụ thuộc vào từng thành phố, mỗi thành phố sẽ có khu vực tự trị khác nhau

Lấy ví dụ

function doSomething(someVal) {
  // Function scope
  typeof variable; // => undefined
  if (someVal) {
    // Inner block scope
    typeof variable; // throws `ReferenceError`
    let variable;
  }
}
doSomething(true);

TopDev via Vuilaptrinh

Tham khảo thêm các vị trí tuyển ngành IT trên TopDev