Home Blog Page 192

Mẹo quy ước tên cho CSS giúp bạn rút ngắn 2/3 thời gian khi debug!

meo-quy-uoc-ten-cho-css-giup-ban-rut-ngan-23-thoi-gian-khi-debug

Tác giả: Emmanuel Ohans

Tôi đã nghe không ít developer nói rằng họ ghét CSS. Với kinh nghiệm của mình, đây là kết quả cho việc không dành thời gian để học CSS.

CSS không phải là “ngôn ngữ” đẹp nhất, nhưng nó đã thành công trong việc làm front-end cho các website trong hơn 20 năm nay. Tuy nhiên, khi bạn viết nhiều CSS, bạn sẽ nhận ra được thấy một nhược điểm lớn. Quá khó để developer có thể maintain CSS.

Các CSS tệ sẽ nhanh chóng trở thành một cơn ác mộng đối với các lập trình viên. Dưới đây là một số quy ước tên sẽ giúp bạn giảm vô số giờ để debug.

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

  Responsive HTML bằng một dòng CSS
  Roadmap Frontend Developer - "Con đường tắt" để trở thành cao thủ Frontend Developer

Sử dụng dấu phân cách “-“

Nếu bạn sử dụng nhiều JavaScript

var redBox = document.getElementById('...')

Vấn đề là cách đặt tên này không phù hợp với CSS.

Đừng bao giờ:

.redBox {
  border: 1px solid red;
}

Thay vì vậy, hãy làm như thế này:

.red-box {
   border: 1px solid red;
}

Đây là một tiêu chuẩn đặt tên cho CSS. Và điều này được cho là dễ đọc hơn.

Ngoài ra, nó cũng phù hợp với thuộc tính của CSS.

// Correct
.some-class {
   font-weight: 10em
}
// Wrong
.some-class {
   fontWeight: 10em
}

Qui ước đặt tên BEM

Các team có cách tiếp cận khác nhau để viết CSS selector. Một số nhóm sử dụng dấu phân cách, trong khi một số khác lại thích sử dụng một cách đặt tên có cấu trúc hơn gọi là BEM.

Nhìn chung, có 3 vấn đề mà qui tắc này giải quyết:

  1. Để biết 1 selector làm cái gì, chỉ cần nhìn vào tên của nó
  2. Để có một ý tưởng về nơi mà một selector được sử dụng, chỉ cần nhìn vào nó
  3. Để biết mối quan hệ giữa các các class name, chỉ cần nhìn vào chúng

Bạn đã bao giờ nhìn thấy class name được viết như sau:

.nav--secondary {
  ...
}
.nav__header {
  ...
}

Đó là quy tắc BEM.

Video: Tối ưu Front-end để web của bạn load dưới 5 giây

Giải thích BEM

BEM cố gắng phân chia giao diện người dùng tổng thể thành các component nhỏ có thể tái sử dụng.

Hãy quan sát hình ảnh dưới đây:

Hình này biểu diễn một component, chẳng hạn như một khối thiết kế.
Bạn có thể dễ đoán được B trong BEM là viết tắt của ‘Block’.
Trong thực tế, ‘block’ này đại diện cho điều hướng trang, tiêu đề, chân trang hoặc bất kỳ khối thiết kế khác.
Theo thực tiễn được giải thích ở trên, một class name lý tưởng cho component này sẽ là stick-man.
Component nên theo kiểu sau:
.stick-man {
  
 }

Chúng ta đã sử dụng các chuỗi giới hạn ở đây. Thật tuyệt vời!

E là viết tắt của “Elements”

E trong ‘BEM’ là viết tắt của Elements.

Khối thiết kế hiếm khi bị cô lập.

Ví dụ, stick-man phải có đầu, hai cánh tay và chân.

head, feetarms là tất cả các element bên trong component. Chúng có thể được xem như các component con, nghĩa là con của component bố mẹ nó.
Sử dụng quy tắc BEM, các element  của class name được lấy ra bằng cách thêm hai dấu gạch dưới, tiếp theo là tên phần tử.
Ví dụ:
.stick-man__head {
}
.stick-man__arms {
}
.stick-man__feet {
}

M là “Modifiers”

M trong ‘BEM’ viết tắt của Modifiers.

Điều gì sẽ xảy ra nếu stick-man ông bị sửa đổi và chúng ta có một stick-man có màu xanh hoặc đỏ?

Thực tế, đây có thể là nút đỏ hoặc nút màu xanh. Đây là những sửa đổi của component được đề cập.

Sử dụng BEM, các modifier class name được lấy ra bằng cách thêm hai dấu nối sau tên của phần tử.

Ví dụ:

.stick-man--blue {
}
.stick-man--red {
}

Ví dụ cuối cùng cho thấy các component cha mẹ đang được sửa đổi. Nhưng không phải lúc nào cũng như vậy.

Điều gì sẽ xảy ra nếu chúng ta có những stick-man có kích cỡ đầu khác nhau?

Lúc này các element đã được sửa đổi. Hãy lưu ý, element là một component con trong khối  tổng thể.

Các .stick-man đại diện cho Block , .stick-man__head element

Như đã thấy trong ví dụ ở trên, dấu gạch nối đôi cũng có thể được sử dụng như sau:

.stick-man__head--small {
}
.stick-man__head--big {
}

Hãy lưu ý việc sử dụng các dấu gạch nối đôi trong ví dụ trên. Điều này biểu thị một modifier.

Đây là điều cơ bản về cách quy tắc BEM hiệu quả như thế nào.

Cá nhân tôi có xu hướng chỉ sử dụng các class name dùng phân cách gạch ngang cho các dự án đơn giản và BEM cho các giao diện người dùng có liên quan.

Tại sao sử dụng các quy ước đặt tên?

Đặt tên là một việc cực kì khó. Chúng tôi đang cố gắng làm mọi việc dễ dàng hơn và tiết kiệm thời gian cho chúng tôi trong tương lai với code có thể duy trì nhiều hơn.

Đặt tên đúng cách trong CSS sẽ làm cho code của bạn dễ đọc và dễ dàng hơn.

Đặt đúng tên trong CSS sẽ giúp bạn dễ đọc và duy trì code hơn.

Nếu bạn chọn sử dụng quy tắc BEM, nó sẽ trở nên dễ dàng hơn để xem mối quan hệ giữa các component của bạn/khối chỉ bằng cách nhìn vào đánh dấu.

Đặt tên CSS với JavaScript Hooks

VD ta được chuyển giao code HTML trông như sau:

<div class="siteNavigation">
</div>

ta đã đọc bài này và nhận ra rằng đây không phải là cách tốt nhất để đặt tên cho những thứ trong CSS. Vì vậy, ta tiếp tục code và tái cấu trúc các codebase trước:

<div class="site-navigation">
</div>

Một nơi nào đó trong JavaScript code, có sử dụng class mà ta chưa rename, siteNavigation:

//the Javasript code
const nav = document.querySelector('.siteNavigation')

Vì vậy, với sự thay đổi class name, biến nav biến thành null.

Để ngăn chặn các trường hợp này, developer đã đưa ra các chiến lược khác nhau.

1.Sử dụng js- class names

Một cách để giảm thiểu các lỗi như vậy là sử dụng class name js-* để biểu thị mối quan hệ với DOM element đang được đề cập.

Ví dụ:

<div class="site-navigation js-site-navigation">
</div>

Và JavaScript code:

//the Javasript code
const nav = document.querySelector('.js-site-navigation')

Theo một quy ước, bất kỳ ai nhìn thấy js-site-navigation class name sẽ hiểu rằng có mối liên hệ với DOM element đó trong mã JavaScript.

2. Sử dụng thuộc tính Rel

Bạn có nhận ra điều này?

<link rel="stylesheet" type="text/css" href="main.css">

Về cơ bản, thuộc tính rel xác định mối quan hệ mà tài nguyên đã liên kết đến resource mà nó được tham chiếu.

Trong ví dụ trước, những người đề xướng kỹ thuật sẽ làm việc này:

<div class="site-navigation" rel="js-site-navigation">
</div>

Và với JavaScript:

const nav = document.querySelector("[rel='js-site-navigation']")

Tôi có nghi ngờ về kỹ thuật này, nhưng bạn có thể bỏ qua nó trong một số codebases. Yêu cầu ở đây là “có một mối quan hệ với Javascript, vì vậy tôi sử dụng thuộc tính rel để biểu thị điều đó”.

Web là một nơi lớn với rất nhiều “phương pháp” khác nhau để giải quyết cùng một vấn đề.

3. Không sử dụng data attribute

Một số developer sử dụng các data attributes như JavaScript Hooks. Điều này là không đúng. Theo định nghĩa, data attributes được sử dụng để lưu trữ dữ liệu tùy chỉnh.

Tip: Thêm các CSS comments

Điều này không liên quan gì đến các quy ước đặt tên, nhưng cũng sẽ giúp bạn tiết kiệm được nhiều thời gian.

Trong khi rất nhiều nhà phát triển web cố gắng không viết các bình luận JavaScript hoặc viết đại loại, tôi nghĩ bạn nên viết comment cho CSS.

Vì CSS không phải là “ngôn ngữ” thân thiện nhất, nếu có comment chi tiết rõ ràng thì bạn sẽ tiết kiệm thời gian khi bạn hoặc ai đó sau này xem lại code của mình.

Tham khảo thêm các vị trí tuyển dụng lập trình CSS lương cao cho bạn

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

10 tài liệu lập trình Android miễn phí từ cơ bản đến nâng cao

TopDev chọn lọc và giới thiệu các tài liệu lập trình Android miễn phí từ cơ bản đến nâng cao cùng những công cụ dành cho các bạn muốn tìm hiểu và bắt đầu lập trình Android, cũng như muốn nâng cao “tay nghề” và dấn thân vào con đường lập trình Android chuyên nghiệp.

Khám phá Top các vị trí lập trình Android hấp dẫn

  1. Android Programming for Beginners
Đây là tài liệu Android dành cho những người mới sử dụng JAVA và lập trình Android. Tác giả cung cấp hơn 40 ứng dụng nhỏ trong suốt cuốn sách để đi cùng với lời giải thích đơn giản và rõ ràng về các chủ đề. Từ Android Studio đến JAVA đến vòng đời sản phẩm, cuốn sách này bao gồm tất cả các khái niệm cơ bản bạn cần nắm để bắt đầu xây dựng ứng dụng Android đầu tiên của mình. https://topdev.vn/s/LOwqpcUg

2. Head First Android Development

Tuyển tập seri Head First đã mang đến cuốn sách tuyệt vời cho các lập trình viên. Head First Android Development thể hiện cách tiếp cận độc đáo, hướng dẫn bằng hình ảnh để việc học lập trình Android trở nên thú vị và hấp dẫn. Ngay cả đối với người mới bắt đầu làm quen Android, cuốn sách này sẽ giúp bạn nắm bắt cách xây dựng ứng dụng Android đầu tiên của mình một cách nhanh chóng. https://topdev.vn/s/ImtUrCX0

3. The Android Developer’s Cookbook – Building Applications with the Android SDK

Quyển sách dành cho các bạn muốn bắt tay vào xây dựng app trên nền tảng Android. Cập nhật các chương mới về phát triển giao diện người dùng và luồng nâng cao, thanh toán trong ứng dụng,…cùng với các kỹ thuật mới truy cập phần cứng NFC đến sử dụng Google Cloud Messaging. Bạn sẽ học các kỹ thuật thực hành tốt nhất để giải quyết hiệu quả các vấn đề phổ biến và để tránh những cạm bẫy trong toàn bộ vòng đời phát triển https://topdev.vn/s/cZtmq7hu

4. Android Programming: The Big Nerd Ranch Guide (2nd Edition)

Nếu bạn là người đã có kinh nghiệm lập trình JAVA, đây là một cuốn sách tuyệt vời cho việc học lập trình Android. Dựa trên khóa học Android Bootcamp trong một tuần được tài trợ bởi Big Nerd Ranch, cuốn sách này cung cấp những giải thích một cách toàn diện, thực tiễn và súc tích về các khái niệm, API trong lập trình Android.

https://topdev.vn/s/0arpSF9J

5. Android Programming: Pushing the Limits

Đây là một lựa chọn tuyệt vời khác cho lập trình viên Android đang tìm kiếm những thứ “nặng đô” hơn. Cuốn sách nhằm mục đích thúc đẩy các ranh giới lập trình Android với nhiều mẹo, thủ thuật và các kỹ thuật mà đa số chưa biết hoặc chưa được tận dụng. Đây sẽ giúp bạn trở thành lập trình viên Android cao cấp hơn. android-programing

6. Advanced Android Application Development

Đối với lập trình viên Android dày dạn kinh nghiệm đang tìm kiếm các chủ đề nâng cao và chuyên sâu hơn, đây là một lựa chọn tuyệt vời. Cuốn sách cung cấp các kỹ thuật lập trình Android cao cấp để giúp các lập trình viên xây dựng các ứng dụng ở mức chuyên nghiệp hơn. Ngoài ra, Advanced Android Application Development cung cấp cho nhà phát triển một bộ hướng dẫn toàn diện chắc chắn sẽ có ích. https://topdev.vn/s/Hy3s6oPv

7. Raspberry Pi Android Projects

Quyển sách cung cấp các kiến thức quản lý hầu hết các chức năng cơ bản của Raspberry Pi từ điện thoại Android của bạn. Sử dụng các dự án được tạo trong cuốn sách này để phát triển các dự án thú vị hơn nữa trong tương lai. Trải nghiệm học tập dựa trên dự án để giúp bạn khám phá những cách tuyệt vời để kết hợp sức mạnh của Android và Raspberry Pi.

https://topdev.vn/s/Io76Eeju

8. Android Recipes

Trong Android Recipes, bạn sẽ tìm thấy các ví dụ mã trực tiếp. Nó cung cấp lời khuyên thực tế sẽ giúp bạn hoàn thành công việc một cách nhanh chóng và tốt đẹp. Điều này có thể giúp bạn tiết kiệm rất nhiều công việc so với việc tạo một dự án từ đầu! https://topdev.vn/s/6m5t6pHd

9.30+ công cụ phát triển ứng dụng Android chuyên nghiệp ( Phần 1)

Tập hợp một số công cụ tốt nhất để nâng cao hiệu suất phát triển và xây dựng các ứng dụng Android. Những công cụ này đã giúp các nhà lập trình tiết kiệm rất nhiều thời gian quý giá từ cuộc sống hàng ngày và cũng như tạo các ứng dụng tốt hơn và chất lượng được nâng lên đáng kể.

https://topdev.vn/s/3qp9C65s

10. 30+ công cụ phát triển ứng dụng Android chuyên nghiệp ( Phần 2)

Là sự tiếp nối của phần 1, ở phần 2 tác giả đề cập những công cụ tiếp theo nhằm hỗ trợ đắc lực trong nâng cao hiệu suất phát triển và xây dựng các ứng dụng Android

Tìm việc làm các vị trí lập trình Android hấp dẫn tại TopDev.

Cách viết CV giúp lập trình viên ghi điểm với nhà tuyển dụng

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

Một CV tốt, đồng nghĩa với cơ hội bạn được nhà tuyển dụng để mắt đến càng cao. Để nâng cao khả năng trúng tuyển thì một bản CV chuyên dụng của từng ngành là điều không thể thiếu, nhất là đối với ngành đòi hỏi chuyên môn cao như công nghệ thông tin. Để viết CV xin việc IT thì có rất nhiều cách, và một CV IT gây ấn tượng thông thường có các đề mục cơ bản sau:

  1. Thông tin cá nhân: Liệt kê đơn giản họ tên, năm sinh, địa chỉ, email, số ĐT kèm ảnh đại diện nên rõ mặt, nghiêm túc, chất lượng rõ nét, không nên là ảnh selfie. Email cũng cần nghiêm túc và tốt nhất là bằng tên thật của bạn để thể hiện sự chuyên nghiệp.
  2. Mục tiêu nghề nghiệp: Nêu rõ định hướng của bạn trong con đường nghề nghiệp của mình. Hãy tóm tắt trong vòng 2-3 câu mục tiêu ngắn hạn/dài hạn của bạn đối với công việc đang ứng tuyển. Với mục này nhà tuyển dụng có thể đánh giá được phần nào năng lực cũng như tầm nhìn, và quyết định xem có nên đọc tiếp CV của bạn hay không.
  3. Kỹ năng: Liệt kê những gì bạn biết và/hoặc có kinh nghiệm và nêu chính xác mức độ hiểu biết của bạn trong từng mục. Phần này cũng quan trọng không kém trong CV ngành công nghệ thông tin.
  4. Kinh nghiệm làm việc: Tóm tắt, liệt kê những dự án, công ty mà bạn đã từng làm việc, kèm chức vụ và sắp xếp theo trình tự thời gian từ mới nhất đến cũ nhất. Đây có thể nói là phần quan trọng nhất của một CV IT.
  5. Thành tựu: Liệt kê thành tựu cá nhân trong các dự án đó. Thành tựu ở đây có thể là những gì bạn tự hào rằng mình đã làm được cho dự án, những điều bạn nhận ra và cải thiện được cho bản thân nhờ dự án.
  6. Thông tin khác: Bằng cấp, giải thưởng, dự án riêng (nếu có)

Tạo CV IT online, chuẩn ATS miễn phí trên TopDev

Tìm việc chỉ phụ thuộc vào may mắn là một quan niệm sai lầm. Sự chuẩn bị cẩn thận và đánh giá đúng khả năng của bản thân quyết định rất lớn đến việc thành công ứng tuyển của bạn. Để bạn không phải lo lắng quá nhiều về câu hỏi làm sao để có 1 CV IT chuẩn? TopDev đã tạo sẵn cho bạn những mẫu CV IT cực đẹp mà đơn giản kèm theo thông tin đầy đủ theo tiêu chuẩn. Bạn chỉ cần đơn giản là vào công cụ tạo CV online đáng tin cậy của TopDev.

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Tổng hợp các mẫu CV IT đẹp và cách viết CV xịn dành cho lập trình viên

Mẫu CV

Tổng hợp các mẫu CV IT đẹp – chuẩn dành cho các bạn lập trình viên Backend, Frontend, Fullstack, iOS, Android, PHP, .NET, Java… từ level Fresher cho đến Senior, Leader.

Giới thiệu

Viết CV luôn là một vấn đề nan giải cho bất kỳ ai. Tuy nhiên bạn chỉ cần dành ra 5 phút để tham khảo các mẫu CV IT chuẩn được TopDev thiết kế dành riêng cho lập trình viên, dựa trên hơn 1.000 mẫu CV Developer nổi bật trên thế giới, ứng tuyển thành công các vị trí tại các tập đoàn công nghệ lớn Microsoft, Google, Amazon…

Bạn sẽ biết cách làm thế nào để có một CV đúng, chuẩn và phù hợp với từng vị trí công việc cụ thể đối với ngành công nghệ thông tin, chọn lọc các thông tin tiêu chuẩn và cấu trúc thống nhất giúp Nhà tuyển dụng dễ dàng đánh giá kinh nghiệm và Tech stack của bạn.

  Cách viết CV giúp lập trình viên ghi điểm với nhà tuyển dụng

Hiện tại các mẫu cv này có hỗ trợ cả tiếng Anh lẫn tiếng Việt với các format chuẩn cho bạn sự lựa chọn tốt nhất.

>>> Xem thêm: Mẫu CV IT tiếng Anh hấp dẫn nhà tuyển dụng

Ngoài ra, việc có CV tốt cũng giúp cho bạn có được nhiều cơ hội tốt hơn trong tương lai, hãy nhớ rằng, trong CV phải luôn có đủ những thông tin sau đây.

  • Thông tin cá nhân: Liệt kê đơn giản họ tên, năm sinh, địa chỉ, email, số điện thoại kèm ảnh đại diện nên rõ mặt, nghiêm túc, chất lượng rõ nét, không nên là ảnh selfie. Email cũng cần nghiêm túc và tốt nhất là bằng tên thật của bạn để thể hiện sự chuyên nghiệp.
  • Mục tiêu nghề nghiệp: Nêu rõ định hướng của bạn trong con đường nghề nghiệp của mình. Hãy tóm tắt trong vòng 2-3 câu mục tiêu ngắn hạn/dài hạn của bạn đối với công việc đang ứng tuyển.

Với mục này nhà tuyển dụng có thể đánh giá được phần nào năng lực cũng như tầm nhìn, và quyết định xem có nên đọc tiếp CV của bạn hay không.

  • Kỹ năng: Liệt kê những gì bạn biết và/hoặc có kinh nghiệm và nêu chính xác mức độ hiểu biết của bạn trong từng mục. Phần này cũng quan trọng không kém trong CV ngành công nghệ thông tin.
  • Kinh nghiệm làm việc: Tóm tắt, liệt kê những dự án, công ty mà bạn đã từng làm việc, kèm chức vụ và sắp xếp theo trình tự thời gian từ mới nhất đến cũ nhất. Đây có thể nói là phần quan trọng nhất của một CV IT. Lưu ý hãy trình bày kinh nghiệm làm việc theo thứ tự thời gian ưu tiên những vị trí gần đây nhất và những kinh nghiệm liên quan đến vị trí mà bạn đang ứng tuyển.
  • Thành tựu/ Dự án: Liệt kê vai trò của cá nhân trong các thành tựu/dự án đó. Thành tựu ở đây có thể là những gì bạn tự hào rằng mình đã làm được cho dự án, những điều bạn nhận ra và cải thiện được cho bản thân nhờ dự án.
  • Thông tin khác: Bằng cấp, giải thưởng, dự án riêng (nếu có)
  5 mẹo và mẫu CV IT để gây ấn tượng với nhà tuyển dụng!

Các mẫu CV trên TopDev

Mẫu tham khảo 1

Mẫu CV IT

Mẫu tham khảo 2

Mẫu CV IT

Mẫu tham khảo 3

cv lập trình viên

Tạo CV IT online, chuẩn ATS miễn phí trên TopDev

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

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

Lập trình viên tại Việt Nam cần ít nhất 5 năm để hiểu rõ một công nghệ!

                                                                                                       TopDev via Noria

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

5 mẹo và mẫu CV IT để gây ấn tượng với nhà tuyển dụng!

CV của bạn chỉ có 5 giây để gây ấn tượng với nhà tuyển dụng!

“Rất nhiều CV của ứng viên ngành công nghệ thông tin đều viết quá dài và trình bày không được mạch lạc. Họ luôn cố gắng chia sẻ nhiều thông tin để có một hồ sơ thật ấn tượng. Tuy nhiên, trong một đợt tuyển dụng có rất nhiều CV được gửi về, nhà tuyển dụng chỉ có thời gian rất ngắn lướt qua và lựa chọn hồ sơ phù hợp để cân nhắc tiếp theo. Vì vậy để được nhận lời mời phỏng vấn, những gợi ý và mẫu CV IT dưới đây có thể giúp bạn nhanh chóng lọt vào mắt của nhà tuyển dụng” chia sẻ từ Mr. Xuân Sơn, Product Manager của Tuổi Trẻ Online.

1. ĐỘ DÀI

CV IT của bạn chỉ nên gói gọn trong 1 trang giấy khổ A4, nếu quá trình công tác của bạn lâu năm có thể kéo dài lên thành 2 trang để thể hiện rõ chi tiếp hơn.

2. CẤU TRÚC

Để thuận tiện cho nhà tuyển dụng, hãy đặt phần thông tin liên lạc ở phần đầu của hồ sơ, kế đến là tóm tắt về chuyên môn, những kỹ năng và kinh nghiệm của bạn, cuối cùng là phần học vấn và bằng cấp.  Hiện nay, bạn có thể tham khảo một số mẫu CV IT Tiếng anh và tiếng Việt phổ biến để tiết kiệm thời gian hơn cho việc thiết kế của bạn.

3. NỘI DUNG VÀ TỪ NGỮ

Phần tóm tắt chuyên môn hãy mô tả ngắn gọn về định hướng công việc và vị trí mong muốn sắp tới. Trong mục kỹ năng, chỉ liệt kê từ 4 đến 6 kỹ năng quan trọng nhất mang đến thành công trong công việc của bạn. Khi mô tả về kinh nghiệm làm việc, hãy sử dụng những động từ diễn tả thành công như “đạt được”, “gia tăng”… kèm theo một vài số liệu ấn tượng, điều này giúp bạn nổi bật hơn so với các CV khác.

Tạo CV IT online, chuẩn ATS miễn phí trên TopDev

4. ĐỊNH DẠNG

Hãy định dạng đơn giản và thông dụng nhất, để nhà tuyển dụng dễ dàng thấy được những điểm bạn muốn nhấn mạnh. Tránh dùng nhiều màu sắc, chữ in đậm hoặc viết hoa quá nhiều, chỉ gây khó chịu khi nhìn vào CV của bạn. Những thông tin quan trọng bạn nên đặt ở nữa trên hồ sơ và ở những khu vực nổi bật để gây chú ý nhà tuyển dụng khi họ lia mắt.

5. KIỂM TRA NHIỀU LẦN

Điều này giúp bạn tránh những sai sót lỗi chính tả, và đảm bảo bạn cung cấp đầy đủ thông tin để giới thiệu bản thân và thuyết phục nhà tuyển dụng hẹn bạn một buổi phỏng vấn. Đừng nghĩ tìm việc chỉ phụ thuộc vào may mắn. Sự chuẩn bị cẩn thận và đánh giá đúng khả năng của bản thân quyết định rất lớn đến việc thành công ứng tuyển của bạn. Bạn nên nhớ, nhà tuyển dụng chỉ có 5 giây để quyết định có xem tiếp hay không!

Đừng quên tham khảo nhiều mẫu CV đẹp dành cho lập trình viên, viết xong CV thì mạnh dạn apply vào những công việc IT với mức lương cực hấp dẫn ở TopDev nhé.

THÔNG BÁO THAM DỰ Sự kiện Thương mại điện tử LỚN NHẤT năm 2019!

Tháng 3 này, Hiệp Hội Thương mại điện tử Việt Nam – VECOM sẽ tổ chức sự kiện LỚN NHẤT mở đầu năm 2019:

DIỄN ĐÀN TOÀN CẢNH THƯƠNG MẠI ĐIỆN TỬ VIỆT NAM

Vietnam Online Bussiness Forum 2019 (VOBF 2019)

>>> Xem chi tiết: http://vobfhcm.vecom.vn/

Sự kiện với quy mô toàn quốc, quy tụ cộng đồng thương mại điện tử trong và ngoài nước.

Với sự góp mặt đến từ các đại diện: VECOM, NIELSEN, AMAZON, TIKI, SHOPEE và FACEBOOK, GOOGLE.

Chỉ diễn ra 1 lần duy nhất trong năm, đây là cơ hội lớn cho các doanh nghiệp tiến lên bước mở rộng quy mô với chủ đề “Scaling Up Your Bussiness – Vươn ra toàn cầu”.

Bạn sẽ được nghe và cũng tham gia trao đổi với các chuyên gia hỗ trợ mở rộng quy mô kinh doanh, giúp bạn tiếp cận khách hàng cả nước, hoặc khách hàng toàn cầu.

Nội dung chi tiết, bạn có thể tham khảo tại đây!

200 người đăng ký sớm nhất sẽ được ƯU ĐÃI mức vé EARLY BIRD – Giá thấp nhất

* Thời gian: Ngày 28 Tháng 03 năm 2019, 8.30AM – 5PM
* Địa điểm: Trung tâm Hội nghị Capella Parkview, Số 3 Đặng Văn Sâm, Phường 9, Phú Nhuận, Tp. Hồ Chí Minh

Lưu ý: Số lượng chỗ ngồi có hạn, BTC chỉ ưu tiên giữ chỗ cho những ai đăng ký và hoàn tất thanh toán sớm nhất!

Hotline: 0902940969 – Ms. Thạch

Stateless là gì? Stateful là gì?

stateful vs stateless là gì

Stateless

Trong lập trình web, chúng ta có sự tương tác giữa client với server. Phần mềm gồm 2 thành phần chính: phần mềm và data. Như vậy, một phần mềm được thiết kế theo tương tác client – server thì phần nhiều tập lệnh sẽ nằm phía server. Client có nhiệm vụ gửi dữ liệu lên để xử lý sau đó nhận kết quả trả về. Vậy stateful vs stateless là gì?

Để hiểu khái niệm stateful vs stateless là gì chúng ta cần phải biết rằng, Stateless là thiết kế không lưu dữ liệu của client trên server. Có nghĩa là sau khi client gửi dữ liệu lên server, server thực thi xong, trả kết quả thì “quan hệ” giữa client và server bị “cắt đứt” – server không lưu bất cứ dữ liệu gì của client. Như vậy, khái niệm “trạng thái” ở đây được hiểu là dữ liệu.

  Cách làm HTTPS hoạt động trên local trong 5 phút
  Responsive HTML bằng một dòng CSS

Stateful

Stateful là một thiết kế ngược lại, chúng ta cần server lưu dữ liệu của client, điều đó đồng nghĩa với việc ràng buộc giữa client và server vẫn được giữ sau mỗi request (yêu cầu) của client. Data được lưu lại phía server có thể làm input parameters cho lần kế tiếp.

Tổng kết và ví dụ

HTTP là một Application Protocol dạng stateless, tương tác client-server theo HTTP thì phần server sẽ không lưu lại dữ liệu của client. HTTP ban đầu chỉ được dùng đơn thuần cho website, client gửi request, server nhận request xử lý rồi trả về lại cho client hiển thị. Sau đó thì kết thúc 1 quy trình. Sau này người ta mới bắt đầu nâng cấp cho phép website giống như một ứng dụng stateful bao gồm html, database (mysql, mongodb…), transaction…

Có 4 cách lưu data của client khi xây dựng Web Application bao gồm: URL Rewriter, Form, Cookie, HTTP Session.

TopDev

Có thể bạn muốn đọc thêm:

Xem thêm IT Jobs for Developer hấp dẫn lương cao tại TopDev!

Kinh nghiệm xương máu sau 9 tháng làm Kỹ sư phần mềm (Phần 1)

kinh-nghiem-xuong-mau-sau-9-thang-lam-ky-su-phan-mem-phan-1

Tác giả: Benjamin Schachter

Sau 9 tháng làm việc tại Dexter với tư cách là một lập trình viên, tôi đã học được rất nhiều điều.  Cũng vì vậy, tôi đã quyết định viết một bài đăng blog chia sẽ về những trải nghiệm, cũng như một bài đăng một bài kĩ thuật về Self Positioning React Component mà tôi đã thực hiện trong vài tháng làm việc tại đây. Nhận được công việc mới chỉ là bước khởi đầu, làm thật tốt công việc được giao lại là một câu chuyện hoàn toàn khác, là một lập trình viên tôi hoàn toàn hiểu điều đó.

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

  Cách tôi nhân rộng một dự án trị giá 86 triệu đô la chỉ với 57 dòng code!

  Đi phỏng vấn vị trí React Native cần trang bị những gì?

Những suy nghĩ của tôi về vai trò của mình đã thay đổi đáng kể kể từ khi tôi bắt đầu. Tôi đã nghĩ rằng trở thành một nhà phát triển phần mềm thì phải “xử lý” đám code càng nhanh càng tốt. Tuy nhiên, điều đó có vẻ không đúng thực tế lắm, như chuyện bạn viết code nhanh nhưng không chất lượng, buộc phải thay đổi liên tục sẽ không phải là cách giúp cho doanh nghiệp của bản có thể bị trì trệ hơn. May mắn thay, tôi đã gặp một người sếp có suy nghĩ tương tự, anh ấy cũng là dân phần mềm như tôi.

Mục tiêu của bạn sẽ là: Viết code chất lượng tốt và giao tiếp tốt với đồng nghiệp. Bạn không phải được trả tiền chỉ để code, bạn được trả tiền để suy nghĩ và tìm ra vấn đề. Sản phẩm đi kèm là tư duy tinh tể và chỉ dẫn máy làm theo dưới dạng code. Tôi muốn giải quyết vấn đề trong một dòng code dễ đọc hơn 10 dòng code khó hiểu. Tôi muốn giải quyết vấn đề trong 5 dòng code có thể đọc được so với một dòng code phức tạp, nested code kèm theo nhiều loại toán tử phức tạp. Tôi nghĩ bạn sẽ hiểu ý tôi muốn nói gì.

Muốn biết phải hỏi muốn giỏi phải học.

Những ngày đầu, tôi đã được sếp gửi cho một đường link để tham khảo, sau khi đọc tôi thật sự lo lắng về khả năng của mình. Tôi vẫn luôn rất ý thức trước khi đặt bất kỳ câu hỏi nào.

Tôi có hẳn riêng mình một check list trước khi nhờ người khác hỗ trợ điều gì:

  • Đây có phải là một câu hỏi mà tôi đã hỏi trước đó, và nếu có, tôi đã ghi lại câu trả lời ở đâu?
  • Đây có phải là điều tôi có thể Google không?
  • Điều này đã được ghi chép lại ở đâu đó trong nội bộ?
  • Chuyện gì đang xảy ra ở đây? Nguyên nhân sâu xa của lỗi hoặc các phản ứng bất ngờ mà tôi đang gặp phải là gì?
  • Tôi có thực sự hiểu câu hỏi tôi đang cố gắng để trả lời? Bạn có thể dành thời gian để đọc lại vấn đề một lần nữa thay vì đưa ra câu trả lời nửa vời hoặc câu trả lời hấp tấp.

Sau khi làm theo các bước này, tôi sẽ thử giải quyết vấn đề một mình, tìm một giải pháp đã được từng được document lại, hoặc hỏi một câu hỏi với ngữ cảnh tốt hơn và chi tiết hơn để giúp người khác dễ dàng trả lời hơn. Thậm chí, tốt hơn nữa, nếu tôi có thể đặt một câu hỏi hay và được trả lời qua đoạn chat, đồng đội của tôi không cần phải bỏ mọi thứ để giúp tôi.

Nếu tôi đã đi hết 90% con đường để giải quyết vấn đề thì thật ra chỉ cần 10% sự trợ giúp nữa thôi, một nhà phát triển cấp cao sẽ rất vui khi giúp bạn vì biết rằng bạn đã cố gắng hết mức có thể. Tìm kiếm người khác để giải quyết vấn đề của bạn không phải là một cách tuyệt vời để xây dựng lòng tin trong nhóm của bạn.

Những người thông minh thích những câu hỏi hay – vì vậy đừng ngại khi hỏi họ.

Video: Trọn bộ các chủ đề nâng cao của DevOps

Tránh những sai lầm cũ và hỏi những câu hỏi mà ai cũng đã biết câu trả lời.

Điều này nói dễ hơn là thực hiện, bạn có thể ứng dụng nó vào bất cứ ngành nào, không chỉ lập trình. Rất nhiều khái niệm và thông tin mới sẽ khiến mắc phải những sai lầm không đáng có, và là không thể tránh khỏi. Để hạn chế việc này, hãy nghiên cứu nhiều hơn, Google có đầy đủ thông tin. Xem kĩ các tài liệu, chúng là bạn của bạn. Hãy hỏi nếu như sau khi tìm hiểu bạn vẫn không có trả lời. Sau đó hãy viết chúng ra thành tài liệu, và đặt cho mình những mục tiêu để cải thiện nó.

Hãy đảm bảo rằng lần tiếp theo bạn gặp vấn đề tương tự, bạn biết phải làm gì. Tất cả chúng ta đều mắc sai lầm, nhưng việc tự ý thức và nỗ lực thay đổi là cách để mọi người trở nên tốt hơn.

Luôn xem lại những gì mình đã làm

Không ai thích đi qua PR và bảo bạn gỡ bỏ console.logs,  debuggers hoặc bảo bạn sửa lỗi linting. Tôi sẽ không xuất bản bài đăng này mà không đọc qua một vài lần và nhờ một người bạn xem qua nó trước.

Nhìn kĩ vào code của bạn và tự hỏi những câu hỏi sau:

  • Tôi đã viết một đoạn logic phức tạp. Có chức năng tương tự nào trong ứng dụng có thể giải quyết vấn đề này theo cách dễ đọc hơn, linh hoạt hơn hay chung chung không?
  • Nếu không, tôi có nhớ lý do tại sao tôi đã viết code này trong một tuần hay không? Nếu câu trả lời là không, tôi muốn đổi code hoặc bình luận nó. Người duyệt PR nên có một số lí do giải thích tại sao tôi lại đưa ra quyết định đó.
  • Hãy chắc chắn rằng code của bạn đang đi qua linting và được kiểm tra trước khi đưa nó cho bất kì ai khác.
  • Tôi có đang lặp lại hay không? Tôi có thể làm gọn logic bị lặp bằng một hàm hay không ?
  • Nếu đây là code của người khác mà tôi đang xem, tôi sẽ đưa ra những bình luận nào? Tôi muốn thay đổi gì để nó rõ ràng hơn?

Hãy thử nhìn vào code của bạn vào ngày hôm sau, bạn sẽ nhìn thấy rất nhiều sự khác biệt. Liệu có gì không ổn trong logic của các đoạn code? Liệu các component của bạn có xử lý logic đúng hay không?

Ngoài ra, việc tự đánh giá code tốt tiết kiệm thời gian và tiền bạc cho công ty. Đó là cách tốt nhất để bạn tìm ra bug của bạn và tự khắc phục chúng thay vì phải nhờ người khác tìm ra chúng sau hai ngày.

Điều cuối cùng nói về việc xem lại code của bạn. Test tất cả vào MỌI THỨ bạn đã làm. Tôi muốn code của tôi gửi cho bất cứ ai cũng phải tốt đến mức không thể chỉnh sửa. Nếu họ bấm vào một trang mới và thấy được một lỗi lớn hoặc màn hình trắng, điều đó chứng minh tôi đã không thực sự xem xét lại công việc của mình. Grep cho code bạn đã chỉnh sửa và đảm bảo rằng bạn không làm hỏng bất cứ thứ gì bằng việc bổ sung thêm vào component.

Nghe có vẻ ngớ ngẩn, nhưng những sản phẩm có quá nhiều dòng code lớn phức tạp và bạn có thể không nhận ra cho đến khi bạn đã làm hỏng một cái gì đó.

Tôi chắc rằng, bạn sẽ không muốn xem bản draft đầu tiên của bài blog này 🙂

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

Cách tôi nhân rộng một dự án trị giá 86 triệu đô la chỉ với 57 dòng code!

Tác giả: Tait Brown

Cảnh sát Victoria là cơ quan thực thi pháp luật chính của Victoria, Úc. Với hơn 16.000 xe bị mất cắp ở Victoria trong năm qua – tổn thất khoảng 170 triệu đô – cơ quan này đang thử nghiệm nhiều giải pháp kỹ thuật nhằm giải quyết nạn trộm xe. Họ gọi open source project – hệ thống này là BlueNet.

Để giúp ngăn chặn việc bán xe ăn cắp, đã có một dịch vụ dựa trên web tên VicRoads để kiểm tra tình trạng đăng ký xe. Bộ cũng đã đầu tư vào một máy quét tấm giấy cố định – một camera cố định quét qua lưu lượng để tự động xác định các xe bị đánh cắp.

Đừng hỏi tôi tại sao, nhưng một buổi chiều tôi đã có mong muốn mẫu thử nghiệm một chiếc máy quét nhãn đĩa xe gắn máy sẽ tự động thông báo cho bạn nếu một chiếc xe đã bị đánh cắp hoặc đã không đăng ký. Hiểu rằng những thành phần cá nhân này tồn tại, tôi tự hỏi làm thế nào để kết hợp chúng với nhau khó khăn đến thế nào.

Cảnh sát Victoria vừa mới tung ra bản thử nghiệm về một phần mềm tương tự, và chi phí phát hành ước tính đã ở đâu đó trong khoảng 86.000.000 đô. Một người bình luận đã chỉ ra rằng với 86 triệu đô để trang bị cho 220 chiếc xe thì sẽ tính ra trung bình 390,909 đô mỗi chiếc.

Chắc chắn chúng ta có thể làm tốt hơn một chút.

Các tiêu chí làm nên thành công

Trước khi bắt đầu, tôi lên kế hoạch về yêu cầu chính cho thiết kế sản phẩm:

#1: Việc xử lý hình ảnh phải được thực hiện local

Streaming video trực tiếp đến nơi xử lí trung tâm dường như là cách tiếp cận hiệu quả nhất để giải quyết vấn đề này. Bên cạnh tuyệt vời cho lưu lượng truy cập dữ liệu, bạn cũng giới thiệu độ trễ mạng vào một quá trình có thể đã được khá chậm.

Mặc dù một thuật toán về centralized machine learning chỉ có thể có được sự chính xác hơn theo thời gian, chúng ta muốn tìm hiểu nếu một local thực hiện trên thiết bị sẽ là “đủ tốt”.

#2: Phải làm việc với hình ảnh có chất lượng thấp

Bởi vì tôi không có Raspberry Pi hoặc webcam USB nên tôi sẽ sử dụng footage của dashcam – nó có sẵn và là nguồn lý tưởng cho dữ liệu mẫu. Giống như added bonus, dashcam video đại diện cho chất lượng chung của footage mà bạn mong muốn từ các camera gắn trên xe.

#3: Cần được xây dựng dựa trên công nghệ mã nguồn mở 

Dựa trên một phần mềm độc quyền có nghĩa là bạn sẽ get stung mỗi khi bạn yêu cầu thay đổi hoặc tăng cường – và tiếp tục stinging cho mỗi yêu cầu được thực hiện sau đó. Sử dụng công nghệ mã nguồn mở là không cần suy nghĩ.

Relying upon a proprietary software means you’ll get stung every time you request a change or enhancement — and the stinging will continue for every request made thereafter. Using open source technology is a no-brainer.

Kết luận

Ở level cao, giải pháp của tôi lấy một hình ảnh từ dashcam video, đưa nó qua qua một hệ thống nhận dạng tấm giấy phép mã nguồn mở được cài đặt cục bộ trên thiết bị, truy vấn dịch vụ kiểm tra đăng ký, và sau đó trả về kết quả.

Dữ liệu được trả lại cho thiết bị được cài đặt trong xe thực thi pháp luật bao gồm xe và mô hình (mà nó chỉ sử dụng để xác minh các xe đã bị đánh cắp), tình trạng đăng ký và bất kỳ thông báo nào của chiếc xe được báo cáo bị đánh cắp.

Nghe có vẻ đơn giản, đó là bởi vì nó thực sự là. Ví dụ, xử lý hình ảnh tất cả có thể được xử lý bởi thư viện openalpr.

Tất cả được dùng để nhận diện các ký tự trên license plate:

openalpr.IdentifyLicense(imagePath, function (error, output) {
   // handle result
});

Đây là những điều của tôi chứng minh khái niệm như sau:

// Open form and submit enquire for `rego`
function getInfo(rego) {
	horseman
	  .userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0')
	  .open(url)
	  .type('#registration-number-ctrl input[type=text]', rego)
	  .click('.btn-holder input')
	  .waitForSelector('.ctrl-holder.ctrl-readonly')
	  .html()
	  .then(function(body) {
	  	console.log(processInfo(body, rego));
	    return horseman.close();
	  });
}

// Scrape the results for key info
function processInfo(html, rego) {
	var $ = cheerio.load(html);
	var vehicle = $('label.label').filter(function() {
	  return $(this).text().trim() === 'Vehicle:';
	}).next().text().trim();

	var stolen = $('label.label').filter(function() {
	  return $(this).text().trim() === 'Stolen status:';
	}).next().text().trim();

	var registration = $('label.label').filter(function() {
	  return $(this).text().trim() === 'Registration status & expiry date:';
	}).next().text().trim();

	return {
		rego,
		vehicle,
		stolen,
		registration
	};
}

Kết quả

Sự công nhận về giấy phép mã nguồn mở được không được công nhận. Ngoài ra, các thuật toán nhận dạng hình ảnh có thể không được tối ưu hóa cho tấm giấy phép của Úc.

Giải pháp đã có thể nhận diện tấm giấy phép trong một lĩnh vực rộng.

Các chú thích được thêm vào có hiệu lực. Biển số được nhận dạng mặc dù reflection và lens distortion.

Mặc dù, giải pháp này đôi khi gặp vấn đề với các chữ cái trên biển số.

Sai lầm trên biển số, nhầm M thành H

Nhưng … các giải pháp cuối cùng sẽ có được sự chính xác.

Một vài khung hình sau đó, M được xác định chính xác và ở mức độ tin cậy cao hơn

Như bạn thấy trong hai hình ảnh trên, việc xử lý hình ảnh một vài khung hình sau đó đã nhảy lên từ mức độ tự tin là 87% đối với tóc trên 91%.

Với tính chính xác có thể được cải thiện bằng cách tăng tỷ lệ mẫu và sau đó sắp xếp theo thứ hạng độ tin cậy cao nhất. Ngoài ra, một ngưỡng có thể được đặt chỉ chấp nhận sự tự tin lớn hơn 90% trước khi tiếp tục xác nhận số đăng ký.

Đây là các bản sửa lỗi code đầu tiên và không loại trừ việc đào tạo phần mềm nhận dạng license plate với bộ dữ liệu cục bộ.

Còn về 86,000,000 đô

Để công bằng, tôi hoàn toàn không biết có bao nhiêu con số 86 triệu đô – và tôi cũng không thể nói về tính chính xác của công cụ mã nguồn mở của tôi mà không cần đào tạo so với hệ thống BlueNet.

Tôi hy vọng phần của ngân sách đó bao gồm việc thay thế một số cơ sở dữ liệu và các ứng dụng phần mềm để hỗ trợ truy vấn các cấp phép có tần số cao, độ trễ thấp trên mỗi xe.

Mặt khác, chi phí khoảng 391k đô mỗi xe dường như khá tốn kém – đặc biệt nếu BlueNet không chính xác và không có các dự án công nghệ thông tin quy mô lớn để ngừng hoạt động hoặc nâng cấp các hệ thống bị phụ thuộc.

Các ứng dụng tương lai

Mặc dù rất dễ bị cuốn vào bản chất Orwellian của một mạng lưới những người tán thành tấm giấy phép luôn có nhiều ứng dụng tích cực của công nghệ này. Hãy tưởng tượng một hệ thống thụ động quét người cùng đi xe và tự động cảnh báo các nhà chức trách và thành viên gia đình đến vị trí hiện tại của họ.

Xe của Teslas đã được làm đầy bằng camera và cảm biến với khả năng nhận được các bản cập nhật OTA – hãy tưởng tượng biến những chiếc xe này thành một đội quân tốt. Các tài xế của Ubers và Lyft cũng có thể được trang bị các thiết bị này để tăng đáng kể phạm vi bảo hiểm.

Sử dụng công nghệ mã nguồn mở và các component hiện có, có vẻ như có thể cung cấp một giải pháp cung cấp một tỷ lệ lợi nhuận cao hơn nhiều – cho một khoản đầu tư ít hơn 86 triệu đô.

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

  Top 5 công cụ mã nguồn mở dành cho MySQL administrator
  Những lập trình viên phiên bản X-men: Những code project "dị" nhất trên GitHub

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

AI đi vào thực tiễn (Phần 2): Trí tuệ nhân tạo đang xâm nhập và định hình tương lai

Ngày nay, chúng ta đã quen thuộc với các khái niệm như Trí tuệ nhân tạo (artificial intelligence). Điển hình như các gợi ý, đề xuất sách và phim trên Amazon và Netflix hay danh sách phát nhạc trên Spotify, Youtube, … Nhưng năm 2019 sẽ mang lại cho chúng ta những gì có thể xem là “siêu cá nhân hóa” (hyper-personalization) cho người tiêu dùng thông qua một loạt các ứng dụng về sức khỏe, tài chính, mua sắm và mọi thứ liên quan. Điều này là một bước tiến mới của các ứng dụng AI khi khả năng dự đoán chính xác ngày càng tăng cao, ít tốn chi phí hơn cho dù dữ liệu cá nhân người dùng thì ngày càng dày đặc. Dưới đây là một số lĩnh vực mà chúng ta có thể mong đợi “siêu cá nhân hóa” dựa trên AI vào năm nay.

1. Thể dục thể chất (Physical Fitness)

Sức khỏe là một trong những lĩnh vực hot của các ứng dụng AI. Các ứng dụng thể dục và thiết bị đeo như Fitbit và Apple Watch và thậm chí một số tai nghe VR có thể tự động thu thập dữ liệu của người dùng – chẳng hạn như bạn đã đi bao nhiêu bước hay leo bao nhiêu nấc thang – và tổng hợp với tất cả các dữ liệu của toàn bộ người dùng để tạo ra hồ sơ thể hình riêng biệt dành cho từng người và lên các kế hoạch theo đó, giống như bộ điều chỉnh nhiệt thông minh Nest sử dụng dữ liệu từ khắp các gia đình để tối ưu hóa các kế hoạch sử dụng năng lượng. Những gợi ý như “Giảm lượng thức ăn của bạn 210 calo / ngày để tăng tuổi thọ thêm 1,5 năm” sẽ không còn xa.

Physical Fitness

Bên cạnh đó, vấn đề thường xuyên ở hầu hết các ứng dụng tập thể dục – sức khỏe – thể hình là việc người dùng mệt mỏi khi nhập các loại thực phẩm họ đã ăn – hoặc gian lận và chọn không nhập chúng. Điều đó dẫn đến nếu không có dữ liệu chính xác thì các phân tích là vô nghĩa. Tuy nhiên, AI đã có giải pháp khắc phục: Khi AI trở nên tiên tiến hơn, bạn chỉ cần chụp ảnh những gì bạn ăn hoặc ứng dụng sẽ theo dõi lượng thức ăn thông qua camera của smartphone và tự động hóa quy trình thu thập dữ liệu. Một số ứng dụng như Lose It đã sử dụng công nghệ này.

2. Sức khỏe tâm thần (Mental Heath)

*Là một trạng thái không chỉ không có rối loạn hay dị tật tâm thần mà còn là một trạng thái tâm thần hoàn toàn thoải mái, cần phải có chất lượng nuôi sống tốt, có được sự cân bằng và hòa hợp giữa cá nhân, người xung quanh và môi trường xã hội.

Bạn có muốn biết thời gian nào trong ngày là lúc tâm trạng bạn suy sụp nhất? Hay cách mà mọi người tác động đến bạn sẽ có phản ứng với mức năng lượng như thế nào? Sẽ sớm có một ứng dụng cho điều đó. Các ứng dụng có thể tự thực hiện cảm biến, sử dụng cảm biến sinh học để theo dõi nhịp tim / nhịp thở, phản ứng ngoài da và các chỉ số khác để đánh giá phản ứng của chúng ta đối với mọi thứ từ buổi sáng đi làm đến bữa tối với luật pháp. Sau đó, chúng ta có thể sử dụng các báo cáo toàn diện được tạo ra cho lối sống thoải mái hơn, ít căng thẳng hơn, hoặc ít nhất là nhận thức được con người và các tình huống có nhiều khả năng làm cho lòng bàn tay đổ mồ hôi.

Mental Heath

Công nghệ nhận dạng khuôn mặt dựa trên AI cũng có ứng dụng rộng rãi trong sức khỏe tâm thần. Affectiva, một doanh nghiệp xuất phát từ MIT, cung cấp các sản phẩm ứng dụng “kích hoạt cảm xúc” bằng cách đọc và phân tích biểu cảm khuôn mặt với độ chính xác tốt hơn con người. Vì vậy, các ứng dụng sẽ đánh giá mức độ căng thẳng hoặc các triệu chứng lo âu / trầm cảm của bạn và đưa ra gợi ý phù hợp: “Thực hiện hai phút thở sâu” hoặc “Hẹn gặp bác sĩ trị liệu”. Công ty cũng đã phát triển một sản phẩm trong xe hơi để đánh giá trạng thái cảm xúc trong khi lái xe từ biểu cảm khuôn mặt và giọng nói, cải thiện an toàn khi trên đường.

  AI đi vào thực tiễn (Phần 1): Những biến động của năm 2018

3. Tài chính cá nhân (Personal Finance)

Có rất nhiều câu hỏi đặt ra trong lĩnh vực này: Làm thế nào để chúng ta biết những khoản đầu tư nào phù hợp nhất với sự tăng trưởng, rủi ro và nhu cầu thanh khoản của từng cá nhân? Và khi nào nên đầu tư vào chúng? Và đầu tư bao nhiêu? Và khi nào bán?

Câu trả lời ngắn gọn: “Chúng tôi không rõ. Nhưng AI thì có thể”

Các ứng dụng AI sẽ ngày càng cải thiện khả năng dự đoán rủi ro của chúng ta và các tính năng của hồ sơ đầu tư khác bằng cách “đọc giữa các dòng” theo nghĩa đen. Các nhà nghiên cứu đã phát triển một thuật toán deep learning có thể phân tích lời nói hoặc văn bản để đánh giá mức độ tin cậy của người nói / người viết về bất kỳ điều gì về hiệu quả của sản phẩm nào đó và xác định tính chính xác của các dự báo thu nhập được.

Personal Finance

Một ứng dụng tài chính cá nhân kết hợp công nghệ như vậy có thể yêu cầu bạn viết phản hồi cho một số tình huống chấp nhận rủi ro khác nhau, sau đó đánh giá mức độ tự tin của bạn về mỗi kế hoạch để tạo ra một kế hoạch đầu tư được cá nhân hóa cao trong ngắn hạn hoặc dài hạn. Trên thực tế, công ty Narrative Science ở giai đoạn đầu đang sử dụng xử lý ngôn ngữ tự nhiên để phát triển các ứng dụng loại này và có khả năng giúp người dùng hiểu được mức độ chịu đựng của họ đối với các lớp đầu tư như cổ phiếu hòa vốn.

4. Mua sắm (Shopping)

Là người mua sắm, chúng ta muốn được cá nhân hóa trong các lựa chọn của mình, từ phụ kiện, quần áo cho đến ô tô; nhưng bên cạnh đó tôi cũng muốn mua những thứ mà những người giống tôi mua hoặc những thứ tôi muốn giống như vậy. Các ứng dụng AI tập trung vào bán lẻ có thể giúp xác định sở thích sản phẩm của chúng ta bằng cách không chỉ nhìn vào các hành vi mua hàng trong quá khứ, mà cả những người giống chúng ta, để đưa ra các đề xuất dựa trên hình thức đám đông hậu trường (behind-the-scenes crowdsourcing). Và điều này đã xảy ra khi Amazon đã tổng hợp dữ liệu cá nhân để phát triển các đề xuất sản phẩm và các dự đoán khác trong một thời gian trước đó. Nhưng cụ thể nó sẽ xuất hiện vào năm 2019 – trên các ngành và loại sản phẩm – và mức độ cá nhân hóa để mong đợi sẽ tăng lên.

Shopping

Nhận dạng khuôn mặt nâng cao đồng nghĩa với việc trải nghiệm tại cửa hàng được cá nhân hóa hơn nhiều. Ví dụ, các nhà bán lẻ sẽ có thể nhận ra các khách hàng của chương trình khách hàng thân thiết đã bước vào và đẩy các giao dịch, các đề xuất được cá nhân hóa cho họ thông qua điện thoại của họ, cùng với việc cung cấp dịch vụ ở mức cao hơn (như tư vấn mua sắm). Nhận dạng khuôn mặt cũng sẽ cho phép doanh nghiệp phân tích phong cách mua sắm của khách hàng hoặc phân khúc hoặc đường dẫn trong cửa hàng chặt chẽ hơn.

Nhìn chung, siêu cá nhân hóa dựa trên AI mang lại lợi ích tiềm năng rất lớn nhưng nó cũng kèm theo một lời cảnh báo: Các doanh nghiệp càng sở hữu nhiều dữ liệu cá nhân của chúng ta, nguy cơ lạm dụng và mất cắp dữ liệu càng tiềm ẩn. Tuy nhiên, các vấn đề bảo mật đang được đẩy mạnh cùng với AI để nhằm đảm bảo độ an toàn và sự trải nghiệm để giúp cuộc sống chúng ta ngày một tốt hơn. Hiện nay TopDev đang có sự kiện “AI và NLP – Ứng dụng thực tiễn và cách bắt đầu” được mở rộng hơn từ chuỗi sự kiện “AI – Ứng dụng thực tiễn và cách bắt đầu” với nhiều cái nhìn đa chiều về AI và NLP trong thực tế xung quanh chúng ta.

AI&NLP

THÔNG TIN CHI TIẾT

Thời gian & địa điểm: 17:30 – 21:00 ngày 19/03/2019

Link đăng ký: https://meetup.vn/e/EL2?src=a

ĐỘC GIẢ TOPDEV DÙNG NGAY CODE MARCH2019 ĐỂ NHẬN ƯU ĐÃI 50.000Đ CHO SỰ KIỆN TRÊN.

AI đi vào thực tiễn (Phần 1): Những biến động của năm 2018

Năm 2018 có thể coi là một dấu mốc lớn trong lĩnh vực trí tuệ nhân tạo (AI), dù có cả những nốt thăng và trầm.

Các tin đáng chú ý về AI trong năm 2018

Xe tự động: Bất kể những diễn biến không mấy lạc quan, rõ ràng năm 2018 là một năm quan trọng trong việc thúc đẩy ngành công nghiệp sản xuất xe tự vận hành đi lên. Hàng loạt cuộc thử nghiệm được tiến hành của Uber, Waymo (của Google), Lyft cùng nhiều công ty khác được diễn ra và đã có những thành quả đầu tiên sau giai đoạn kiện tụng về quyền sở hữu trí tuệ giữa các ông lớn. Có thể nói xe tự lái đã chính thức có mặt dù vẫn còn nhiều vấn đề phải giải quyết trước khi các phương tiện có khả năng tự chủ hoàn toàn.

Xe tự động

Trợ lý ảo, ứng dụng tại các doanh nghiệp: Các thiết bị tích hợp trợ lý “ảo” và được điều hành thông qua giọng nói đã được đầu tư về hình ảnh, tính năng một cách đáng kể và có một vị trí lớn trong xu hướng AI trong năm 2018. Các trợ lý ảo có thể gọi điện, trò chuyện với người thật hoàn hảo tới mức không thể hình dung là họ đang nói chuyện với máy. Chatbot trở nên phổ biến tại lĩnh vực dịch vụ chăm sóc khách hàng, trong khi những công nghệ tự quản lý thông tin tích hợp AI đã dần hoàn thiện hơn. Nhiều công ty cũng đang nỗ lực đưa ra những bước tiến mới trong quá trình xử lý ngôn ngữ tự nhiên, giúp doanh nghiệp có thể tìm hiểu rõ hơn các luồng dữ liệu phi cấu trúc của họ. Hoạt động marketing có sử dụng hỗ trợ từ AI cũng là một trong những xu hướng nổi bật trong năm 2018, với khái niệm siêu cá nhân hóa được chú ý hơn khi các công ty nhận ra lợi ích của AI trong hoạt động này.

 

trợ lý ảo

Chương trình AI cấp quốc gia: Rất nhiều nước trên thế giới đều đẩy mạnh và xem việc phát triển AI là một trong những nhiệm vụ hàng đầu. Điển hình như lộ trình ba bước của Trung Quốc với nguồn quỹ đầu tư 5 tỷ USD cùng một công viên công nghệ trị giá 2,1 tỷ USD để tạo điều kiện phát triển công nghệ, Mỹ và Pháp với kế hoạch đầu tư lần lượt là 2 tỷ USD và 1,5 tỷ Euro cho các sáng kiến liên quan đến AI, …

Chương trình AI cấp quốc gia

Riêng ở Việt Nam, “Kế hoạch phát triển trí tuệ nhân tạo ở Việt Nam đến năm 2025” đã được ban hành và sẽ tập trung phát triển các công nghệ nền tảng về xử lý và nhận dạng âm thanh, tiếng nói, hình ảnh, thị giác máy, tích hợp dữ liệu, bản đồ số, quản lý dây chuyền sản xuất. Nhiều trường đại học cũng đã bổ sung và cập nhật các kiến thức liên quan đến AI vào chương trình đào tạo cũng như một số trường đào tạo miễn phí ngành Robot và Trí tuệ nhân tạo cho sinh viên.

Bên cạnh đó, các mảng khác của trí tuệ nhân tạo cũng thu được những kết quả rất tích cực: nhận diện khuôn mặt ngày càng phát triển giúp tăng cường khả năng bảo mật và quản lý, quá trình tự động hóa robot (RPA) và học máy ngày càng được đẩy mạnh, các nguồn vốn được rót vào cũng như bộ luật AI được ban hành giúp cho AI ngày càng lan rộng và phát triển mạnh mẽ hơn.

AI một trong những công nghệ đang xâm nhập vào thực tiễn, góp phần định hướng tương lai đang tạo ra nhiều cơ hội cho các doanh nghiệp trong thời kỳ chuyển đổi số. Nhưng để đi đến những điều lớn lao, AI là gì và đang được ứng dụng xung quanh chúng ta như thế nào? bạn nên nắm rõ. Một trong những tech-meetup đáng chú ý vào tháng 03/2019 là “AI và NLP – Ứng dụng thực tiễn và cách bắt đầu”

Độc giả TopDev Blog có thể tham gia sự kiện theo thông tin bên dưới:

AI&NLP

Persol – Quy mô tầm cỡ và cơ hội rộng mở chào đón Technical Project Manager

Persol - Quy mô tầm cỡ và cơ hội rộng mở chào đón Technical Project Manager

Với sự lớn mạnh hơn 90 công ty trong và ngoài nước, Persol vẫn đang tiếp tục phát triển thêm nguồn lực để mở rộng quy mô. Với Persol, con người chính là nền tảng, mỗi cá nhân cần được đầu tư cho sự phát triển. Đó cũng là lý do tại sao môi trường việc làm tại Persol lại có thể thu hút được nhiều nhân tài.

Persol: “Work and Smile”!

Thương hiệu Persol có từ tháng 7 năm 2016, đến nay tập đoàn Persol đã lớn mạnh với hơn 90 công ty trong và ngoài nước, tham gia vào nhiều lĩnh vực: cung cấp các giải pháp về System, Outsourcing, Product, Global team system và Tư vấn công nghệ. Là một đối tác phát triển cá nhân, Tập đoàn Persol hoạt động để rút ra tiềm năng cá nhân và tối đa hóa các cơ hội sống. Persol mong muốn giúp tạo ra một xã hội trong đó tất cả những người làm việc có thể trải nghiệm niềm vui của Tagline nhóm của Persol: “Work and Smile”.

Song song với việc phát triển quy mô, Persol luôn luôn chú trọng đến phát triển nhân lực và thu hút nguồn lao động chất lượng. Bởi vì, Persol bắt nguồn từ “Person- con người” với tâm niệm: sự phát triển của mỗi cá nhân chính là cốt lõi sự phát triển của công ty.

5 yếu tố tạo nên giá trị của Persol Process & Technology Vietnam:

➤ Your job – your joy: niềm vui đến từ chính công việc bạn đang làm

➤ Work & smile: hăng say lao động và thư giãn khi cần

➤ When you like your work everyday is a holiday: được làm điều mình thích mỗi ngày, đó là sự tận hưởng.

➤ Stay hungry- Stay foolish: hãy cứ khao khát, hãy cứ dại khờ

➤ Hiring the right person: tuyển đúng người, dùng đúng lúc.

Persol không ngừng chiêu mộ nhân tài với nhiều đãi ngộ xứng đáng cả vật chất lẫn tinh thần. Đặc biệt hiện tại, Persol đang mở ra cơ hội cho những tài năng muốn thử sức ở vai trò lãnh đạo – vị trí Technical Project Manager (PHP, Java, C#) với mức lương lên đến 3,000 USD.

Persol Việt Nam tìm bạn đồng hành, vạch lối đi mới cho nền công nghệ Việt Nam

Persol luôn mong mỏi kết nối được với những nhà quản lý tài năng, cùng theo đuổi đam mê, cùng gặt hái cái kết ngọt cho những người trẻ đầy ý chí. Technical Project Manager (PHP, Java, C#) chính là tấm vé mà Persol muốn gửi đến các kỹ sư công nghệ tại Việt Nam với những quyền lợi đặc biệt:

  • Mức lương hậu hĩnh lên tới $3,000;
  • Được review hiệu quả công việc nâng mức thu nhập 2 lần/ năm;
  • Nghỉ phép thả ga tận 24 ngày lương vẫn về đều đặn;
  • Luôn có cà phê, trà và bia miễn phí giải tỏa “cơn say” công việc;
  • Có đãi ngộ riêng dành cho nhân viên có trẻ nhỏ;
  • Được chi thoải mái trong những ngày đặc biệt của nhân viên và gia đình;Vi vu du ngoạn với company trip, team building hàng tháng;
  • Được làm việc với đối tác người Nhật, rèn luyện kỹ năng chuyên môn trong môi trường toàn cầu;
  • Nhận sự hỗ trợ nhiệt tình từ đồng nghiệp, kề vai sát cánh chinh chiến các dự án lớn nhỏ.

Tìm việc làm Project Manager tại các doanh nghiệp hàng đầu trên TopDev

Mô tả công việc:

  • Làm việc trực tiếp với khách hàng Nhật Bản;
  • Thành thạo tiếng Nhật để hiểu rõ những yêu cầu từ phía khách hàng;
  • Quản lý thay đổi phạm vi dự án, tiến độ dự án;
  • Quản lý lịch trình để đảm bảo công việc được xác định, phân công và hoàn thành đúng hạn;
  • Phân tích, làm rõ và chuyển giao yêu cầu cho các thành viên;
  • Tham gia vào việc design documents, test cases.

Yêu cầu:

  • Bằng N2 tiếng Nhật;
  • Kỹ năng viết và giao tiếp Tiếng Anh tốt;
  • Ít nhất 4 năm kinh nghiệm trong lĩnh vực phát triển phần mềm;
  • Có kiến thức vững chắc về JAVA hoặc PHP hoặc C;
  • Ưu tiên ứng viên đã làm việc tại Nhật Bản hoặc có kinh nghiệm làm việc với các đối tác Nhật Bản.

Để có thể cùng nhau đi trên chặng đường dài phía trước, Pesol rất mong tìm được người phù hợp để tiếp tục đồng hành chinh phục những giấc mơ lớn. Với vị trí Technical Project Manager (PHP, Java, C#) tại Persol, con số $3,000 không chỉ là mức thu nhập xứng đáng mà còn là niềm tự hào cho sự nỗ lực và ý chí của chính bạn!

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Xác thực và phân quyền trong Microservices

Tác giả: Hòa Nguyễn

Xác thực (authentication, trả lời câu hỏi bạn là ai) và phân quyền (authorization, trả lời câu hỏi bạn có thể làm được gì) microservices luôn là thành phần không thể thiếu của mọi hệ thống, nhưng mức độ áp dụng thì lại tùy thuộc vào từng giai đoạn.

Nếu bạn làm mọi thứ chặt chẽ ngay từ đầu, nó có thể làm tăng độ phức tạp và làm chậm sự phát triển của công ty. Nhưng nếu bạn làm nó quá muộn, thì có thể bạn sẽ hứng chịu nguy cơ bị tấn công và rủi ro từ đó. Với 1 công ty e-commerce như Tiki, rủi ro đó rất hiện hữu với các hệ thống liên quan tới thanh toán, tiền ảo (Tiki Xu), mã khuyến mại (coupon), phiếu quà tặng (giftcard) và nhiều hệ thống nhạy cảm khác…

Bắt đầu từ Monolithic

Tiki xuất phát là 1 hệ thống monolithic, thông thường ở hệ thống như vậy sẽ có 1 module chung quản lý việc xác thực và phân quyền, mỗi user sau khi đăng nhập sẽ được cấp cho 1 Session ID duy nhất để định danh.

Phía client có thể lưu Session ID lại dưới dạng cookie và gửi kèm nó trong mọi request. Hệ thống sau đó sẽ dùng Session ID được gửi đi để xác định danh tính của user truy cập, để người dùng không cần phải nhập lại thông tin đăng nhập lần sau

Khi Session ID được gửi lên, server sẽ xác định được danh tính của người dùng gắn với Session ID đó, đồng thời sẽ kiểm tra quyền của user xem có được truy cập tác vụ đó hay không.

Giải pháp session và cookie vẫn có thể sử dụng, tuy nhiên ngày nay chúng ta có nhiều yêu cầu hơn, chẳng hạn như các ứng dụng Hybrid hoặc SPA (Single Page Application) có thể cần truy cập tới nhiều hệ thống backend khác nhau, vì vậy session và cookie lấy từ 1 server có thể không sử dụng được ở server khác.

Bài toán khó Microservices

Trong kiến trúc microservices, hệ thống được chia nhỏ thành nhiều hệ thống con, đảm nhận các nghiệp vụ và chức năng khác nhau. Mỗi hệ thống con đó cũng cần được xác thực và phân quyền, nếu xử lý theo cách của kiến trúc Monolithic ở trên chúng ta sẽ gặp các vấn đề sau:

  • Mỗi service có nhu cầu cần phải tự thực hiện việc xác thực và phân quyền ở service của mình. Mặc dù chúng ta có thể sử dụng các thư viện giống nhau ở mỗi service để làm việc đó tuy nhiên chi phí để bảo trì thư viện chung đó với nhiều nền tảng ngôn ngữ khác nhau là quá lớn.
  • Mỗi service nên tập trung vào xây dựng các nghiệp vụ của mình, việc xây dựng thêm logic về phân quyền làm giảm tốc độ phát triển và tăng độ phức tạp của các service.
  • Các service thông thường sẽ cung cấp các interface dưới dạng RESTful API, sử dụng protocol HTTP. Các HTTP request sẽ được đi qua nhiều thành phần của hệ thống. Cách truyền thống sử dụng session ở server (stateful) sẽ gây khó khăn cho việc mở rộng hệ thống theo chiều ngang.
  • Service sẽ được truy cập từ nhiều ứng dụng và đối tượng sử dụng khác nhau, có thể là người dùng, 1 thiết bị phần cứng, 3rd-party, crontab hay 1 service khác. Việc xác định định danh (identity) và phân quyền (authorization) ở nhiều ngữ cảnh (context) khác nhau như vậy là vô cùng phức tạp

Dưới đây là một số giải pháp, kỹ thuật và hướng tiếp cận mà Tiki đã áp dụng cho bài toán này.

Định danh

Sử dụng JWT

JWT (Json Web Token) là 1 loại token sử dụng chuẩn mở dùng để trao đổi thông tin kèm theo các HTTP request. Thông tin này được xác thực và đánh dấu 1 cách tin cậy dựa vào chữ ký. JWT có rất nhiều ưu điểm so với session.

  • Stateless, thông tin không được lưu trữ trên server.
  • Dễ dạng phát triển, mở rộng.
  • Performance tốt hơn do server đọc thông tin ngay trong request (nếu session thì cần đọc ở storage hoặc database)

Mã hóa RSA cho JWT

Phần chữ ký sẽ được mã hóa lại bằng HMAC hoặc RSA.

  • HMAC: đối tượng khởi tạo JWT (token issuer) và đầu nhận JWT (token verifier) sử dụng chung 1 mã bí mật để mã hóa và kiểm tra.
  • RSA: sử dụng 1 cặp key, đối tượng khởi tạo JWT sử dụng Private Key để mã hóa, đầu nhận JWT sử dụng Public Key để kiểm tra.

Như vậy với HMAC, cả 2 phía đều phải chia sẻ mã bí mật cho nhau, và đầu nhận JWT hoàn toàn có thể khởi tạo 1 mã JWT khác hợp lệ dựa trên mã bí mật đó. Còn với RSA, đầu nhận sử dụng Public Key để kiểm tra nhưng không thể khởi tạo được 1 JWT mới dựa trên key đó. Vì vậy mã hóa sử dụng RSA giúp cho việc bảo mật chữ ký tốt hơn khi cần chia sẻ JWT với nhiều đối tượng khác nhau.

Sử dụng Opaque Token khi muốn để kiểm soát phiên làm việc tốt hơn

Opaque Token (còn được gọi là stateful token) là dạng token không chứa thông tin trong nó, thông thường là 1 chuỗi ngẫu nhiên và yêu cầu 1 service trung gian để kiểm tra và lấy thông tin. Ví dụ:

{
"access_token": "c2hr8Jgp5jBn-TY7E14HRuO37hEK1o_IOfDzbnZEO-o.zwh2f8SPiLKbcMbrD_DSgOTd3FIfQ8ch2bYSFi8NwbY",
"expires_in": 3599,
"token_type": "bearer"
}

Transparent Token (còn được gọi là stateless token) thông thường chính là dạng JWT, token này bản thân chứa thông tin và không cần 1 service trung gian để kiểm tra. Hãy cùng so sánh 2 loại token này

Như vậy ta có thể thấy Transparent Token mang lại tốc độ tốt hơn, đơn giản dễ sử dụng với cả 2 phía, không phù thuộc vào 1 server trung tâm để kiểm tra. Còn Opaque Token kiểm soát tốt hơn các phiên làm việc của đối tượng, chẳng hạn khi bạn muốn thoát tất cả các thiết bị đang đăng nhập.

OAuth 2

Các token sẽ được khởi tạo thông qua OAuth 2, là phương thức chức thực phổ biến nhất hiện nay, mà qua đó một service, hay một ứng dụng bên thứ 3 có thể đại điện (delegation) cho người dùng truy cập vào 1 tài nguyên của người dùng nằm trên 1 dịch vụ nào đó.

OAuth 2 là chuẩn mở, có đầy đủ tài liệu, thư viện ở tất cả các ngôn ngữ khác nhau giúp cho việc tích hợp, phát triển dựa trên nó trở nên dễ dàng và nhanh chóng.

Kiến trúc cho xác thực và phân quyền

Sau khi đã có định danh và giao thức dùng để giao tiếp, câu hỏi tiếp theo là cần trả lời câu hỏi đối tượng với định danh đó có quyền thực hiện 1 hành động, truy cập 1 tài nguyên nào đó hay không. Ở Tiki, bên cạnh các service được xây dựng mới, vẫn còn tồn tại các hệ thống cũ (legacy) chạy song song, thế nên hiện nay Tiki có 2 cách thức tổ chức phân quyền như dưới đây.

Xác thực, phân quyền tại lớp rìa

Theo mô hình tất cả mọi request sẽ được xác thực khi đi qua API Gateway hoặc BFF (Backend For Frontend). BFF chính là lớp service ở rìa (Edge Service) được thiết kế riêng cho từng ứng dụng (ví dụ IOS, Android, Management UI). Chúng ta sẽ đặt xác thực và phân quyền ở lớp rìa này

  • API Gateway sẽ bắt buộc tất cả request sẽ cần gửi kèm token để định danh
  • Nếu token này là JWT (đối với OpenID Connect), Gateway có thể kiểm tra tính hợp lệ của token thông qua chữ ký (signature), thông tin (claim) hoặc đối tượng khởi tạo (issuer)
  • Nết token này là Opaque Token, Gateway có thể phân tích (introspect) token, đổi (exchange) lấy JWT và truyền tiếp vào trong cho các services.
  • API Gateway hoặc BFF kiểm tra các policy xem có hợp lệ hay không thông qua Authorization Server trung tâm.
  • Các microservices không thực hiện lớp xác thực và phân quyền nào, có thể tự do truy cập bên trong vùng nội bộ (internal network).

Mô hình này có điểm tương đồng với kiến trúc Monolithic khi đặt xác thực phân quyền tại 1 số service nhất định, việc xây dựng và bảo trì sẽ tốn chi phí nhỏ hơn, tuy nhiên sẽ để lộ 1 khoảng trống bảo mật rất lớn ở lớp trong do các service có thể tự do truy cập lẫn nhau.

Chúng ta có thể đặt 1 số rule ở góc độ network đối với các service bên trong này tuy nhiên các rule này sẽ tương đối đơn giản và không thể đáp ứng được các nghiệp vụ truy cập dữ liệu lẫn nhau giữa các team/service (mở rộng ra là các công ty nội bộ) độc lập nhau

Xác thực, phân quyền tại các service

Ở mô hình này, mỗi service (trừ 1 số ngoại lệ) khi được thiết kế và xây dựng các giao tiếp APIs (API Interface) mở rộng được và có thể phục vụ cho thế giới bên ngoài. Một service hôm nay được xây dựng cho các nghiệp vụ bên trong nội bộ công ty, nhưng ngày mai có thể sẵn sàng để mở ra cho các đối tác, các lập trình vên ngoài.

Điều này sẽ giúp cho các service/team chủ động được hoàn toàn về các tài nguyên hiện có, tài nguyên đó được cấp cho những đối tượng nào, được truy cập từng phần hay toàn phần…

Để làm được việc này, vai trò rất lớn sẽ nằm ở service IAM (Identity Access Management), IAM nắm giữ các định danh của toàn bộ các đối tượng (user, service, command…) cùng với các bộ luật phân quyền chi tiết cho từng loại tài nguyên.

Việc mỗi service phải tự thực hiện việc xác thực, phân quyền sẽ làm tăng chi phí khi xây dựng các service, bên ngoài các nghiệp vụ chính thì cần thêm lớp middleware để giao tiếp với IAM.

Tuy nhiên các service sẽ có được sự tự chủ hoàn toàn, chủ động về việc cung cấp tài nguyên cho các đối tượng, và tăng tốc phát triển hơn vì nhiều trường hợp client có thể truy cập thẳng tới các service mà không cần phát triển thêm lớp BFF ở giữa.

Access Control

Xây dựng hệ thống luật (rule) hiệu quả không bao giờ là dễ dàng, khi yêu cầu về nghiệp vụ tăng cao kéo theo yêu cầu về phân quyền càng phức tạp. Hãy lấy 1 ví dụ cụ thể để làm rõ, mỗi ứng dùng thông thường sẽ gán quyền cho 1 thành viên cụ thể (ví dụ John được quyền tạo sản phẩm). Mở rộng ra trong 1 hệ thống microservices, đối tượng ở đây có thể là người dùng, service, crontab…

Có 1 vài cách tiếp cận cho việc phân quyền như trên, hãy thử đi qua các cách khác nhau để có nhiều góc nhìn khác nhau.

Access Control List (ACL)

Trong ví dụ trên các bạn có thể thấy 1 ma trận của đối tượng và quyền, nó gần tương đương với cách quản lý file trên Linux (chmod) và phù hợp với những ứng dụng có ít đối tượng. Khi hệ thống lớn lên mô hình này sẽ không thể quản lý nổi bởi ma trận được tạo ra quá lớn và phức tạp. Do vậy và mô hình này không còn phổ biến hiện tại.

Role-Based Access Control (RBAC)

RBAC liên kết đối tượng tới các vai trò (role), và từ vai trò tới các quyền. Chẳng hạn vai trò Administratorcó thể thừa hưởng mọi quyền mà vai trò Manager có, điều này giúp làm giảm độ phức tạp của ma trận quyền, thay vì gán toàn bộ quyền cho Administrator thì chỉ cần cho Administrator thừa hưởng các quyền của Manager.

RBAC rất phổ biến và bạn có thể thấy ở mọi nơi, so với ACL thì RBAC giúp giảm thiểu độ phức tạp khi số lượng đối tượng + quyền tăng cao. Tuy nhiên RBAC chưa thỏa mãn được 1 số trường hợp, ví dụ khi cấp quyền 1 sản phẩm chỉ được sửa bởi người tạo, người dùng nằm trong 1 phòng ban xác định hoặc quyền phân biệt với các người dùng từ nhiều hệ thống (tenant) khác nhau.

Policy-Based Access Control (PBAC)

PBAC được xây dựng dựa trên Attribute Based Access Control (ABAC), qua đó định nghĩa các quyền để diễn đạt một yêu cầu được cho phép hay từ chối. ABAC sử dụng các thuộc tính (attribute) để mô tả cho đối tượng cần được kiểm tra, mỗi thuộc tính là 1 cặp key-value ví dụ Department Marketing. Nhờ đó ABAC có thể giúp phân quyền mịn hơn, phù hợp với nhiều ngữ cảnh (context) và nghiệp vụ (business rules) khác nhau.

PABC được định nghĩa thông qua các policy được viết dưới dạng 1 ngôn ngữ chung XACML (eXtensible Access Control Markup Language). Một policy định nghĩa 4 đối tượng subject, effect, action và resource. Ví dụ john (subject) được allowed(effect) để mà delete(action) product với ID john-leman(resource). Nhìn qua thì nó gần giống với cách định nghĩa 1 ACL.

{
"subjects": ["user:john"],
"effect": "allow",
"actions": ["catalog:delete"]
"resources": ["product:john-leman"],
}

Chúng ta có thể bổ sung subject, action cũng như resource thêm vào policy nếu muốn.

{
"subjects": ["user:john", "user:katy", "user:perry"],
"effect": "allow",
"actions": ["catalog:delete", "catalog:update", "catalog:publish"]
"resources": ["product:john-leman", "product:john-doe"]
}

Bạn có thể thắc mắc thế thì PBAC khác gì ACL, và đây là sự khác biệt

Luật ưu tiên

  • Mặc định nếu không có policy phù hợp, yêu cầu sẽ bị từ chối
  • Nếu không có policy nào deny, có ít nhất một policy allow thì yêu cầu được cho phép
  • Nếu có 1 policy là deny, thì yêu cầu luôn bị từ chối

Regular Expression

Các policy cho phép khai báo sử dụng regular expression, như ở ví dụ này cho phép tất cả người dùng được xem thông tin product.

{
"subjects": ["user:<.*>"],
"effect": "allow",
"actions": ["catalog:read],
"resources": ["product:<.*>"]
}

Điều kiện

Các policy có thể bổ sung các điều kiện để thu hẹp phạm vi của quyền, ví dụ như chỉ áp dụng cho 1 dải IP nhất định, hoặc chỉ cho phép người tạo sản phẩm được sửa sản phẩm đó.

{
"subjects": ["user:ken"],
"actions" : ["catalog:delete", "catalog:create", "catalog:update"],
"effect": "allow",
"resources": ["products:<.*>"],
"conditions": {
"IpAddress": {
"addresses": [
"192.168.0.0/16"
]
}
}
}

Tổng kết

Việc liên tục mở rộng nghiệp vụ và hệ thống đòi hỏi các service phải tự xác thực, qua đó không phân biệt service đó là bên trong (internal) hay bên ngoài (external), giúp các team dễ dàng mở rộng tích hợp với nhau. Việc này đòi hỏi mô hình xác thực chung phải hoạt động ổn định, tối ưu và đáp ứng được hiệu năng cao.

Tham khảo thêm các vị trí tuyển dụng ngành cntt hấp dẫn tại đây

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

  Giao tiếp hiệu quả giữa các Microservice
  Microservices là gì? Speed up Microservices 1: Tác dụng phụ và một số chiến lược cơ bản

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

Phân tích 80+ email từ chối ứng tuyển vào vị trí lập trình viên Python và kết quả không ai ngờ đến!

Không lúc này thì lúc khác, mỗi người chúng ta sẽ nhận được vài cái mail từ chối xin việc thôi. Bạn biết đấy, những mail như vậy thường bắt đầu với câu “Cảm ơn bạn đã quan tâm” và kết thúc với những giấc mơ tan vỡ, dập tắt mọi hy vọng đẹp đẽ vốn có. Xin lỗi, có vẻ tôi hơi cực đoan một chút. Tuy nhiên, việc nhận được mail từ chối là một trải nghiệm không dễ dàng gì.

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

  Giao tiếp hiệu quả giữa các Microservice
  Cloud-Native Microservices Với TIBCO: Khám phá dịch vụ bằng cách sử dụng Consul

Tìm việc làm python nhiều vị trí

Tin tôi đi, tôi hiểu rõ lắm! Vì sao ư? Vì tôi đã nhận được hơn 80 email từ chối công việc trong năm qua khi đăng ký làm thực tập sinh. Những con số sau sẽ cho bạn rõ tình trạng của tôi trước khi chúng ta vào vấn đề chính nhé!

Số công ty nộp đơn 234
Hồi âm 93
Từ chối 90
Offer 3

Điều đáng chú ý là, ít nhất là cho chương trình thực tập sinh, việc không nhận được phản hồi thường rất ít gặp. Trên thực tế, hơn 60% công ty mà tôi ứng tuyển đều không thấy phản ứng gì. Theo tôi, điều này đáng lo ngại hơn nhiều so với việc nhận được câu trả lời “không” rõ ràng. Ít nhất trong trường hợp đó, chúng ta sẽ tiếp tục tìm kiếm công ty khác thay vì tiếp tục hy vọng trong vô vọng.

Nhưng thử tưởng tượng xem, sau khi nghe từ “không” đến tận 80 lần, theo tự nhiên, bạn sẽ sinh ra một cảm giác “đối kháng”. Chính sự đối kháng ấy cùng với một chút tò mò là điều khiến tôi nảy ra dự án này. Tóm lại, tôi muốn điều tra xem nguyên nhân gì khiến nhà tuyển dụng gửi những mail từ chối tự động như vậy và chúng khác nhau như thế nào giữa các công ty. Nếu bạn muốn xem thêm về dự án của tôi, vui lòng truy cập vào GitHub repo.

Về phần còn lại của bài viết này, tôi sẽ chia sẻ cách tôi phân tích các email từ chối ra sao.

Bước 1: Thu thập dữ liệu

Trước tiên, hãy lấy dữ liệu! Khi truy vấn hộp thư đến Gmail của tôi, tôi đã tìm thấy hơn 1.000 email chứa các từ khóa “thực tập” và “ứng dụng”. Điều này khiến mọi việc trở nên khó khăn một chút từ góc nhìn tự động hóa.

Tôi đã ngồi phân loại các mail từ chối của mỗi công ty. Thậm chí tôi còn tạo một nhãn trong Gmail có tên “Job Rejection”. Xong xuôi, đã đến lúc tận dụng sức mạnh của Python. Tôi đã đăng nhập bằng imaplib và xóa bỏ các phần nổi của email. Để phân tích nội dung, tôi đã mã hóa văn bản bằng nltk  và xóa bất kỳ dấu câu và stop words nào có trong mail.

Xem thêm các vị trí lập trình viên python

Bước 2: Những cụm từ phổ biến

Bạn có bao giờ thắc mắc rằng tại sao các mail từ chối đều sử dụng một ngôn ngữ chung không? Tôi thường gặp rất nhiều cụm từ giống nhau, dường như được sử dụng từ công ty này đến công ty khác. Một số công ty có cách dùng từ ngữ rất linh hoạt và sáng tạo, nhưng rất hiếm khi gặp những trường hợp như vậy.

Hãy xem các từ và cụm từ phổ biến nhất được sử dụng cho những email này.

Như bạn có thể thấy ở trên, các nhà tuyển dụng lựa chọn từ “application” và “your” nhiều hơn hẳn những từ khác. Không cần phải bỏ ra nhiều công sức, bạn đã có thể lọc ra các mail có chủ đề như vậy:

  • Thank you for your interest.
  • Update on your [Insert role] application.

Những từ này thường là điềm báo cho những tin xấu đấy!

Video: Nhận dạng âm thanh: phân biệt giọng nam, nữ và vùng miền (Bắc Trung Nam)

 

Bước 3: Khung thời gian

Hãy tiến hành thêm một bước nữa là tổng hợp thời gian các email từ chối được gửi đi. Điều này khiến tôi nhớ đến một lời khuyên lâu đời: đừng nên sa thải nhân viên vào thứ Sáu, vì chúng ta không biết cuối tuần họ sẽ làm gì. Mặc dù chuyện này không quan trọng bằng chuyện sa thải nhân viên, nhưng vẫn rất thú vị khi thử nghĩ xem nhà tuyển dụng chọn thời gian nào để gửi “hung tin” đến ứng viên.

Sau đây là phân tích của tôi dựa trên các ngày trong tuần:

Có vẻ “Hump Day” (thứ Tư theo tư duy của người Mỹ) ngày thứ tư đen tối. Thứ năm ở vị trí nhì bảng, các ngày còn lại có số lượng khá nhất quán. Cuối tuần là khoảng thời gian nghỉ ngơi, tuy nhiên vẫn có một số nhà tuyển dụng gửi mail vào thứ Bảy?! Xấu hổ…

Đối với giờ trong ngày, độ phân bố nhìn khá đều theo như dự đoán của chúng ta. Có vẻ như số lần từ chối dao động vào lúc 9 giờ sáng đến giữa trưa. Thông thường đây là giờ bắt đầu làm việc của các công ty theo múi giờ EST và PST. Chỉ có một lần từ chối duy nhất là sau 5 giờ chiều. Và công ty đó không ai khác ngoài P&G.

Đến đây, phần phân tích dữ liệu của thôi đã hoàn tất.

Tổng kết

Dư án phân tích email từ chối nhận việc đối với tôi khá thú vị. Hơn thế nữa, nó cho tôi kinh nghiệm thực tiễn trong quá trình tìm viêc sau này cũng như cách ứng xử khi nhận được email từ chối. Không nhiều người có đủ coi trọng kỹ năng đối diện với thất bại đâu.

“Tôi đã thất bại nhiều và nhiều lần trong cuộc sống của tôi … và đó là lý do tại sao tôi thành công” – Michael Jordan

Sau hơn 80 email từ chối, rõ ràng, bạn sẽ quen với khái niệm thất bại. Tôi thấy mình ngày càng ít do dự khi nộp đơn vào các vị trí tại các công ty uy tín. Điều này cho phép tôi có được cơ hội mà ban đầu tôi không nghĩ nó nằm trong tầm tay của mình.

Nếu bạn đang đọc bài này, hãy tận dụng những cơ hội đó, tiếp cận nhà tuyển dụng thêm một chút, và hãy tự tin đối diện với thất bại. Rồi lại đứng lên. Lại cố gắng. Chỉ qua quá trình dài cố gắng, chúng ta mới có được thành công. Và khi bạn đã chạm đến đỉnh vinh quang, đừng quên nhìn lại những thất bại đã qua và tự nói với lòng mình rằng:

Thank you for your interest.

TopDev via Medium

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

ADVN và cơ hội onsite Singapore dành cho “chiến binh” Ruby on Rails

ADVN và cơ hội onsite Singapore

Với vị thế hiện tại, ADVN đang dần chiếm ưu thế trong mối quan hệ hợp tác với các thương hiệu công nghệ hàng đầu. Nhằm mục đích tiến xa hơn trong lĩnh vực phát triển các dự án outsource, ADVN vẫn đang không ngừng chiêu mộ các tài năng IT với mức lương vô cùng hấp dẫn.

Sự tín nhiệm bởi các doanh nghiệp hàng đầu về công nghệ dành cho ADVN!

Từ năm 2016, ADVN trở thành nhà phân phối chính thức các thiết bị tin học mang thương hiệu tầm cỡ thế giới tại Việt Nam. ADVN đang ngày càng khẳng định vị thế của mình bởi sự tín nhiệm từ các thương hiệu công nghệ hàng đầu như MSI, Sony, Hitachi, InFocus, Prolink… Đây được xem là bước đà phát triển cho ADVN trong mối quan hệ hợp tác với các doanh nghiệp công nghệ ở thị trường quốc tế.

Hiện nay, ADVN đang tập trung sang các dự án outsource, thương mại điện tử và quảng cáo. Với mong muốn mang đến những sản phẩm, dịch vụ chất lượng kết hợp công nghệ tiên tiến nhất, ADVN đang ra sức săn đón các tài năng IT để cùng đồng hành phát triển.

Đội ngũ IT tại ADVN hiện đang tìm kiếm một mảnh ghép mới với vai trò là một Ruby on Rails Developer, là người thích phát triển phần mềm web, thương mại điện tử với việc tích hợp vào các ứng dụng mobile. Tại đây, ứng viên sẽ được phát triển năng lực của mình, phối hợp làm việc cùng với các lập trình viên khác, Project Manager và đội ngũ Infrastructure.

ADVN và con số offer đến $1,500 dành cho Ruby on Rails Developer

Nếu bạn muốn hợp tác cùng đội ngũ ADVN để nâng tầm giá trị kinh nghiệm và chuyên môn của mình, hãy gửi CV ứng tuyển ngay hôm nay. ADVN sẵn sàng tạo cho bạn một điều kiện không gian làm việc tốt nhất, đi kèm với mức lương thưởng và đãi ngộ xứng đáng:

  • Mức lương hấp dẫn $800 – $1,500;
  • Review lương hàng năm, nâng cao chất lượng sống;
  • Được đảm bảo mọi quyền lợi các chế độ (ngày phép năm, gói bảo hiểm) đầy đủ theo luật Việt Nam;
  • Cơ hội công tác tại Singapore tích lũy kinh nghiệm từ bạn bè quốc tế, nâng trình giao tiếp tiếng Anh;
  • Được thử sức mình với các dự án đầy tính thử thách, cải thiện và trau dồi kỹ năng làm việc theo nhóm;
  • Cơ hội phát triển mạnh mẽ với sự hướng dẫn tận tình, giúp đỡ trong suốt quá trình làm việc.

Nắm tay nhau cùng tiến – Nâng khả năng tác chiến

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

Mô tả công việc:

– Phát triển trang CMS website, e-commerce và ứng dụng mobile;
– Phân tích các yêu cầu của khách hàng để phát triển các yêu cầu phần mềm kỹ thuật và tính năng (outsourcing);
– Phối hợp chặt chẽ với Project Manager để đưa ra ý tưởng và giải pháp phát triển các tính năng mới;
– Đảm bảo tiến độ công việc được giao;
– Tham gia vào các dự án sản phẩm của ADVN.

Yêu cầu:

– Bằng cấp / Văn bằng Khoa học Máy tính, Công nghệ thông tin hoặc các ngành liên quan;
– Có ít nhất 2 năm kinh nghiệm vị trí Ruby on Rails Developer;
– Có kiến thức về web Front-end như HTML, CSS, JavaScript & jQuery, API RESTful;
– Có kiến thức về Angular JS, React JS, máy chủ Linux / CentOS là một điểm cộng;
– Kinh nghiệm với hệ thống cơ sở dữ liệu MySQL;
– Khả năng giám sát và cố vấn cho các junior engineers;
– Khả năng đọc và nói tiếng Anh;
– Khả năng tư duy logic;
– Tinh thần làm việc nhóm tốt.

Nhiều tin tuyển dụng IT lương cao trên TopDev, đăng ký ngay!

5 công nghệ huyền thoại sẽ không bao giờ lỗi thời!

5 công nghệ huyền thoại sẽ không bao giờ lỗi thời

Công nghệ đang thay đổi với mức độ chóng mặt mỗi ngày. Những ngôn ngữ mới liên tục được ra đời như Ruby, Hadoop hay những công nghệ mới nhất cloud đang ngày càng phổ biến hơn. Tuy nhiên, những ngôn ngữ và kỹ năng cơ bản vẫn đóng vai trò như những bộ khung sườn vững chắc giúp mọi thứ vận hành suôn sẻ. Sau đây là 5 loại công nghệ vẫn đóng vai trò lớn cho đến tận thời điểm này.

COBOL

123

“Rất nhiều người dùng cuối hiện vẫn đang tương tác với các hệ thống được xây dựng bằng COBOL.” – Ed Airey, Product Marketing Director cho COBOL solution tại MicroFocus cho biết.

Các dịch vụ như Ngân hàng, bảo hiểm, tàu lửa hay hàng không là những dịch vụ mà khách hàng tương tác với COBOL nhiều nhất, vì ngôn ngữ này vượt trội ở khả năng tính toán và quản lý lưu lượng thông tin dữ liệu lớn.

“COBOL vượt trội hơn các ngôn ngữ khác ở khoảng xử lý các khối lượng dữ liệu rất lớn, tính năng này được gọi là batch processing,” Airey cho biết. Các hệ thống ngân hàng, công ty tín dụng, và các công ty IRS đều sử dụng hệ thống được lập trình bởi COBOL để xử lý một lượng lớn các giao dịch trong cùng một thời điểm. COBOL còn được sử dụng ở các hệ thống kiểm tra lý lịch di trú và nhập cảnh. Quá trình này còn giúp khoanh vùng các đối tượng cần được theo dõi.

TOP các vị trí tuyển dụng lập trình Cobol

Mainframes

mainframe

“Hầu hết các hệ thống máy tính quy mô lớn đã được phát triển trong những năm 1960. Với kết cấu đồ sộ, chúng vẫn được phát triển tiếp tục đến tận bây giờ. Sự ổn định của nó cho phép mainframes (hay big iron)  có thể chạy ổn định mà không bị gián đoạn trong suốt nhiều thập kỷ. Những ngành như Ngân Hàng, bán lẻ, dịch vụ tài chính, logistics, và sản xuất phụ thuộc khá nhiều vào công nghệ mainframe.” – Craig O’Malley, CEO của mainframe solutions Compuware cho biết.

“Công nghệ Mainframe chắc chắn vẫn sẽ đóng vai trò chủ chốt cho rất nhiều hệ thống back-end. Đây là giải pháp công nghệ tốt nhất, nhanh nhất và kinh tế nhất so với những gì mà nó làm được. Nó không chỉ được dùng cho batch processing, hay tăng tốc độ xử lý dữ liệu, mà nó chính là một giải pháp tối ưu để xử lý lưu lượng data cực lớn.”

Ngôn ngữ C

124

C được phát triển bởi Dennis Ritchie ở Bell Labs vào khoảng những năm 1969 và 1973. C được ví như một trong những ngôn ngữ lập trình được sử dụng nhiều nhất. Trên thực tế, rất nhiều ngôn ngữ “hậu bối” như C++, Python, Perl, Java và PHP đã mượn rất nhiều tính năng cơ bản từ C.

Ngôn ngữ này được dùng rất rộng rãi ở các hệ thống lập trình kể cả hệ điều hành hoặc các hệ thống nhúng, chưa kể đến các hệ thông siêu máy tính lớn cũng đang dựa vào ngôn ngữ này. Và đương nhiên C còn là nền tảng của khá nhiều hệ điều hành trong đó bao gồm cả Unix.

Video IoT and AI Thinking Linking Things Age of VUI

Fortran

125

Là ngôn ngữ được biết đến với tên gọi Formula Translation, là một ngôn ngữ được dùng cho các hệ thống máy tính lớn (mainframe) của IBM từ những năm 1950s. Nó được ví như “tiếng mẹ đẻ của khoa học máy tính”. FORTRAN được phát triển bởi Big Blue để đẩy nhanh tốc độ xử lý thông tin khoa học kỹ thuật trên các siêu máy tính.

Hiện nay, nó được dùng nhiều ở những lĩnh vực như dự báo thời tiết, động lực học, vật lý máy tính và những lĩnh vực đòi hỏi tốc độ xử lý cao.

Java

126

Về mặt kỹ thuật mà nói, Java không phải là một công nghệ siêu việt, nhưng nó sẽ chính thức ăn mừng sinh nhật thứ 20 của mình vào năm nay. Java được phát triển bởi James Gosling tại Sun Microsystem vào năm 1995. Nó được thiết kế với một mục đính giúp cho các nhà phát triển có thể “viết code ở một nơi, và chạy được ở nhiều nơi” (write once, run anywhere), mà không phải dịch lại thông qua một nền tảng nào khác.

Dù là một ngôn ngữ “trẻ tuổi” nhưng Java vẫn hiện đang nằm thuộc top những ngôn ngữ được cộng đồng sử dụng nhiều nhất, được đánh giá bởi cộng đồng Tiobe Software’s Programming Community Index. Với khoảng 9 triệu nhà phát triển, Java nằm vào top những ngôn ngữ được nhiều người dùng nhất, đa phần được dùng để xây dựng ứng dụng client-server Web.

TOp các việc làm cho lập trình Java

TopDev

Tôi không phải là lập trình viên thực sự?

Tôi không phải là lập trình viên thực sự

Hiện tại mình là một system engineer, nhưng mà ban đầu mình không apply vào vị trí này: Bốn năm trước mình bắt đầu bước vào công ty với vị trí là lập trình viên support chính thức đầu tiên.

Dù đã làm ở vị trí khác nhưng mình vẫn thích gần gũi với team support. Có cậu em làm support engineer trong team hiện tại thường thích gửi cho mình những code snippet mà cậu ấy viết để trao đổi về nó hoặc khoe về mấy điều hay ho cậu ấy học được. Và một ngày nọ cậu ấy gửi cho mình cái này:

“Một lập trình viên thực sự là [….]?, bữa giờ làm việc em thấy mình không phải là lập trình viên đúng nghĩa cho lắm”

Image result for exhausted meme gif

 

Công việc của mình thật ra khá bận rộn và mình cũng không phải là người trả lời tin nhắn ngay lập tức. Thế nên mình đã quay lại sau bữa trưa và trả lời như sau:

“Đừng bao giờ nói rằng mình không phải là lập trình viên

vì mày là lập trình viên mà”

cậu ấy đáp lại rằng “anh biết ý em là gì mà. em chỉ toàn “ráp” mọi thứ lại với nhau”

Đương nhiên là mình biết ý cậu ấy là gì. Mình luôn muốn trở thành một lập trình viên – Ngay từ khi còn nhỏ mình đã thích vọc mấy cái máy tính cũ của ông già, script trên những máy tính vẽ đồ thị trên trường, đòi cuốn dạy code C++ mua ở nhà sách cũ. Mình cũng khá thân với các giáo viên dạy trên trường, thậm chí tôi còn xin một một job code web dạo bán thời gian. Sau khi tốt nghiệp, mình tiếp tục học tiếp lên đại học. Nghe có vẻ tương lai rộng mở đúng không?

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

  Tự học một cách chủ động từ dự án và đồng nghiệp
  6 điều tôi vỡ lẻ khi tự học code (P1)

Tuy nhiên, mình cũng gãy gánh bỏ học đại học giữa chừng và mất hơn 10 năm liên tục cố gắng rồi thất bại rồi lại tiếp tục cố gắng để trở thành một lập trình viên / developer chuyên nghiệp. Khi cơ hội việc làm ở công ty A tới (Giấu tên để sếp khỏi biết), mình đã chuyển từ support sang software QA, và nghĩ rằng mình đang ngày càng tới gần “công việc mơ ước” của mình. Khi làm việc tại A (sau đó là Risk I/O) – một startup với những con người thú vị, thông minh và tuyệt vời, mình thật sự quá ngán và không muốn quay lại vị trí support nữa. Mình vẫn muốn trở thành một lập trình viên thật sự, và mình đã dành nhiều năm làm việc bên cạnh các lập trình viên thực sự mà không thể làm chính xác như những gì họ làm.

Công ty A là một công ty rất khác biệt. Mình được truy cập vào GitHub. Mình có cả dev instance của riêng mình. Mình được dạy cách create và merge các PR và xem code của mình được triển khai để sản xuất. Đúng là Mình đang ở vị trí support, và mình vẫn phải thực hiện các cuộc gọi để hỗ trợ kỹ thuật, nhưng cảm ơn trời, cuối cùng mình cũng được học và viết Ruby. Thậm chí sau này có một engineer mới vô nói với mình rằng “A nh không biết chú là support đó, Anh nghĩ chú cũng rất có khiếu code giống mấy anh em ở đây đó nha”.

Sau đó mình có ít thời gian để vọc code hơn và ngập đầu trong công việc support bởi vì client của chúng mình phát triển quy mô và độ phức tạp. Rồi thì công ty cũng bắt đầu phát triển đội ngũ support và thuê thêm một số support engineer, những người sẽ thực hiện công việc đó tốt hơn mình. Đây cũng là một cơ hội để mình chuyển sang những platform/system/operation side của công ty.

Rồi mình đổi sang công ty B (lại giấu tên), mình được làm công việc backend, infrastructure. Mình làm việc khá hợp với Red Hat, Ubuntu và những thứ khác trong nhiều năm, nhưng mình vẫn chưa làm tốt trong việc quản trị hệ thống Linux. Sếp của mình cũng khá nice VÀ đã cho mình thêm cơ hội, và hy vọng Mình sẽ phát triển đến trình độ system engineer mà họ cần.

Đó là một vài năm trước, còn bây giờ mình cảm thấy mình đã làm tốt công việc của một system engineer – nhưng mình có phải là một lập trình viên thực sự không?

Khi cậu em support engineer kia nói: “Em không phải là một lập trình viên thực sự,  em chỉ gắn mọi thứ lại với nhau”. Mình đã trả lời lại rằng:

“Đó chính xác là việc của anh em mình”

“Chú quá biết rồi còn gì”

Đó không phải chính xác những gì một lập trình viên làm ư? Năm ngoái có một bài viết tuyệt vời nói rằng “Phần lớn Software Engineering trong năm 2018 là như một hệ thống cấp nước” và nó đúng ở quy mô lớn như khi đơn giản là lấy các string từ các log file.

Mình biết rất nhiều người trong ngành công nghệ bị Hội chứng tạm gọi là Kẻ mạo danh (Imposter Syndrome), và thật sẽ rất khó cho những support engineer – những người không có chữ “developer” hay “programmer” trong tên nghề nghiệp. Mình dành hầu như cả sự nghiệp của mình với những con chip, nhưng nhờ những con người tuyệt vời xung quanh mà mình đã may mắn rũ bỏ được tâm lý đó.

Các bạn nếu có cảm thấy giống mình, thì hãy tự tin lên nha, vì lập trình viên cũng có nhiều hình thái. Mình tin tất cả chúng ta đều là lập trình viên thực thụ.

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

Thuật toán là gì? 11 thuật toán hàng đầu dành cho lập trình viên

10-thuat-toan-hang-dau-danh-cho-lap-trinh-vien

Xã hội hiện tại đang chứng kiến một cuộc cách mạng to lớn trong lĩnh vực công nghệ. Những phát minh mới liên tục được cập nhật. Thường thì nguồn gốc của những phát minh này là từ những chương trình gạo cội có khả năng chi phối và thao túng các xu hướng công nghệ đang diễn ra. Trong số đó không thể không nói đến mã hóa và thuật toán, được sử dụng để phát triển các chương trình cạnh tranh như vậy.

Vì thế, đối với một chương trình thành công và có tầm ảnh hưởng, việc khai thác một thuật toán tốt nhất đúng và chính xác là điều tất yếu. Sau đây cùng tìm hiểu thuật toán là gì và 11 thuật toán hàng đầu được sử dụng rộng rãi trong lập trình và phát triển web.

Thuật toán là gì?

Thuật toán là gì? Thuật toán (Algorithm) hay còn được gọi là giải thuật là một tập hợp các bước được xác định rõ ràng, có thể thực hiện được bằng máy tính để giải quyết một vấn đề hoặc thực hiện một phép tính.

thuật toán luôn tường minh và thực hiện các hành động cụ thể từng bước một để mang lại kết quả tối ưu nhất.

Dễ hiểu hơn, thuật toán là cách giải một bài toán bằng chương trình máy tính.

Thuật toán được sử dụng rộng rãi trong nhiều lĩnh vực của công nghệ thông tin (IT). Trong toán học, lập trình máy tính và khoa học máy tính, thuật toán thường đề cập đến một quy trình nhỏ giải quyết một vấn đề lặp đi lặp lại. Thuật toán cũng được sử dụng như các đặc tả kỹ thuật để thực hiện xử lý dữ liệu và đóng vai trò quan trọng trong các hệ thống tự động.

Ví dụ, khi muốn sắp xếp một tập hợp các số nguyên theo thứ tự tăng dần. Có rất nhiều cách để giải bài toán này, nhưng nếu số lượng phần tử quá lớn thì sẽ mất nhiều thời gian để thực hiện và có thể xảy ra sai sót. Lúc này thuật toán chính là chìa khóa “giải thuật” tối ưu nhất, giúp trả về kết quả chính xác mà không tốn nhiều công sức. Muốn biết thuật toán để giải bài toán sắp xếp trên là gì, cùng theo dõi tiếp trong những phần tiếp theo của bài viết bạn nhé!

Sau đây là các thuật toán cơ bản lập trình viên cần biết làm nền tảng cho các giải thuật phức tạp hơn. Cùng TopDev tìm hiểu ngay dưới đây!

Thuật toán Hashing

Hashing algorithms

Hashing là thuật toán được sử dụng để tham gia vào việc phát hiện và xác định dữ liệu thích hợp bằng key và ID. Với vai trò mở rộng việc phát hiện lỗi, quản lý bộ nhớ cache, mật mã và tra cứu, hàm Hashing tích hợp các khóa phù hợp và cho các giá trị chính xác. Hàm này cũng có thể được sử dụng như một định danh duy nhất cho các tập dữ liệu nhất định và các phép tính toán cho phép người dùng tạo ra các giá trị dữ liệu không trùng lắp. Thông thường nó được áp dụng trong các bộ định tuyến để lưu trữ địa chỉ IP.

Search Algorithms

Search Algorithms

Thuật toán tìm kiếm thường được áp dụng cho dãy cấu trúc dữ liệu tuyến tính hoặc cấu trúc dữ liệu đồ họa. Thuật toán tìm kiếm tuyến tính còn được gọi là tìm kiếm nhị phân, giúp nhà phát triển tiến hành tìm kiếm hiệu quả trên các tập dữ liệu được sắp xếp với hàm phức tạp thời gian của O (log N). Cơ chế của tìm kiếm nhị phân là chia danh sách thành hai nửa cho đến khi nó tìm thấy mục được yêu cầu và thường được sử dụng để gỡ những lỗi liên quan đến git bisection.

Các thuật toán này còn được biết đến với chức năng là Chiều sâu/Chiều rộng Tìm kiếm Đầu tiên, nó cho ta cấu trúc dữ liệu là một biểu đồ tròn hoặc hình cây đã bật chức năng tìm kiếm, xác định các tập dữ liệu cần thiết trong mô hình cây ngang. BFS rất phổ biến trong các công cụ tìm kiếm, cũng được sử dụng để xây dựng các bot trong AI hay định vị các con đường ngắn nhất giữa hai thành phố.

>> Đọc thêm: Thuật toán tìm kiếm trong C++

Thuật toán sắp xếp (Sort Algorithms)

Thuật toán sắp xếp (Sort Algorithms)

Các thuật toán sắp xếp thường được các nhà phát triển dùng để đặt dữ liệu theo cách có tổ chức. Trong thuật toán QuickSort, các thành phần dữ liệu được so sánh với nhau để xác định thứ tự tương ứng của chúng. Nó có độ phức tạp thời gian của O(nLogn) để thực hiện so sánh. Tuy nhiên, Radix Sort là một kỹ thuật nhanh hơn QuickSort vì nó sắp xếp các phần tử trong một mô hình tuyến tính với độ phức tạp thời gian O(n). Tính đơn giản của thuật toán này làm cho nó được ưa chuộng. Các thuật toán sắp xếp khác bao gồm Sắp xếp hợp nhất, Sắp xếp nhóm và Sắp xếp đếm.

Thuật toán lập trình động (Dynamic Programming Algorithms)

Thuật toán lập trình động

Lập trình động thường là một hàm giải quyết vấn đề phức tạp liên quan đến trí tuệ bằng cách tách các vấn đề thành các bài toán con nhỏ hơn, giải quyết chúng sau đó xây dựng trở lại thành vấn đề phức tạp với bộ nhớ của các kết quả nhỏ hơn để đưa ra câu trả lời cho vấn đề phức tạp ban đầu. Lập trình động có khả năng tích hợp để ghi nhớ, cho phép lưu trữ các ký ức về các vấn đề đã giải quyết trước đó. Nếu lần tiếp theo vấn đề ấy lại xuất hiện thì nó sẽ được giải quyết nhanh hơn nhiều.

Phân tích liên kết (Link Analysis)

Thường được sử dụng trong lĩnh vực mạng, phân tích liên kết cung cấp khả năng tương quan giữa các thực thể khác nhau trong một miền quan trọng đối với các công cụ tìm kiếm. Thuật toán sử dụng một biểu diễn đồ họa và ma trận phức tạp, liên kết các căn cứ tương tự trong các miền hiện tại. Phân tích liên kết phổ biến trong các công cụ tìm kiếm như Google, trong các trang truyền thông xã hội như Facebook, Twitter, nơi việc tìm kiếm mở rộng được chú trọng.

Phép toán Mô-đun (Modulo Arithmetic Algorithms)

Nhiều thuật toán mã hóa phức tạp nhưng nếu được phân tích trên nền số học mô-đun thì trở nên đơn giản vô cùng. Trong số học mô-đun, các số chúng ta đang xử lý chỉ là các số nguyên và các phép toán được sử dụng là cộng, trừ, nhân và chia. Sự khác biệt duy nhất giữa số học mô-đun và số học trên sách vở là trong số học mô-đun, tất cả các hoạt động được thực hiện liên quan đến số nguyên dương, tức là mô đun.

Ví dụ:

  1. Thuật toán Euclide cơ bản và mở rộng
  2. Phương trình hoàn hảo của Euler
  3. Lũy thừa mô đun
  4. Tính nghịch đảo theo mô đun
  5. Định lý số dư của Trung Quốc
  6. Định lý số dư của Trung Quốc và thực thi tính nghịch đảo của mô đun

Thuật toán xâu ký tự và phân tích cú pháp (String Matching and Parsing Algorithms)

Quy trình tạo xâu tương ứng luôn quan trọng đặc biệt đối với miền và phần tử mạng. Thuật toán xâu ký tự này sẽ phát huy khả năng tối đa trong các tình huống mà các xâu phải khớp trong một chuỗi dài hoặc khi xác nhận chuỗi bằng cách phân tích cú pháp qua giới hạn được xác định trước. Các thuật toán này thường được sử dụng trong phát triển web cho URL.

Thuật toán biến đổi Fourier (Fourier Transform Algorithms)

Biến đổi Fourier hay Biến đổi Fourire nhanh là những thuật toán đơn giản nhưng rất mạnh. Chúng được sử dụng để chuyển đổi tín hiệu từ miền thời gian sang miền tần số và ngược lại. Toàn bộ các mạng kỹ thuật số như Internet, WiFi, điện thoại, máy tính, bộ định tuyến, vệ tinh, sử dụng thuật toán này theo để vận hành. Đây là những thuật toán bắt buộc phải biết nếu bạn chuyên sâu về mảng điện tử, điện toán hoặc viễn thông.

Thuật toán các tập không giao nhau (Disjoint Sets)

Thuật toán các tập không giao nhau là cấu trúc dữ liệu đóng vai trò như các cấu trúc trợ giúp trong một thuật toán để biểu diễn nhiều tập hợp trong mảng riêng lẻ, với mỗi mục là một phần tử của một trong nhiều tập hợp. Do đó, các bộ tách rời đại diện cho các phần tử được kết nối trong các thuật toán đồ thị hay phân đoạn một hình ảnh.

Hệ số tích phân (Integer Factorization)

Thuật toán lũy thừa số nguyên là một thuật toán toán cung cấp hướng dẫn từng bước về cách lấy các thừa số nguyên tố của một số tổng hợp. Thuật toán này giải quyết các vấn đề phức tạp trong các nền tảng mã hóa yêu cầu bạn phải giải quyết các số nguyên phức hợp lớn.

Thuật toán Dijkstra

Thuật toán Dijkstra là một thuật toán được sử dụng để tìm đường đi ngắn nhất từ một điểm (được gọi là nguồn) đến tất cả các điểm khác trong một đồ thị có trọng số, nghĩa là đồ thị mà mỗi cạnh của nó có một giá trị nhất định (trọng số). Thuật toán này được nhà khoa học máy tính người Hà Lan Edsger Dijkstra phát minh vào năm 1956 và được sử dụng rộng rãi trong nhiều ứng dụng, từ tìm đường trên bản đồ đến tối ưu hóa mạng lưới.

Thuật toán Dijkstra hoạt động dựa trên nguyên tắc tham lam (greedy), nghĩa là nó luôn chọn đường đi tốt nhất ở mỗi bước dựa trên thông tin hiện có mà không cần quan tâm đến các bước tiếp theo.

Trên đây là bài viết chia sẻ về thuật toán và 11 thuật toán cơ bản quan trọng nhất mà lập trình viên nào cũng nên biết. Việc nắm khái niệm và cách sử dụng thuật toán sẽ giúp bạn dễ dàng hơn trong việc lập trình của mình.

Theo dõi TopDev để cập nhật các vị trí tuyển dụng việc làm ngành IT mới nhất!

Nguồn tại Technotification

9 hiểu lầm “ngớ ngẩn” về machine learning

Những hiểu lầm và quan niệm lệch lạc về machine learning xuất hiện ngày càng nhiều do nó ngày càng bị cường điệu hoá. Bài viết này sẽ cho bạn một cái nhìn tổng quát về những gì machine learning có thể và không thể làm.

Machine learning được tin rằng hữu ích đến nỗi nó có thể giải quyết mọi vấn đề và áp dụng trong mọi tình huống. Giống như các công cụ khác, machine learning rất hữu ích trong một số lĩnh vực cụ thể, đặc biệt đối với các vấn đề mà bạn thường xuyên gặp phải nhưng bạn biết rõ rằng bạn sẽ không bao giờ có thể thuê đủ người để giải quyết, hoặc đối với các vấn đề có mục tiêu nhưng không có phương pháp rõ ràng để đạt được nó.

Tuy nhiên, mỗi tổ chức thường áp dụng machine learning theo những cách khác nhau, như 42% những nhà điều hành cấp cao gần đây nói với Accenture rằng họ mong đợi AI sẽ đứng sau tất cả những đổi mới vào năm 2021. Nhưng bạn sẽ khai thác nó tốt hơn nếu bạn không bị ảnh hưởng bởi những luồng ý kiến cường điệu hoá và không quá tin vào những định kiến bằng cách hiểu những gì machine learning có thể và không thể thực hiện.

Tuyển dụng Machine Learning lương cao hấp dẫn cho bạn

1. Machine learning cơ bản là AI

Machine learning và AI thường được cho là hai từ đồng nghĩa, nhưng trong khi machine learning là kỹ thuật được sử dụng rất nhiều trong các phòng thí nghiệm, AI là một mảng lớn bao gồm các lĩnh vực như tầm nhìn máy tính, robot và xử lý ngôn ngữ tự nhiên, cũng như những cách tiếp cận khác như giảm sự hài lòng mà không bao gồm machine learning. Hãy suy nghĩ nó như những thứ làm cho máy móc trở nên thông minh hơn. Không phải lúc nào máy móc cũng sử dụng trí tuệ nhân tạo, thứ mà mọi người nghĩ có thể sẽ chiến đấu hoặc thậm chí tấn công loài người.

Hãy chú ý đến các thuật ngữ và sử dụng chúng thật chính xác. Machine learning là về học các mô hình và dự đoán các kết quả từ các tập dữ liệu lớn; các kết quả trông có vẻ ” thông minh” nhưng thật sự nó đang sử dụng các số liệu thống kê với tốc độ và quy mô chưa từng có.

2. Tất cả các dữ liệu đều hữu ích

Bạn cần data cho machine learning, nhưng không phải tất cả dữ liệu đều hữu ích cho machine learning. Để đào tạo hệ thống của bạn, bạn cần những dữ liệu đại diện bao gồm các patterns và kết quả mà hệ thống machine learning của bạn cần phải xử lý. Bạn cần dữ liệu không có các patterns liên quan (chẳng hạn như các ảnh cho thấy tất cả những người đàn ông đứng lên và tất cả phụ nữ ngồi xuống, hoặc tất cả những chiếc xe đang ở trong ga-ra và tất cả những chiếc xe đạp đang ở trong một bãi lầy) bởi vì mô hình machine learning sẽ phản ánh những patterns cụ thể và tìm chúng trong dữ liệu bạn có. Tất cả những dữ liệu bạn sử dụng cho việc đào tạo nó cần phải được phân loại tốt, và dán nhãn các tính năng bạn hỏi machine learning, điều đó tốn rất nhiều công sức.

Đừng nghĩ rằng dữ liệu bạn có luôn tốt, có thể đại diện cho phần đông hoặc có thể dễ dàng gắn nhãn.

3. Bạn luôn cần nhiều data

Những cải tiến lớn đã được thực hiện gần đây về khả năng nhận diện hình ảnh, đọc hiểu của máy, dịch thuật và các lĩnh vực khác đã ra mắt nhờ có sự xuất hiện của các công cụ tốt hơn, computing hardware như GPUs có thể xử lý một số lượng lớn dữ liệu và những tập dữ liệu lớn đã được gắn nhãn, bao gồm ImageNet và tập dữ liệu Stanford Question Answering. Nhưng nhờ vào một mẹo gọi là transfer learning, bạn không phải lúc nào cũng cần một tập dữ liệu lớn để đạt được kết quả tốt trong một lĩnh vực cụ thể; thay vào đó, bạn có thể dạy hệ thống machine learning học cách sử dụng tập dữ liệu để nó dần có thể tự học với những tập dữ liệu nhỏ hơn. Đó là cách custom vision APIs từ Salesforce và Microsoft Azure hoạt động: Bạn chỉ cần 30-50 hình ảnh để chứng minh rằng bạn có thể phân loại nhằm có kết quả tốt hơn.

Transfer learning cho phép bạn tùy chỉnh một hệ thống đã được đào tạo từ trước để giải quyết các vấn đề với lượng dữ liệu tương đối nhỏ.

4. Bất kì ai cũng có thể xây dựng một hệ thống machine learning

Có rất nhiều công cụ mã nguồn mở và framework dành riêng cho machine learning và có vô số các khóa học chỉ bạn cách sử dụng nó. Nhưng machine learning vẫn là một kĩ thuật chuyên ngành; bạn cần biết cách chuẩn bị dữ liệu và phân vùng cho việc đào tạo và testing, bạn cần biết cách chọn thuật toán tốt nhất và biết heuristics để sử dụng với nó, cách biến nó thành một hệ thống đáng tin cậy để sản xuất. Bạn cũng cần phải theo dõi hệ thống để đảm bảo rằng các kết quả được đồng bộ theo thời gian; cho dù thị trường có thay đổi hay hệ thống machine learning của bạn đủ tốt để phân loại các nhóm khách hàng khác nhau hay không, bạn cần tiếp tục kiểm tra để xem mô hình ấy vẫn còn phù hợp với vấn đề của bạn hay không.

Việc tìm hiểu machine learning tốn rất nhiều thời gian; nếu bạn mới bắt đầu, hãy nghĩ đến APIs và các mô hình đã được đào tạo từ trước mà code của bạn có thể có trong khi bạn có hoặc thuê data science và chuyên gia machine learning để xây dựng các hệ thống tùy chỉnh.

5. Tất cả các patterns trong data đều hữu ích

Người mắc bệnh suyễn, người bị đau ngực hoặc bệnh tim và bất kỳ ai trên 100 tuổi đều có tỉ lệ sống sót cao hơn những người bệnh bị viêm phổi. Trên thực tế, một hệ thống machine learning đơn giản được thiết kế để tự động nhập hồ sơ bệnh án có thể gửi chúng về tận nhà của bạn ( một hệ thống được huấn luyện trên cùng một dữ liệu với mạng lưới nơ-ron sẽ thực hiện những việc y chang nhau ). Lí do họ có tỉ lệ sống sót cao như thế là do họ luôn được ưu tiên nhập viện vì bệnh viêm phổi rất nguy hiểm.

Hệ thống đang tìm kiếm một pattern hợp lý trong dữ liệu; nó không phải là một pattern hữu ích để lựa chọn bệnh nhân vào viện  ( mặc dù nó giúp công ty bảo hiểm dự đoán chi phí điều trị khá hiệu quả ). Thậm chí nguy hiểm hơn, bạn sẽ không biết rằng những patterns không hiệu quả ấy có trong tập dữ liệu của bạn trừ khi bạn đã biết về chúng.

Trong các trường hợp khác, một hệ thống có thể học một pattern hợp lý ( như hệ thống nhận dạng khuôn mặt đang gây tranh cãi vì dự đoán chính xác xu hướng tình dục từ selfies) , nhưng nó không thực sự hiệu quả vì không có lời giải thích rõ ràng ( trong trường hợp các bức ảnh hiển thị các tín hiệu xã hội như pose chứ không phải hình tự nhiên).

Các mô hình ” Black box ” rất hiệu quả nhưng chúng không làm rõ được chúng đã học được pattern nào. Các thuật toán thông minh như Generalized Additive Models có thể làm rõ được model đã học đươc gì để bạn quyết định xem nó có hữu ích để triển khai hay không.

6. Reinforcement learning luôn sẵn sàng để sử dụng

Hầu như tất cả các hệ thống machine learning đang được sử dụng ngày nay đều sử dụng supervised learning; Trong nhiều trường hợp, chúng được đào tạo dựa trên các tập dữ liệu được gắn nhãn rõ ràng mà nhiều người đã cùng chuẩn bị. Quản lí các tập dữ liệu ấy mất rất nhiều thời gian và công sức, vì vậy các loại unsupervised learning được yêu thích hơn, đặc biệt là reinforcement learning (RL) – cách một agent học thông qua việc thử và sai, bằng cách tương tác với môi trường xung quanh và nhận thưởng khi có hành vi đúng. Hệ thống AlphaGo của DeepMind đã sử dụng RL bên cạnh supervised learning để đánh bại những người chơi Go hàng đầu, và Libratus, một hệ thống được xây dựng dựa trên một team ở Carnegie Mellon, đã sử dụng RL cùng hai kĩ thuật AI khác để đánh bại những người chơi poker hàng đầu trên thế giới tại Texas Hold’Em ( với chiến lược cá cược dài và phức tạp ). Các nhà nghiên cứu đang thử nghiệm RL với mọi thứ từ robot đến testing security software.

Tuy nhiên, RL chỉ phổ biến trong các trường hợp nghiên cứu. Google sử dụng DeepMind để tiết kiệm năng lượng trong các trung tâm dữ liệu của họ bằng việc làm mát chúng hiệu quả hơn; Microsoft sử dụng một phiên bản hạn chế của RL gọi là “ contextual bandits “ để cá nhân hoá các tiêu đề đối với các người dùng mới truy cập vào MSN.com. Vấn đề là chỉ có ít môi trường thực tế có phần thưởng và phản hồi tức thì, và đặc biệt là lừa gạt phần thưởng khi agent thực hiện nhiều hành động trước khi xảy ra bất cứ điều gì.

7. Machine learning không thiên vị

Vì machine learning học từ dữ liệu, nó sẽ sao chép bất kỳ sai lệch ​​nào trong tập dữ liệu. Tìm kiếm hình ảnh của CEO thường sẽ ra hình ảnh của nam CEO da trắng vì có nhiều CEO là người da trắng và là nam hơn những người còn lại. Nhưng machine learning làm các thiên hướng đã sai trở nên … càng sai hơn.

Tập dữ liệu COCO thường được sử dụng để huấn luyện hệ thống nhận dạng hình ảnh của cả nam và nữ; nhưng nhiều hình ảnh của phụ nữ sẽ được hiển thị bên cạnh thiết bị nhà bếp hơn và nhiều hình ảnh của đàn ông sẽ được hiển thị bên cạnh bàn phím máy tính và chuột hoặc vợt tennis và ván trượt tuyết. Đào tạo hệ thống trên COCO và gán đàn ông với phần cứng máy tính mạnh hơn các số liệu thống kê trong bức ảnh gốc.

Một hệ thống machine learning cũng có thể tạo thêm thiên hướng sai lệch cho thông tin. Đào tạo một hệ thống machine learning với các frameworks phổ biến để làm đại diện cho các từ như vectơ thể hiện mối quan hệ giữa frameworks và hệ thống sẽ học hỏi những định kiến như ” đàn ông gắn với lập trình máy tính, phụ nữ gắn với nội trợ”, bác sĩ và y tá hoặc ông chủ để tiếp tân. Nếu bạn sử dụng hệ thống đó với một hệ thống dịch giữa các ngôn ngữ có các đại từ như “ he, she “, như trong tiếng Anh, với những đại từ chỉ giới tính trung lập, như trong tiếng Phần Lan hoặc tiếng Thổ Nhĩ Kỳ, ” Họ là bác sĩ ” trở thành ” Anh ấy là bác sĩ ” và ” Họ là y tá ” trở thành ” Cô ấy là y tá “.

Machine learning có thể đưa ra những gợi ý tương tự trên các trang mua sắm khá tốt, nhưng một số vấn đề về thông tin nhạy cảm và feeback liên hồi có thể xảy ra; nếu bạn tham gia vào một nhóm Facebook không tán thành với việc tiêm ngừa, công cụ gợi ý của Facebook sẽ đưa ra gợi ý những nhóm khác liên quan đến lý thuyết conspiracy hoặc những nhóm tin rằng hình dạng của Trái đất là một mặt phẳng.

Bạn cần hiểu rõ những sai sót của machine learning. Nếu bạn không thể loại bỏ được chúng trong tập dữ liệu, hãy sử dụng các kĩ thuật như bình thường hoá các liên kết giới tính với các cặp từ để giảm sai sót hoặc bổ sung các mục không liên quan đến gợi ý để tránh “ filter bubble “.

8. Machine learning chỉ sử dụng cho những mục đích tốt

Machine learning cũng được dùng trong các tools chống virus, theo dõi nhất cử nhất động của những vụ tấn công mới để có thể phát hiện ra chúng nhanh nhất có thể khi vừa bùng phát. Tuy nhiên, các hacker đang sử dụng machine learning để nghiên cứu các công cụ phòng chống virus và phòng chống các cuộc tấn công lừa đảo với quy mô lớn bằng cách phân tích một lượng lớn public data hoặc phân tích các vụ lừa đảo thành công trước đó.

Tham khảo Tuyển dụng Machine Learning lương cao hấp dẫn cho bạn

9. Machine learning sẽ dần thay thế con người

Khá nhiều người lo sợ rằng AI sẽ chiếm dần nhiều công việc và chắc chắn nó sẽ thay thế dẫn những công việc do con người làm và cả cách thực hiện; hệ thống machine learning giúp cải thiện hiệu quả, quá trình diễn ra mượt mà và giảm chi phí. Về lâu về dài, nó sẽ tạo ra những ra những công việc mới cũng như làm một số công việc hiện tại trở nên lỗi thời.

Tuy nhiên, không phải công việc nào machine learning cũng có thể thực hiện được, vì độ phức tạp hoặc quy mô của công việc; Ví dụ, bạn không thể thuê đủ người để kiểm tra mọi bức hình được đăng trên social media để xem chúng có liên quan đến thương hiệu của bạn hay không.

Việc machine learning đã bắt đầu tham gia vào là tạo ra những cơ hội kinh doanh mới, chẳng hạn như cải thiện trải nghiệm của khách hàng bằng predictive maintenance, và đưa ra những đề xuất và hỗ trợ cho các nhà lãnh đạo của doanh nghiệp. Giống như các thế hệ tự động hóa trước đó, machine learning có thể giúp nhân viên phát huy tối đa chuyên môn và sự sáng tạo của họ.

TopDev Via CIO

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)
  Top 10 thuật toán machine learning dành cho newbie