Home Blog Page 190

Top các Plugin jQuery tạo Lightbox free đẹp nhất cho website

Để showcase được sản phẩm/ dịch vụ của công ty thì bạn cần những hình ảnh/ video bắt mắt nhất mới nổi bật được. Ví dụ, dịch vụ của bạn là Khách sạn, thì cách tốt nhất để hút khách là bạn phải show ra nhiều hình ảnh đa dạng nhiều phòng, hồ bơi và các dịch vụ khác mà bạn cung cấp. Chứ một biển chữ thông tin sẽ không mảy may giúp ích được gì đâu!

Vì thế việc up thật nhiều ảnh là một chiến thuật tốt để “khoe khoang” về sản phẩm, tuy nhiên sẽ dễ sa vào tình trạng bị “nhiễu” – overload. Ảnh lẻ và một số element có thể sẽ không được tốt như kỳ vọng vì nó cũng cạnh tranh với hàng loạt các nhóm ảnh và các element khác trên trang web nữa.

Lúc này mới thấy Lightbox đóng vai trò khá quan trọng. Nó giúp tập trung sự chú ý của web visitor vào một ảnh/ một phần nhất định trong một gallery và portfolio trồi lên giữa page và làm mờ đi phần còn lại cho đến user thực hiện thao tác.

Vấn đề còn lại lúc này vẫn còn cả ngàn lightbox plugin ngoài kia, và khá khó để chọn ra cái nào hợp nhất cho page của bạn.

Bài viết này sẽ tổng hợp hết cho bạn Top 5 plugin lightbox cho năm 2022. Bài post sẽ cover tất cả các feature để bạn dễ chọn lựa cái thích hợp nhất cho page của mình.

1. LC Lightbox

Plugin đầu tiên chắc chắn là LC Lightbox. Nó có đầy đủ các feature bạn cần cho một lightbox plugin và nhiều tính năng khác nữa.

LC Lightbox

Một số feature nổi bật nhất gồm có:

  • Bạn có thể tạo slideshow cho bộ ảnh. Slideshow này có thể hiện tự động hoặc tuỳ chỉnh thủ công.
  • Bạn có thể đặt tiêu đề, description và tác giả riêng cho từng hình hoặc từng element.
  • Nó cũng đi với hệ thống định vị thumbnail và khả năng chia sẻ social.

Hầu như mọi lightbox plugin đều support các feature trên. Nhưng cái làm cho LC Lightbox đặc biệt là các feature phụ của nó, ví dụ như:

  • Khả năng kết hợp các loại content như ảnh và video từ YouTube, Vimeo, Dailymotion và iframe or other HTML elements,..
  • Nó cung cấp nút download trực tiếp mà không dựa trên các script server-side. Nó rất hữu ích nếu bạn muốn visitor download bất kí ảnh nào họ muốn
  • Nó support cả chuột – cũng như định vị bằng bằng keyboard.
  • Plugin đã được phát triển bằng các thiết bị cảm ứng. User sẽ có thể thao tác kéo thả (swipe và pinch) để dùng lightbox plugin trên smartphone.

Nếu như nhiêu đó vẫn chưa đủ ấn tượng thì các feature dưới đây đảm bảo sẽ “endgame” ngay:

  • Bạn có thể tạo cho từng item trong lightbox một link direct riêng
  • Visitor có thể zoom ảnh bất kì bằng cách double-click hoặc thao tác đơn giản là túm.
  • Bạn thậm chí còn có thể tích hợp comment vào tất cả các element chỉ bằng Facebook và Disqus!

List này thật sự còn rất dài, tôi tóm lại những điểm nổi bật chỉ để bạn hiểu nó khủng cỡ nào. Bạn có thể xem chi tiết hơn tất tần tật feature của nó tại Preview Page của LC Lightbox.

2. Responsive Bootstrap Portfolio và Lightbox

Nếu bạn đang chạy một website trên Bootstrap framework, plugin này sẽ là sự lựa chọn tốt nhất để tích hợp lightbox.

Bootstrap Portfolio and LightboxNó tận dụng tính năng sẵn có trong Bootstrap để plugin nhẹ hơn và nhiều tính năng hơn một thể. Nó sẽ tương thích với cả Bootstrap 3 và Bootstrap 4.

Dưới đây là một số feature khiến nó trở thành sự lựa chọn hàng đầu cho Bootstrap:

  • Plugin cho phép bạn dàn trải các element như ảnh và videos trong 1 hệ thống lưới từ 2, 3, 4, 5 đến 6 cột.
  • Nó tận dụng cả built-in carousel để ứng dụng vào chính nó. Bạn có thể xem nó live trên preview page này.
  • Độ responsive của Bootstrap cũng bao gồm trong plugin này. Nên lightbox trông sẽ đẹp hơn trên mobile và tablet cũng như desktop.

Một số feature khác bổ sung độ kul cho plugin này còn có:

  • 6 carousel khác nhau cho các content từ ảnh và video đến các post về eCommerce và blog post
  • Các layout mẫu độc đáo sẵn sàng giúp bạn chạy nhanh nhất có thể
  • Hệ màu có thể kết hợp để đảm bảo màu của lightbox hài hoà với những phần còn lại trên website
  • Các video nhúng từ YouTube hoặc Vimeo, hoặc self-host

Hiện tại tất cả các review của Responsive Bootstrap Portfolio và Lightbox đều là 5 sao. Đừng quên check các bản demos và tự trải nghiệm để hiểu thêm tại sao nó lại được yêu thích như vậy.

3. JQuery Thumbnail Gallery với LightBox

Plugin này mang đến cho bạn lightbox gồm bộ ảnh thumbnail rất nổi bật. Bạn sẽ dễ dàng add thêm ảnh và video ở nhiều định dạng/ tỉ lệ trong gallery, và plugin sẽ xử lý nó rất nhẹ nhàng trơn tru.

Một số feature điểm hình mà bạn sẽ thích:

  • Plugin cực kì dễ set up. Bạn sẽ sở hữu một bộ lightbox gallery full tính năng trong nháy mắt.
  • Bạn có thể chọn giữa layout theo grid hoặc theo line cho ảnh và video.
  • Việc kéo thả giữa nhiều gallery item khác nhau có thể bằng kéo thả đơn giản hoặc bằng các nút kéo.
  • Bạn còn có thể đồng bộ các thumbnail hiển thị trong lightbox theo hàng dọc hoặc hàng ngang.

Ngoài ra cũng có một số feature có thể cải thiện tối đa tính năng của plugin này:

  • Bộ định vị theo Keyboard giúp bạn dễ định vị các element khi nút navigation bị di chuyển “tứ phía” khi thay đổi kích thước hoặc tỉ lệ của ảnh và video.  
  • Bạn còn access được vào các public method khác nhau và callback để gút lại phần slideshow ở trong, các thao tác trên event như di chuột lên và khỏi, v.v….

Khi thử các demo khác, bạn sẽ để ý rằng plugin này offer các style tối giản cho gallery hoặc lightbox. Nếu bạn vẫn muốn kiểm soát phần style và đảm bảo rằng có gì bị mus thì hoàn hảo qua rồi.

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

  Những Plugin không thể thiếu cho VSCode
  Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 1)

4. Boxaroo Adaptive Lightbox

Plugin Boxaroo Adaptive Lightbox cũng offer rất nhiều feature thú vị. Nếu bạn muốn add thêm các animation vui nhộn và hiệu ứng mới cho trang nổi hơn, đây chắc chắn là plugin của bạn.

Boxaroo Lightbox

Dưới đây là một list các feature:

  • Animation là phần cứng sẽ tận dụng hết GPU và giúp bạn đạt năng suất tối đa.
  • Các lightbox mà bạn dễ dàng tạo nên nhiều loại content, từ Vimeo video đến các Flash game interactive.
  • Plugin phụ trách hoàn toàn và được thiết kế theo cách này để scale đúng chuẩn theo tuỳ device.
  • Plugin cũng “từ tốn” và các feature khác cũng giúp cho lightbox tương thích với các browser cũ mèm như IE7.

Ngoài ra, có một số feature làm Boxaroo đặc biệt hơn gồm có:

  • Nó có đến 70 GraphicRiver item khác nhau, đáng giá $287! Nó bao gồm các background và arrow làm Boxaroo trông rất chuyên nghiệp.
  • The plugin support các kiểu elements độc lập như caption, animation, hiển thị, scaling, và vị trí.
  • Bạn có thể tự kiểm soát các nút trước, sau cho mỗi lightbox.
  • Bạn có thể tạo background cho lightbox dùng ảnh, các tile, và các màu sắc mới.
  • Các shadows và highlights, gồm cả color, radius,… đều do bạn kiểm soát.

Hãy hãy xem thử bản demo có sẵn trên website của plugin, không phí thời gian đâu!

5. ModuloBox: NextGen Lightbox JavaScript Plugin

ModuloBox là một responsive lightbox plugin tập trung vào năng suất cũng như các tính năng.

ModuloBox NextGen Lightbox

Dưới đây là các feature làm cho plugin trở nên tuyệt vời:

  • Bên cạnh hình ảnh, bạn có thể add cả video, iframes, và các HTML5 content khác.
  • Nó đi kèm với các thao tác support gồm có double-tap và pinching. Visitor di động vẫn sẽ có được trải nghiệm tốt nhất.
  • Bạn còn có thể navigate qua lightbox bằng keyboard hoặc mouse.
  • Nó có hỗ trợ nhiều gallery trên cùng một page.
  • Bạn có thể navigate vào gallery với hỗ trợ của các thumbnail. Nó còn đi kèm với fullscreen mode với trải nghiệm mới lạ và một slideshow mode tự động kéo qua tất cả các ảnh.
  • Plugin cũng support RTL layout, đảo ngược hướng animation và caption.

ModuloBox offer nhiều thứ, tất cả các feature có tại product page.

Kết luận

Mỗi lightbox plugin mà chúng ta đã list tại đây có những feature riêng phù hợp cho những trường hợp riêng.

  • Nếu bạn muốn một plugin có feature lớn từ thumbnail navigation đến tích hợp comment, bạn có thể cân nhắc LC Lightbox.
  • Nếu website của bạn dựa trên Bootstrap framework, sử dụng một plugin như Responsive Bootstrap Portfolio và Lightbox có thể giúp bạn tận dụng tất cả các feature của framework.
  • Nếu bạn tìm cái gì đó dễ customize thì chỉ cần dùng plugin jQuery Thumbnail Gallery bằng Lightbox.
  • Cho những ai bay bổng thích animations và hiệu ứng trong lightbox, Boxaroo là sự lựa chọn hoàn hảo nhất.
  • Cuối cùng, ModuloBox sẽ cung cấp RTL support cho lightbox của bạn.

Bạn có thể xem thêm một số feature khác mà các plugin khác offer tại Envato Market nếu không có plugin nào trên đây hợp với project của bạn.

TopDev via Tut+

  Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 1)
  Responsive HTML bằng một dòng CSS

Tổng hợp Cheat Sheets cho AI, Neural Networks, Machine Learning, Deep Learning và Big Data

Tổng hợp Cheat Sheets cho AI, Neural Networks, Machine Learning, Deep Learning và Big Data

Tác giả: Stefan Kojouharov

Trong vài tháng qua, tôi đã bắt đầu sưu tập Cheat Sheet AI. Đôi khi tôi chia sẻ chúng với bạn bè và đồng nghiệp và gần đây tôi đã được hỏi rất nhiều, vì vậy tôi quyết định chia sẻ toàn bộ chúng cho cộng đồng. Để làm cho mọi thứ trở nên thú vị hơn và dẽ hiểu hơn, tôi đã thêm các mô tả và /hoặc trích đoạn cho mỗi chủ đề chính.

Đây là danh sách đầy đủ nhất về AI và Big-O:

Neural Networks

Neural Networks Graphs

Machine Learning Overview

Machine Learning: thuật toán Scikit-learn

Machine learning cheat sheet sẽ giúp bạn tìm được các estimatorphù hợp cho công việc, đó là phần khó nhất. Flowchart sẽ giúp bạn kiểm tra tài liệu và hướng dẫn sơ bộ của từng estimator sẽ giúp bạn biết thêm về các vấn đề và cách giải quyết nó.

Scikit-Learn

Scikit-learn (trước đây là scikits.learn) là một thư viện Machine learning miễn phí dành cho ngôn ngữ lập trình Python. Nó có các thuật toán phân loại, hồi quyphân cụm khác nhau bao gồm các vector machine hỗ trợ, random forests, gradient boosting, k-means và DBSCAN được thiết kế để tương tác với Python và thư viện khoa học NumPy và SciPy.

Machine learning: Cheat sheet thuật toán

Cheat sheet machine learning  này từ Microsoft Azure sẽ giúp bạn chọn các thuật toán machine learning thích hợp cho giải pháp phân tích tiên đoán của bạn. Thứ nhất, cheat sheet sẽ hỏi bạn về tính chất dữ liệu và sau đó đề xuất các thuật toán tốt nhất cho công việc của bạn.

Python for Data Science

TensorFlow

Google đã công bố thế hệ thứ hai của TPU, cũng như TPU sẵn có trong Google Compute Engine. [12] Các TPU thế hệ thứ hai cung cấp đến 180 teraflop hiệu suất, và khi được tổ chức thành các nhóm 64 TPUs cung cấp lên đến 11,5 petaflops.

Keras

Năm 2017, nhóm TensorFlow của Google đã quyết định hỗ trợ Keras thư viện lõi của TensorFlow. Chollet giải thích rằng Keras là một interface hơn là end-to-end machine-learning framework. Nó trình bày một tập các phép tính trừu tượng cấp cao, trực quan hơn giúp dễ dàng cấu hình neural networks bất kể thư viện backend.

Numpy

NumPy nhắm mục tiêu thực hiện tham chiếu CPython của Python, đó là một giao diện non-optimizing bytecode. Các thuật toán được viết cho phiên bản này của Python thường chạy chậm hơn nhiều so với các trình biên dịch tương đương. NumPy giải quyết vấn đề xử lý chậm bằng cách cung cấp mảng đa chiều, các hàm và toán tử hoạt động hiệu quả trên các mảng, đòi hỏi phải viết lại một số code, chủ yếu là inner loops sử dụng NumPy.

Pandas

Tên ‘Pandas’ bắt nguồn từ thuật ngữ ““panel data “, đây là thuật ngữ dùng cho bộ dữ liệu có cấu trúc đa chiều.

Data Wrongling

Thuật ngữ “data wrangler ” bắt đầu từ nền văn hoá nhạc pop. Trong bộ phim Kong 2017: Skull Island, nhân vật được đóng bởi nam diễn viên Marc Evan Jackson được giới thiệu là “Steve Woodward, người viết dữ liệu của chúng tôi”.

Data Wrangling với dplyr và tidyr

Scipy

SciPy được xây dựng trên đối tượng mảng NumPy và là một phần của stack NumPy bao gồm các công cụ như Matplotlib, pandas và SymPy, và một tập hợp các scientific computing libraries mở rộng. Stack NumPy này có những người dùng tương tự với các ứng dụng khác như MATLAB, GNU Octave, và Scilab. Stack NumPy cũng đôi khi được gọi là stack SciPy. [3]

Matplotlib

Matplotlib là một thư viện cho ngôn ngữ lập trình Python và các phép toán mở rộng của NumPy. Nó cung cấp một API hướng đối tượng để nhúng các mảnh vào các ứng dụng sử dụng các bộ dụng cụ GUI chung như Tkinter, wxPython, Qt, hoặc GTK +. Ngoài ra còn có một thủ tục gọi lf “pylab” interface dựa trên tuyên bố machine (như OpenGL), được thiết kế để gần giống như của MATLAB, mặc dù việc sử dụng nó là nản lòng SciPy sử dụng matplotlib.

Pyplot là một mô-đun matplotlib cung cấp một interface  giống như MATLAB. [6] Matplotlib được thiết kế để có thể sử dụng được như MATLAB, với khả năng sử dụng Python, với lợi thế là nó miễn phí.

Data Visualization

PySpark

Big-O

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

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

  Bí kíp chinh phục tất cả nhà tuyển dụng IT trong vòng phỏng vấn (Phần 1)

  5G & IoT hứa hẹn điều gì trong tương lai?

  Hot trend AI, không hề "gắt" như bạn nghĩ

  Đừng nghi ngờ nữa, 8 xu hướng Fintech này sẽ thống trị thế giới năm 2022

Đừng nghi ngờ nữa, 8 xu hướng Fintech này sẽ thống trị thế giới năm 2022

“Tương lai đã mở ra khi chúng ta còn chờ đợi” Câu nói trên được chứng minh là hoàn toàn đúng trong sự phát triển của ngành tài chính. Fintech ở thế kỉ 21 đã chứng kiến những thay đổi chóng mặt về cách mạng hóa các quy trình, kiến thức và dịch vụ tài chính.

Dưới đây là 8 xu hướng Fintech đang chiếm lĩnh thế giới và nhất định sẽ tiếp tục phát triển hơn vào năm 2022.

1. Trợ lý kỹ thuật số nhân tạo (Artificial Digital Assistant)

Artificial intelligence for voice (tức là trợ lý điều khiển bằng giọng nói), chúng ta đã thấy sự phát triển của nó từ các video games cho đến trợ lý giọng nói từ các ứng dụng của Google hoặc sử dụng trợ lý giọng nói để đọc sách.

Bạn đã bao giờ gọi cho ngân hàng để điều tra hoặc để xử lý một vấn đề và cuối cùng không được hỗ trợ hoặc mất quá nhiều thời gian để trả lời? Giọng nói trí thông minh nhân tạo được thiết lập để giải quyết vấn đề trên. Call centers sẽ sử dụng bots để gọi trực tiếp nhanh hơn và hiệu quả hơn.

Trên thực tế, trợ lý giọng nói đang được phát triển để xử lý các hoạt động của ngân hàng. Ngân hàng OCBC gần đây đã hợp tác với Google để ra mắt dịch vụ ngân hàng thoại AI đầu tiên tại Singapore.

Công nghệ cho phép khách hàng trò chuyện về các dịch vụ ngân hàng bao gồm tính lãi vay, lập kế hoạch tiết kiệm trong tương lai, cập nhật thị trường tài chính mới nhất và tìm kiếm các chi nhánh hoặc ATM gần đó.

banking

Chatbots cũng đã trở nên phổ biến bằng cách cho phép khách hàng trò chuyện thuận tiện với robot trong thời gian thực và nhận được câu trả lời chính xác. Bots cũng đang được sử dụng để phát hiện gian lận.

Hiệu quả và tiện lợi!

2. Ngân hàng kỹ thuật số (Digital-only Banks)

Phép thuật có xu hướng làm cho mọi thứ biến mất hoặc xuất hiện từ hư không. Theo truyền thống, ngân hàng là các tổ chức hữu hình cung cấp dịch vụ tài chính. Tuy nhiên, với sự phát triển của Fintech, vẫn là những tổ chức cung cấp dịch vụ tài chính, nhưng bạn lại không không thể thấy họ trực tiếp ngoài đời.

Họ không tồn tại hữu hình do đó sẽ không có các chi nhánh ngân hàng.

Các ngân hàng kỹ thuật số đang ngày càng trở nên phổ biến vì họ có thể cung cấp được các dịch vụ tại nhà hoặc văn phòng của khách hàng mà không cần phải đến ngân hàng, từ giờ khách hàng có thể truy cập vào ngân hàng qua các trang web và ứng dụng.

Fintech đang lan rộng như một cuộc cháy rừng và vì vậy việc đi đến các chi nhánh ngân hàng truyền thống dự kiến sẽ giảm 36% trong giai đoạn 2017-2022, trong khi các giao dịch di động dự kiến sẽ tăng 121% trong cùng kỳ.

Một ví dụ về ngân hàng kỹ thuật số Revolut, đơn vị cung cấp ứng dụng tài chính cho phép trao đổi cả tiền tệ và tiền điện tử. Người dùng kiểm soát tài chính của họ ở đầu ngón tay bằng ứng dụng này. Nó cũng phân loại các khoản thanh toán để người dùng có thể thấy chi tiêu của họ một cách chi tiết.

Tính đến năm 2018, Revolut có hơn 2 triệu người dùng và có từ 6.000 đến 8.000 khách hàng mới mỗi ngày.

Xem thêm các công ty ngành ngân hàng tại Topdev

3. Sự sụp đổ của tiền giấy

Fintech cứu lấy cây xanh bằng cách giảm nhu cầu về tiền giấy (chỉ đùa thôi). Đã qua rồi cái thời người ta cần mang theo một chiếc ví đầy tiền để mua hàng.

Các giải pháp thanh toán hiện nay rất nhiều, đặc biệt là với sự gia tăng của tiền điện tử. Các cá nhân, cũng như các công ty đang dần thay thế các các hệ thống ngân hàng truyền thống nhằm giảm thiểu hoặc tránh những hạn chế về rủi ro.

Nghị viện châu Âu đã nâng tiền điện tử lên vị trí cao hơn, bằng cách đưa ra một chỉ thị về dịch vụ thanh toán thứ hai cho phép tất cả các doanh nghiệp có thể lựa chọn để sử dụng thay thế ngân hàng. Ngoài ra, chỉ thị cho phép thanh toán với bên thứ ba đối với các tài khoản được lưu trữ bởi các ngân hàng.

4. Công nghệ sinh trắc học (Biometric technologies)

Thời đại kỹ thuật số mang lại nhiều ưu điểm nhưng cũng mang lại những khuyết điểm đi kèm. Fintech bị thách thức bởi các cuộc tấn công mạng và bảo mật nói chung. Lĩnh vực tài chính là một lĩnh vực quan trọng do đó an ninh là ưu tiên hàng đầu của Fintech.

Do đó công nghệ sinh trắc học được áp dụng để hạn chế các rủi ro xảy ra. Ngoài ra, việc sử dụng sinh trắc học để xác thực đã trở thành cứu cánh cho khách hàng vì sự tiện lợi của nó. Bạn không còn cần phải nhớ mật khẩu hoặc lo lắng rằng bạn đã quên chúng.

Một số ngân hàng đã bắt đầu đầu tư vào xác thực dựa trên sinh trắc học, sử dụng máy ảnh smartphone để quét con ngươi và vân tay có sẵn từ điện thoại.

Do đó, sự lo lắng về bảo mật đã giảm đi rất nhiều vì mỗi dấu vân tay là duy nhất, không ai có thể tấn công bảo mật tài khoản của bạn.

5. Blockchain: Ông chủ của cuộc cách mạng Fintech

Một trong những cuộc cách mạng Fintech vĩ đại nhất đã quét sạch mọi thứ khỏi chân của nó là blockchain. Tiền điện tử đã thay đổi đáng kể giao dịch tiền tệ và lĩnh vực tài chính.

blockchain

Blockchain đã và đang chiếm lĩnh hệ thống ngân hàng truyền thống từ từ theo thời gian. Tại sao? Một trong những lý do là giảm bớt giấy tờ vì nó cập nhật dựa vào kỹ thuật số trong thời gian thực trong khi các ngân hàng lưu trữ tất cả các hồ sơ theo một cách không thay đổi.

Phí chuyển khoản và chuyển khoản được giảm bằng cách sử dụng bitcoin, thanh toán bù trừ và thanh toán ngay lập tức, các khoản vay và ứng dụng tín dụng có thể được truy cập tại chỗ và người tiêu dùng có quyền truy cập ngay vào số tiền họ cần và câu trả lời họ yêu cầu.

“Phong trào Blockchain” mạnh mẽ đến mức khoảng 90% các ngân hàng lớn ở Bắc Mỹ và Châu Âu đang thực hiện blockchain để thanh toán. Theo một nghiên cứu của IBM, dự kiến khoảng 65% ngân hàng sẽ áp dụng công nghệ blockchain vào năm 2022.

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

6. Hợp tác thông minh (Smart Collaborations)

Thay đổi là không thể tránh khỏi. Trong lĩnh vực tài chính, người ta phải theo kịp sự thay đổi để duy trì sự phù hợp trên thị trường. Do đó, khi sức ép đè nặng các ngân hàng lớn phải đổi mới, và các công ty khởi nghiệp tiếp tục phấn đấu để thu hút cũng như giữ chân khách hàng, quan hệ giữa hai bên là sự hợp tác công bằng.

MasterCard’s Start Path là một ví dụ tuyệt vời. MasterCard chọn các công ty khởi nghiệp có tiềm năng thông qua chương trình sáu tháng, sau đó họ hợp tác để cung cấp dịch vụ tốt hơn và thu được lợi nhuận cùng có lợi.

Chương trình bắt đầu với Mobeewave, ngân hàng thanh toán trực tuyến với Revolut và thanh toán trong các mạng xã hội từ PayKey.

Những người thành công nói rằng, hợp tác là một hình thức quan trọng nhất để cung cấp các công nghệ tập trung vào khách hàng một cách nhanh chóng và hiệu quả.

7. Sức mạnh của tự động hóa

Tự động hóa mang đến nỗi sợ hãi cho nhiều nhân viên. Tuy nhiên, Trí tuệ nhân tạo đã được các ngân hàng sử dụng để tăng hiệu quả. Trên thực tế, theo McKinsey, làn sóng tự động hóa thứ hai và AI sẽ xảy ra trong vài năm tới và máy móc sẽ thực hiện 10 đến 25% công việc của ngân hàng.

Điều này, tất nhiên, sẽ giúp tăng hiệu quả và giảm các lỗi liên quan đến con người. Ngoài ra, nó sẽ giúp cho nhân viên trong lĩnh vực tài chính một cơ hội để tập trung vào các nhiệm vụ đòi hỏi sức mạnh não bộ.

Điều này có ý nghĩa gì với khách hàng? Ít thời gian hơn và hiệu quả cao hơn trong các hệ thống ngân hàng.

8. Sự phát triển của việc cho vay dữ liệu

Big data luôn là vấn đề lớn đối với bất kỳ ngành nào và ngành tài chính cũng không ngoại lệ. Cuộc cách mạng Fintech đã tìm cách thay thế điểm tín dụng FICO thông qua việc cho vay dữ liệu.

FICO được xem là đã lỗi thời trong một số năm nay nhưng thông qua việc cho vay dữ liệu, giờ đây các ngân hàng có thể truy cập dữ liệu hữu ích để tạo ra mô hình tín dụng tốt hơn và bằng cách này xác định trình độ và sự phù hợp của khoản vay.

Kết luậnXu hướng Fintech được tạo ra để làm cho lĩnh vực tài chính hiệu quả và thuận tiện hơn bên cạnh giảm sự thiếu chính xác. Công nghệ tiếp tục phát triển và ai biết được Fintech sẽ phát minh ra gì vào ngày mai? Tính đến hiện nay, Startup Fintech Việt Nam mọc lên vô số kể và được dự đoán thị trường fintech Việt Nam có thể đạt 8 tỉ đô la Mỹ năm 2020, Có thể nói dù là doanh nghiệp hay cá nhân thì Fintech vẫn là một lĩnh vực mang lại nhiều cơ hội phát triển nhất tại Việt Nam trong thời điểm hiện nay. Tuy nhiên để trang bị cho mình một lượng kiến thức và các bệ phóng cần thiết để đón đầu xu hướng này thật không dễ dàng. Đến với chuỗi topic FUTURE OF FINTECH & MOBILE PAYMENT tại Vietnam Mobile Day năm thứ 9 do TopDev tổ chức vào tháng 6 tới này!

Bạn sẽ có cơ hội:

  • Networking với những decision maker trong ngành, gặp gỡ với các đối tác cực kỳ tiềm năng.
  • Cập nhật những số liệu nghiên cứu thị trường sát nhất trong ngành Fintech tại Việt Nam.
  • Tham gia các topic nóng nhất liên quan đến các case study thành công tại Việt Nam  “người thật việc thật”.

TopDev Blog via espeo.eu

Tài liệu làm chủ Python trong vòng 4 tuần (Phần 1)

Python là ngôn ngữ lập trình hướng đối tượng, thông dịch, mã nguồn mở, đa mục đích và là ngôn ngữ lập trình được dùng khá phổ biến trên thế giới hiện nay. Là một ngôn ngữ có danh tiếng rất tốt trong giới lập trình, đã được sử dụng để viết nhiều chương trình phổ biến như Youtube, DropBox, Google, Instagram, và Spotify.

Tuyển dụng python các công ty hot nhất

Hai lợi thế chính của Python nằm ở sự đơn giản và linh hoạt của ngôn ngữ. Với cú pháp đơn giản của nó giúp các developer dễ dàng tìm hiểu, đọc và chia sẻ. Theo một báo cáo, có tới 145.000 custom-built software package đã được tải lên cho online repository. Chúng trải dài từ nhiều lĩnh vực bao gồm từ phát triển trò chơi đến thiên văn học, và có thể được cài đặt và thêm vào một Python program chỉ trong tích tắc. Sự linh hoạt này này có nghĩa là những cơ quan tình báo có thể sử dụng nó cho hacking, Google cho thu thập dữ liệu các trang web, Pixar để tạo phim và Spotify để giới thiệu các bài hát. Một trong số các gói phổ biến nhất là “machine learning”, được dùng cho những task với các gói data số lượng lớn mà vốn sẽ bất khả thi nếu dùng sức người.

Nhằm tạo điều kiện nghiên cứu cho các bạn mới bắt đầu nắm bắt xu hướng, tiếp xúc với Python, TopDev giới thiệu đến bạn series video “LÀM CHỦ PYTHON TRONG VÒNG 4 TUẦN”

TopDev mời bạn tiếp tục phần tiếp theo– khi bạn đã “tinh thông” Phần 1 nhé!

Tham khảo các vị trí lập trình Python (All levels) tại TopDev

  Tài liệu làm chủ Python trong vòng 4 tuần (Phần 2)

Những việc “tối kị” mà lập trình viên không bao giờ nên làm!

nhung-viec-toi-ki-ma-lap-trinh-vien-khong-bao-gio-nen-lam

Người viết: Joel Spolsky

Cuối cùng thì bản dùng thử public đầu tiên của Netscape 6.0 cũng đã được tung ra, trong khi chưa từng có bản 5.0 nào cả. Phiên bản lớn gần nhất của trình duyệt này, version 4.0, đã được xuất bản từ gần 3 năm trước. Ba năm là khoảng thời gian dài khủng khiếp trong thế giới Internet. Trong quãng thời gian này, Netscape chỉ có thể ngồi nhìn thị phần của họ tụt giảm mạnh, một cách bất lực.

Tôi có chút thái quá khi chỉ trích họ về việc chờ đợi quá lâu giữa các kỳ xuất bản. Họ không cố tình làm như vậy, đúng không?

Có đấy. Cố tình đấy. Họ mắc phải một sai lầm chiến lược tồi tệ nhất mà một công ty phần mềm có thể đưa ra:

Họ quyết định code lại toàn bộ từ đầu.

Netscape không phải là công ty đầu tiên mắc phải sai lầm này. Borland cũng đã từng, đó là khi họ mua Arago và cố gắng biến nó thành dBase dành cho Windows, một dự án suy đồi kéo dài quá lâu, và để cho Microsoft Access “cướp miếng ăn” của họ trong lĩnh vực này. Sau đó, họ lại phạm sai lầm tương tự khi viết lại Quattro Pro từ đầu và làm người ta sững sờ về số tính năng ít ỏi mà nó cung cấp. Microsoft cũng suýt mắc phải lỗi đó, họ cố viết lại từ đầu Word cho Windows trong một dự án thất bại tên là Pyramid – dự án đã bị đóng cửa, quăng ra ngoài đường, dọn dẹp không còn chút tàn tích. Vẫn may cho Microsoft, họ chưa bao giờ dừng bảo trì bộ khung code cũ, họ vẫn có sản phẩm để deliver, vậy nên cho dự án kia “chỉ” gây ra một thảm họa tài chính thay vì một thảm họa chiến lược.

Chúng ta là những lập trình viên. Lập trình viên thì có bản năng của kiến trúc sư, và việc đầu tiên họ muốn làm khi được đưa tới một công trình là ủi phẳng chỗ đó để xây lên một cái gì đó thật đẹp. Chúng ta không thấy kích thích bởi những việc như: tu sửa căn nhà, cải tạo sân vườn, trồng thêm mấy chậu hoa.

Có một lý do làm cho các lập trình viên luôn luôn muốn đập bỏ source code cũ đi và làm lại từ đầu. Lý do đó là: họ nghĩ source code cũ là một đống tạp nham thối hoắc. Và đây là một đánh giá thú vị về việc đó: có lẽ họ đã sai. Nguyên nhân làm họ coi source code cũ như một đống rác rưởi là vì quy luật căn bản và thiết yếu của việc lập trình:

Đọc code thì khó hơn viết code

Đó là lý do vì sao việc tái sử dụng code lại khó như vậy. Nó cũng giải thích nguyên nhân mỗi người trong team bạn dùng một function khác nhau để tách chuỗi thành mảng chứa các chuỗi con. Họ viết function của riêng họ vì nó dễ hơn và tiện hơn việc tìm hiểu cách hoạt động của các function cũ.

Như là hệ quả tất nhiên của tâm lý trên, bạn có thể hỏi gần như mọi lập trình viên về phần code họ đang làm việc.
“Cái source code đấy hả? Nó là một đống bùng nhùng lộn xộn to oành”, họ sẽ kể như vậy.
“Tôi chỉ mong được quăng mẹ nó đi để code lại”.
“Đoạn code này đã làm tôi bị ung thư”.

Tại sao nó lại là một đống tạp nham bốc mùi?

“Mẹ kiếp,”, họ bảo, “nhìn cái function này đi. Nó dài tới 2 trang giấy! Chẳng có dòng nào liên quan đến nghiệp vụ này cả. Tôi không hiểu một nửa số dòng code gọi API này để làm quái gì nữa.”

Trước khi phần mềm xử lý bảng tính mới của Borland ra đời, Philippe Kahn, nhà sáng lập ưa hoa mĩ của Borland, đã rất huênh hoang trong các buổi họp báo về chuyện Quattro Pro sẽ tốt hơn nhiều so với Microsoft Excel, bởi vì nó được code lại từ đầu. Toàn bộ source code đều là mới! Như thể source code để lâu thì sẽ bị rỉ sét vậy.

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

  Bài học tôi rút ra được từ việc "clone" ứng dụng Uber
  Top các khóa học Computer Science, Programming, Data Science MIỄN PHÍ cần học ngay!

Quan niệm code mới tốt hơn code cũ thì hiển nhiên là vô lý. Code cũ là cái đã được sử dụng. Nó đã được test. Nhiều bug đã được phát hiện và đã được fix. Không có vấn đề gì ở đấy cả. Source code đó không tự thâu tóm đống bug bằng việc chỉ nằm im đâu đó trong ổ cứng của bạn đâu nhé. Au contraire, baby! (Nhầm rồi cưng!) Phần mềm máy tính được xem như giống chiếc xe Dodge Dart cũ, sẽ rỉ sét khi nằm mãi trong garage hay sao? Hay là phần mềm giống như con teddy bear, trông sẽ thảm hại nếu không được làm toàn bộ từ những nguyên liệu mới?

Quay lại với cái function dài 2 trang giấy. Vâng, tôi biết, nó chỉ là một function đơn giản để hiển thị một window dialog, nhưng nó có mọc thêm tóc tai lông lá và không ai hiểu tại sao. Ừm, để tôi nói cho bạn lý do: mấy cái đó từ fix bug mà ra. Một trong số chúng để fix bug mà bạn Nancy gặp khi cố install chương trình trên máy tính không có Internet Explorer. Một chỗ khác thì fix bug xảy ra trong điều kiện máy thiếu memory. Chỗ khác thì fix bug về trường hợp file được chứa trong một cái đĩa mềm và người dùng cao hứng rút cái đĩa ra trong lúc đang chạy. Đoạn code gọi LoadLibrary trông xấu tệ hại nhưng nó giúp chương trình hoạt động trên version cũ của Windows 95.

Các bug kể trên đã sống nhiều tuần trời trước khi chúng được phát hiện. Lập trình viên có lẽ đã mất vài ngày tái hiện và fix bug. Nếu chúng giống hầu hết các bug thông thường khác, để fix được có lẽ chỉ cần 1-2 dòng code, hoặc thậm chí là sửa vài ký tự, nhưng rất nhiều công sức và thời gian đã phải bỏ ra để biết được vài ký tự cần sửa đó.

Khi bạn vứt bỏ code cũ để làm lại, bạn đang ném đi tất cả những hiểu biết trên. Tất cả những phần fix bug được tổng hợp lại. Hàng nhiều năm trời công sức lập trình.

Bạn đang ném đi uy thế đứng đầu trong lĩnh vực đã làm. Bạn đang tặng món quà trị giá 2 đến 3 năm cho các đối thủ cạnh tranh, và hãy tin tôi đi, đó là khoảng thời gian rất dài xét theo “năm phần mềm”.

Bạn đang tự đưa mình vào tình thế cực kỳ nguy hiểm khi mà bạn sẽ phải deliver một version code cũ trong vài năm, hoàn toàn không có khả năng đưa ra các thay đổi về chiến lược hoặc đáp ứng những tính năng mới mà thị trường đòi hỏi, bởi vì bạn không có source code để deliver. Bạn thậm chí có thể phải đóng cửa doanh nghiệp trong quãng thời gian đó.

Bạn đang lãng phí một khoản chi phí khó có thể chấp nhận, cho việc viết lại source code vốn đã có sẵn.

Có phương án thay thế nào không? Có vẻ họ ngầm hiểu rằng bộ khung code cũ của Netscape là thực sự tệ hại. Ừm, có thể đúng vậy, nhưng bạn biết điều gì khác về nó không? Nó vẫn hoạt động khá ổn trên một số lượng cực lớn các hệ thống máy tính đang vận hành ngoài kia.

Khi các lập trình viên nói bộ source của họ là đống tạp nham thối hoắc (họ vẫn nói vậy suốt), có 3 yếu tố sai lầm ở đấy:

Đầu tiên, có các vấn đề thuộc về kiến trúc phần mềm. Bộ source không được thiết kế đúng chuẩn. Phần code kết nối mạng tự bật ra một cái popup dialog từ giữa hư không; cái này nên được xử lý ở phần code giao diện mới phải. Những vấn đề kiểu này có thể được giải quyết gọn gàng trong một lần sửa, bằng cách cẩn thận di chuyển cách đoạn code, format lại source, cập nhật phần giao diện. Những việc này có thể được một dev thực hiện một cách cẩn thận và kiểm soát chặt chẽ những đoạn code đã thay đổi, để không làm các phần việc khác bị gián đoạn. Thậm chí các thay đổi tương đối lớn về mặt cấu trúc cũng có thể được thực hiện mà không cần xoá bỏ source code cũ. Hồi làm dự án Juno, có thời điểm chúng tôi trải qua vài tháng để thiết kế lại kiến trúc: chỉ di chuyển các thứ qua chỗ nọ chỗ kia, dọn dẹp gọn gàng, tạo các class base có ý nghĩa, và tạo các interface rõ ràng cho việc giao tiếp giữa các module. Nhưng chúng tôi đã làm rất cẩn trọng, với bộ khung code có sẵn, và không hề gây ra bug mới hay phải bỏ đi các phần code vốn đang hoạt động đúng.

Lý do thứ 2 mà lập trình viên nghĩ code cũ kém chất lượng, đó là về hiệu quả performance thấp. Phần code dựng hình của Netscape được đồn thổi là chạy chậm. Nhưng nó chỉ ảnh hưởng đến một phần nhỏ trong cả dự án, phần mà bạn có thể sửa để tối ưu hoá hoặc thậm chí viết lại. Bạn không cần phải viết lại cả bộ source làm gì cả. Khi thực hiện việc tối ưu hoá, 1% khối lượng source sẽ chiếm 99% hiệu quả performance.

Thứ 3, source code trông xấu đau xấu đớn. Trong một dự án tôi từng làm, thật sự đã có một kiểu dữ liệu được khai báo tên là FuckedString. Một dự án khác thì ban đầu dùng ký tự gạch dưới để khai báo biến class member, nhưng về sau lại dùng cái chuẩn hơn là “m_”. Vậy nên một nửa số function có tên bắt đầu bằng “_” và nửa còn lại bắt đầu bằng “m_”, trông rất xấu và thiếu nhất quán. Thực sự thì kiểu vấn đề này bạn có thể giải quyết bằng một macro trong Emacs chỉ trong 5 phút, không cần phải viết lại từ đầu đống function kia.

Một điều quan trọng là bạn phải nhớ rằng khi phát triển lại toàn bộ hệ thống từ đầu thì TUYỆT ĐỐI KHÔNG CÓ LÝ DO NÀO để tin chắc rằng bạn sẽ làm tốt hơn lần đầu tiên. Trước tiên thì team mới của bạn có lẽ không còn là team phát triển của version đầu, nên thật ra bạn sẽ không có “nhiều kinh nghiệm hơn” trước kia. Có lẽ bạn sẽ lại gặp phải những lỗi cũ một lần nữa, thêm vào đó là phát sinh những vấn đề mới mà version trước không có.

Câu thần chú cổ điển “đập đi làm lại” là rất nguy hiểm khi áp dụng vào các ứng dụng mang tính thương mại có quy mô lớn. Nếu bạn chỉ đang viết code thử nghiệm, có lẽ bạn sẽ muốn xé bỏ cái function viết tuần trước khi bạn nghĩ ra một thuật toán tốt hơn. Cái đó thì ok thôi. Có lẽ bạn sẽ muốn định dạng lại một class nào đó cho dễ sử dụng. Cũng ổn thôi. Nhưng bỏ đi toàn bộ chương trình cũ là một việc dại dột và nguy hiểm, và nếu Netscape thực sự có được bộ máy giám sát chuyên nghiệp giàu kinh nghiệm trong ngành công nghiệp phần mềm, có lẽ họ đã không tự bắn vào chân mình một phát đầy đau đớn như vậy.

TopDev via Reddit Việt Nam

  Quy tắc 24x3 cho sáng tạo trong lập trình!
  Cơ hội nghề nghiệp về CNTT của các doanh nghiệp Nhật

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

10 dự đoán hàng đầu của ngành IT trên toàn thế giới

Theo báo cáo thứ ba từ International Data Corporation (IDC), đến năm 2023, gần như mọi doanh nghiệp sẽ hoạt động theo cơ chế ‘digital native’ khi nền kinh tế toàn cầu số hóa tiếp tục mở rộng. Tổ chức này đã đưa ra 10 dự đoán cho bối cảnh nền công nghiệp IT chuyển sang năm 2022 và hơn thế nữa, khi các nhà lãnh đạo CNTT và doanh nghiệp tiếp tục trải qua chuyển đổi kỹ thuật số (Digital Transformation).

Các tổ chức đang được xây dựng lại xung quanh các công nghệ nền tảng thứ 3 như Cloud, Mobile, phân tích big data, phương tiện truyền thông xã hội và được kích hoạt thêm bởi các “công cụ tăng tốc đổi mới” như Internet of Things (IoT), trí tuệ nhân tạo (AI) và tăng cường và thực tế ảo (AR / VR). Mặc dù nhiều tổ chức đang trên đường chuyển đổi bằng cách sử dụng các công nghệ này, nhưng chương tiếp theo về đổi mới công nghệ sẽ yêu cầu các công ty mở rộng phạm vi kỹ thuật số, cải thiện trí thông minh, tăng phát triển ứng dụng và dịch vụ cũng như đáp ứng nhu cầu bảo mật và nhu cầu của khách hàng. Còn bây giờ, hãy điểm qua 10 dự đoán hàng đầu của ngành IT trên toàn thế giới của IDC.

  1. Đến năm 2022, hơn 60% GDP toàn cầu sẽ được số hóa với sự tăng trưởng trong mọi ngành được thúc đẩy bởi các dịch vụ, hoạt động và mối quan hệ được tăng cường kỹ thuật số.

Theo báo cáo, các nỗ lực chuyển đổi kỹ thuật số phải dẫn đầu trong danh sách ưu tiên của các nhà lãnh đạo doanh nghiệp cấp cao. Và những người không chuyển đổi hoạt động cũng như dịch vụ của họ sẽ thua trong cuộc cạnh tranh này vì thị trường truyền thống đã bị phá vỡ.

  1. Đến năm 2023, 75% tổng chi tiêu cho CNTT sẽ dành cho các công nghệ platform thứ 3, vì hơn 90% tất cả các doanh nghiệp muốn xây dựng một môi trường CNTT đúng chất “digital native” để phát triển mạnh trong nền kinh tế kỹ thuật số.

digital native

Theo IDC, gần một nửa số doanh nghiệp nói rằng họ “digitally determined”, có nghĩa là họ đã đặt ra để phát triển một chiến lược và kiến trúc kỹ thuật số tích hợp khả năng bắt chước các tổ chức “digital native” (dân cư số). Điều này có nghĩa là họ sẽ sử dụng Cloud, Agile và DevOps, các nền tảng và cộng đồng đổi mới kỹ thuật số và quản lý dữ liệu tích hợp và kiếm tiền.

  1. Đến năm 2022, hơn 40% triển khai Cloud của các tổ chức sẽ bao gồm Điện toán ranh giới (edge computing) và 25% thiết bị và hệ thống điểm cuối sẽ thực hiện các thuật toán AI.

Cơ sở hạ tầng đám mây và các ứng dụng và dịch vụ doanh nghiệp đã chuyển sang Edge Computing để tăng sự kết nối với các thiết bị và nguồn dữ liệu. “Các dịch vụ AI sẽ là một trong những dịch vụ Cloud công cộng đầu tiên và biến đổi nhất, được phân phối trên các rìa biên giới.

  1. Đến năm 2022, 90% tất cả các ứng dụng sẽ có kiến trúc microservice góp phần cải thiện khả năng thiết kế, gỡ lỗi, cập nhật và tận dụng code của bên thứ ba; 35% của tất cả các ứng dụng sản xuất sẽ có nguồn gốc từ Cloud.

Trong nền kinh tế kỹ thuật số, các công ty phải cung cấp các ứng dụng chất lượng cao và đủ nhanh để đáp ứng nhu cầu kinh doanh. Điều này đang thúc đẩy sự chuyển đổi sang “ứng dụng hyperagile” hoặc những ứng dụng có tính mô đun hóa cao, phân tán, cập nhật liên tục và sử dụng các công nghệ dựa trên đám mây như container và máy tính không có máy chủ. Việc kết hợp các ứng dụng này với các phương pháp Agile và DevOps sẽ giúp cho doanh nghiệp có thể tăng tốc khả năng đổi mới so với các phương pháp trước đây.

  1. Đến năm 2024, một thế hệ mới các developer sẽ code mà không cần kịch bản tùy chỉnh, điều này sẽ giúp mở rộng nguồn nhân lực về developer thêm 30%, đẩy nhanh chuyển đổi kỹ thuật số.

low code, no code

Sự gia tăng của các nền tảng phát triển low code, no code và các công cụ phát triển theo mô hình sẽ cung cấp cho các doanh nghiệp tiếp cận đến một lớp các nhà phát triển mới mà ở đó có thể ứng dụng nhiều giải pháp kỹ thuật số hơn. Đến năm 2024, IDC dự đoán các nhà phát triển mới sẽ tăng tổng số developer toàn cầu lên gần một phần ba.

  1. Từ năm 2018 đến năm 2023, với nhiều công cụ/nền tảng mới hơn, nhân lực nhiều hơn, các phương thức agile và cả những lần sử dụng lại code, tất cả sẽ tạo ra hơn 500 triệu ứng dụng logic mới tương đương với số lượng được xây dựng trong hơn 40 năm qua.

Báo cáo lưu ý, việc chuyển sang các công nghệ ứng dụng hyperagile và sự bùng nổ của nhân lực developer nhờ low code và các công cụ không cần code sẽ dẫn đến sự tăng trưởng nhanh chóng trong phát triển ứng dụng và dịch vụ cũng như tốc độ và quy mô triển khai.

“Khả năng tăng tốc khối lượng và tốc độ đổi mới kỹ thuật số sẽ là chuẩn mực mới quan trọng nhất cho các tổ chức cạnh tranh trong nền kinh tế kỹ thuật số”, Gens cho biết trong bản phát hành.

  1. Đến năm 2022, 25% điện toán đám mây công cộng sẽ dựa trên các bộ xử lý không nhất thiết phải là x86; đến năm 2022, các tổ chức sẽ đầu tư nhiều hơn cho các ứng dụng SaaS dọc (đáp ứng nhu cầu của một ngành cụ thể) so với các ứng dụng ngang (tập trung vào một danh mục phần mềm).

Số lượng các trường hợp sử dụng được phục vụ bởi CNTT sẽ tăng đáng kể trong những năm tới, tạo ra nhiều nhu cầu CNTT chuyên biệt. Các yêu cầu xử lý AI đang thúc đẩy nhu cầu về bộ xử lý mạnh hơn và các tổ chức đang chọn Saas dọc nhiều hơn  gần gấp đôi so với các ứng dụng ngang.

VMD2019

  1. Đến năm 2024, giao diện người dùng hỗ trợ AI và tự động hóa quá trình sẽ thay thế một phần ba số lượng screen-based apps ngày nay. Đến năm 2022, 30% doanh nghiệp sẽ sử dụng công nghệ đàm thoại để thu hút khách hàng.

AI sẽ ngày càng được sử dụng làm giao diện người dùng chính cho một số ứng dụng và dịch vụ, đồng thời, tự động hóa quá trình do AI điều khiển sẽ hợp lý hóa và thay thế các nhiệm vụ của con người. Điều này sẽ ngày càng trở thành định mức để tối đa hóa năng suất của nhân viên, theo báo cáo.

  1. Đến năm 2022, 50% máy chủ sẽ mã hóa dữ liệu khi tiến vào trạng thái nghỉ ngơi và cả vận hành; hơn 50% cảnh báo bảo mật sẽ được xử lý bằng tự động hóa do AI cung cấp; và 150 triệu người sẽ có ID kỹ thuật số dựa trên Blockchain.

Vietnam Mobile Day

Các công nghệ mới nổi như mã hóa lan tỏa, blockchain, học máy và phân tích sẽ được sử dụng để cải thiện các biện pháp bảo mật trên toàn doanh nghiệp.

  1. Đến năm 2022, top 4 “megaplatforms” hàng đầu sẽ lưu trữ 80% việc triển khai IaaS/PaaS, đến năm 2024, 90% các tổ chức G1000 sẽ giảm thiểu khóa thông qua các công cụ cũng như các công nghệ đám mây đa nn tảng và hybrid.

Trong những năm tới, các doanh nghiệp sẽ nắm lấy các công cụ và chiến lược tích hợp và đa đám mây, báo cáo cho biết. “Thiếu một chiến lược tích hợp sẽ dẫn đến việc phân bổ nguồn lực dưới mức tối ưu, truy cập hạn chế vào các đổi mới công nghệ có sẵn tốt nhất, thời gian giải quyết và xác định vấn đề dài hơn và giới hạn

TopDev Blog via techrepublic.com

Hoài bão khai phá vùng đất CNTT của VNPT-IT và “miền đất hứa” dành cho Data Engineer

VNPT Topdev

VNPT-IT hoạt động trong lĩnh vực nghiên cứu phát triển, tích hợp các sản phẩm dịch vụ công nghệ thông tin phục vụ nội bộ Tập đoàn Bưu chính Viễn thông Việt Nam (VNPT) và các khách hàng bên ngoài VNPT-IT (bao gồm cả khách hàng Quốc tế).

Là Công ty công nghệ trọng điểm Quốc gia, VNPT-IT tham gia mạnh mẽ vào quá trình chuyển đổi nền kinh tế số của Việt Nam. VNPT-IT cũng sẽ là đơn vị cung cấp dịch vụ, giải pháp để chuyển đổi doanh nghiệp Việt Nam thành doanh nghiệp số và cung cấp các nền tảng để phát triển công nghệ số trong tương lai – “Vì một xã hội văn minh, minh bạch góp phần xây dựng cuộc sống người Việt tốt đẹp hơn”

Sự nghiệp vững vàng, ngập tràn cơ hội việc làm Data Engineer

Từ giấc mơ công nghệ tiến đến hiện tượng toàn quốc, nhân lực tại VNPT-IT chính là chìa khóa thành công

VNPT-IT đặt mục tiêu xây dựng một hệ sinh thái tích hợp trọn gói các sản phẩm, dịch vụ công nghệ thông tin và Internet lớn nhất Việt Nam, từ đó mang sản phẩm – dịch vụ đến với thị trường quốc tế. Để làm được điều này, VNPT-IT đề ra chiến lược phát triển xoay quanh 4 giá trị cốt lõi: Con người là chìa khóa – Khách hàng là trung tâm – Sáng tạo không ngừng – Đối tác đáng tin cậy.

Luôn coi trọng nguồn lực con người là trên hết, bởi đó chính là nhân tố nền tảng trên con đường dẫn đến thành công cho doanh nghiệp. Trong lộ trình ấy, VNPT-IT vẫn đang tiếp tục tìm kiếm những đồng đội, những bạn đồng hành giàu tình yêu và đam mê ở rất nhiều các vị trí công việc khác nhau.

Trong thời gian qua, Công ty chuyên lĩnh vực nhân sự Anphabe và Công ty nghiên cứu thị trường Intage Việt Nam đã công bố kết quả khảo sát “100 nơi làm việc tốt nhất Việt Nam”. Trong đó, Tập đoàn VNPT lọt vào Top 3 thương hiệu nhà tuyển dụng Viễn thông và CNTT tốt nhất Việt Nam bởi môi trường làm việc hiện đại, năng động, chế đội đãi ngộ tốt và cơ hội được học tập, phát triển năng lực cá nhân được hỗ trợ tối đa…Và đó cũng là chiến lược phát triển nguồn nhân lực chung của tất cả các đơn vị trực thuộc VNPT, trong đó có VNPT-IT.

VNPT-IT trở thành “miền đất hứa” dành cho các lập trình viên với những cơ hội đặc biệt

Hơn cả những đãi ngộ xứng đáng, đến với VNPT-IT, các bạn lập trình viên luôn được thỏa chí mài nghề, rèn sức sáng tạo. Đặc biệt ngay tại thời điểm này, vị trí Senior Data Engineer (Java, Scala, Big Data) đang được VNPT-IT săn đón với rất nhiều cơ hội hấp dẫn.

Hãy ứng tuyển Senior Data Engineer (Java, Scala, Big Data) ngay hôm nay để giữ lấy những đặc quyền đặc biệt:

  • Lương thỏa thuận hấp dẫn, về túi 300 – 600 triệu một năm;
  • Thưởng về mỗi dịp lễ đến rồi thưởng thêm cả ngày thành lập ngành;
  • Phụ cấp ăn trưa cùng với phụ cấp độc hại hằng tháng;
  • Phát triển bản thân, lên trình mới khi tham gia các khóa đào tạo chuyên sâu bao “xịn” trong và ngoài nước hàng năm;
  • Thời gian làm việc từ thứ 2 – thứ 6: 8h00 – 17h00, cuối tuần dành trọn bên gia đình, bạn bè.

Mô tả công việc:

  • Quy hoạch, xây dựng và phát triển hệ thống IDG, hệ thống backend xử lý dữ liệu lớn, các dịch vụ khai phá dữ liệu lớn (big data) gồm các công việc:
  • Đọc hiểu các tài liệu thiết kế tổng quan và thiết kế chi tiết của hệ thống
  • Thiết kế, quản trị big data storage, viết và tối ưu các module lưu trữ dữ liệu lớn
  • Lập trình phần backend của hệ thống big data
  • Viết các module tổng hợp báo cáo hoặc các modue khai phá dữ liệu lớn (data-mining)

Yêu cầu chính:

  • Tối thiểu 3 năm kinh nghiệm phát triển các hệ thống big data;
  • Có kinh nghiệm về hệ quản trị dữ liệu quan hệ và không quan hệ như: Database: Oracle, MySQL, Redis, MongoDB, Hadoop, Casandra;
  • Thông thạo ngôn ngữ lập trình cho big data: Java, Scala, (biết NodeJS, Python là một lợi thế);
  • Thông thạo Framework lập trình big data: Spark, Kafka;
  • Có khả năng đọc hiểu các tài liệu thiết kế tổng quan và chi tiết của hệ thống big data;
  • Có khả năng tự thiết kế, xây dựng một hệ thống big data.

Yêu cầu chung:

  • Tốt nghiệp đại học chuyên ngành CNTT hoặc tương đương;
  • Có khả năng lãnh đạo nhóm;
  • Tư duy logic tốt, chăm chỉ và có trách nhiệm trong công việc;
  • Hòa đồng với tập thể, có kỹ năng làm việc nhóm tốt;
  • Tính kỷ luật cao, chấp hành nội quy của đơn vị.

Về chung một nhà cùng VNPT-IT tuyển dụng, Senior Data Engineer đã sẵn sàng?

Bí kíp chinh phục tất cả nhà tuyển dụng IT trong vòng phỏng vấn (Phần 1)

Mặc dù đã đạt được điểm số cao trong khóa học CS101 thuật toán và môn Data Structures ở trường đại học, tôi vẫn thấy rùng mình với ý nghĩ phải trải qua một cuộc phỏng vấn lập trình với trọng tâm hướng vào các thuật toán và khá lấn cấn khi tìm kinh nghiệm phỏng vấn IT. 

Do đó tôi đã dành ba tháng sau khi ra trường để tìm hiểu cách cải thiện kỹ năng trả lời các buổi phỏng vấn của mình và thành quả là nhận được đề nghị từ các công ty công nghệ lớn. Trong bài viết này, tôi sẽ chia sẻ những mẹo mà mình đã dùng trong quá trình đi phỏng vấn. Xin lưu ý là những câu hỏi theo khuôn mẫu sẽ không nằm trong phạm vi của bài viết này.

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

  Những câu hỏi phỏng vấn về GIT cần nhớ ngay

Hẳn bạn cũng biết việc có nhiều khái niệm thuật toán xuất hiện trong buổi phỏng vấn lại ít được dùng tới khi bạn đi làm, nhưng vẫn được hỏi để kiểm tra nền tảng cơ bản. Đương nhiên, tôi cũng đã quên khá nhiều về các thuật toán và cấu trúc dữ liệu này, vốn được chủ yếu được dạy cho những sinh viên năm nhất và năm thứ hai đại học.

Song song đó, thật căng thẳng khi phải viết code trong cuộc phỏng vấn, khi có ai đó xem xét kỹ mọi phím tắt mà bạn thực hiện. Điều tồi tệ hơn là với tư cách là người được phỏng vấn, bạn còn cần phải truyền đạt và nói ra suy luận của mình ngay trong buổi phỏng vấn.

Tôi từng nghĩ rằng việc có thể suy nghĩ, viết code và giao tiếp cùng lúc là một điều không thể, cho đến khi tôi nhận ra rằng phỏng vấn là một kỹ năng mà bạn có thể đạt được tốt hơn bằng cách học tập, chuẩn bị và tập dợt cho nó.

Vì vậy mà có thể nói quá trình tìm kiếm việc làm gần đây của tôi đã giúp cải thiện kỹ năng phỏng vấn của mình rất nhiều. Rất nhiều các lập trình viên front-end than phiền về việc các cuộc phỏng vấn kỹ thuật có thể bao gồm những kỹ năng không liên quan đến quá trình phát triển front-end. Ví dụ, viết một thuật toán giải quyết mê cung và kết hợp hai danh sách các số đã được sắp xếp. Cũng là một kỹ sư front-end bản thân mình, tôi có thể cảm thông với họ.

Front end là một lĩnh vực chuyên biệt nơi các kỹ sư phải quan tâm đến nhiều vấn đề liên quan đến việc tương thích với trình duyệt, Document Object Model, hiệu suất JavaScript, bố cục CSS, v.v. Vì thế mà khá ít khi các lập trình viên front-end bị đòi hỏi phải thực hiện một số thuật toán phức tạp trong các cuộc phỏng vấn.

Thật không may, các quy tắc được đặt ra bởi các công ty, không phải bởi các ứng cử viên. Vì thế mà các khái niệm khoa học máy tính nói chung như thuật toán, design pattern, cấu trúc dữ liệu đều phải cần nắm vững. Nếu bạn muốn công việc, bạn phải chơi theo các quy tắc được thiết lập bởi các nhà tuyển dụng – nói cách khác, bạn phải cải thiện kỹ năng trả lời phỏng vấn của mình!

Bí kíp chinh phục tất cả nhà tuyển dụng IT trong vòng phỏng vấn (Phần 1)

Bài viết này được chia thành hai phần như sau. Hãy thoải mái bỏ qua phần bạn không quan tâm.

Phân tích các cuộc phỏng vấn lập trình và cách chuẩn bị cho chúng.

Lời khuyên hữu ích cho mỗi chủ đề thuật toán (arrays, trees, dynamic programming, vv), cùng với các câu hỏi thực hành của LeetCode để nắm vững các khái niệm cốt lõi.

Bí kíp chinh phục tất cả nhà tuyển dụng IT trong vòng phỏng vấn (Phần 1)

Chọn một ngôn ngữ lập trình phù hợp

Trước khi làm bất cứ điều gì khác, bạn sẽ cần phải chọn một ngôn ngữ lập trình để có thể thực hiện một cuộc phỏng vấn. Hầu hết các công ty sẽ cho phép bạn viết code bằng ngôn ngữ tự chọn ngoài một ngoại lệ duy nhất tôi biết là Google. Họ chỉ cho phép các ứng cử viên của họ chọn Java, C ++, Python, Go hoặc JavaScript. Do đó, tôi khuyên bạn chỉ nên sử dụng một ngôn ngữ mà bản thân đã rất quen thuộc, chứ không phải là một lựa chọn mới với bạn nhưng được công ty sử dụng rộng rãi.

Có một số ngôn ngữ phù hợp hơn những ngôn ngữ khác cho các cuộc phỏng vấn lập trình. Cũng như có một số mà bạn sẽ muốn tránh bằng mọi giá. Từ kinh nghiệm của tôi với tư cách là một người đã phỏng vấn nhiều lập trình viên, hầu hết các ứng cử viên đều chọn Python hoặc Java. Ngoài ra thì JavaScript, Ruby và C ++ là những lựa chọn không tồi. Tuy vậy, tôi sẽ tránh các ngôn ngữ cấp thấp hơn như C hoặc Go vì chúng thiếu các tính năng thư viện chuẩn và cấu trúc dữ liệu.

Theo ý kiến của cá nhân tôi thì Python là sự lựa chọn tốt nhất cho việc viết các thuật toán khi bạn đi phỏng vấn. Đó là vì nó vô cùng gọn gàng và có một thư viện rất lớn về các tính năng và cấu trúc dữ liệu. Mặt khác, Python còn sử dụng các API nhất quán và hoạt động được trên các cấu trúc dữ liệu khác nhau, chẳng hạn như len()for ... in ... và cắt ký hiệu trên chuỗi (chuỗi, list và bộ dữ liệu). Hay còn có thể lấy phần tử cuối cùng trong một chuỗi là  arr[-1] , và đảo ngược nó với cách thức vô cùng đơn giản là arr[::-1].Vì vậy mà bạn có thể đạt được rất nhiều thứ với các cú pháp tối thiểu trong Python.

Java cũng là một lựa chọn tốt. Nhưng bởi vì bạn sẽ phải liên tục khai báo các type trong code của mình nên sẽ làm chậm tốc độ mà bạn viết code. Vấn đề này sẽ càng rõ ràng hơn khi bạn phải viết trên một tấm bảng hoặc ra giấy trong các cuộc phỏng vấn.

Lý do chọn hoặc không chọn C ++ thì cũng tương tự như Java. Nói chung, Python, Java và C ++ là những lựa chọn tốt. Nếu bạn đã sử dụng Java một thời gian, và không có thời gian để làm quen với một ngôn ngữ khác, tôi khuyên bạn nên cứ gắn bó với Java thay vì chọn Python. Điều này giúp bạn tránh tình trạng phải sử dụng một ngôn ngữ mà mình chẳng hề đụng tới chỉ cho các cuộc phỏng vấn.

Một ngoại lệ cho việc cho phép ứng cử viên “chọn bất kỳ ngôn ngữ lập trình nào mà họ muốn” là khi cuộc phỏng vấn dành cho vị trí cụ thể, chẳng hạn như vai trò trong front-end, iOS hoặc Android. Khi đó bạn sẽ cần phải quen thuộc với các thuật toán trong JavaScript, Objective-C, Swift hoặc Java.

Nếu bạn cần sử dụng cấu trúc dữ liệu mà ngôn ngữ lại không hỗ trợ, chẳng hạn như queue hoặc heap trong JavaScript, hãy hỏi người phỏng vấn nếu bạn có thể giả định rằng bạn có cấu trúc dữ liệu triển khai các phương pháp nhất định với độ phức tạp thời gian cụ thể. Nếu việc thực hiện cấu trúc dữ liệu đó không quan trọng để giải quyết vấn đề, người phỏng vấn thường sẽ cho phép. Trong thực tế, việc nhận thức được các cấu trúc dữ liệu hiện có và lựa chọn các cấu trúc thích hợp để giải quyết vấn đề trong tầm tay là quan trọng hơn việc biết các chi tiết triển khai phức tạp.

Ôn lại những gì mình đã học được

Nếu bạn đã ra khỏi trường đại học một thời gian, bạn nên xem lại các nguyên tắc cơ bản về CS. Hãy chịu khó coi qua các ghi chú khi còn đi học của mình và luyện giải các vấn đề thuật toán từ LeetCode và Cracking the Coding Interview.

Kho lưu trữ các câu hỏi phỏng vấn interviews repository này bởi Kevin Naughton Jr. sẽ giúp cho bạn nhanh chóng nắm vững các khái niệm nền tảng và cơ bản.

Ngoài ra, khóa học basecs của Vaidehi Joshi cũng là một nguồn tài nguyên tuyệt vời và dễ nuốt để nắm lại các cấu trúc và thuật toán dữ liệu khác nhau.

Nếu bạn quan tâm đến cách cấu trúc dữ liệu được triển khai, hãy xem Lago, một thư viện cấu trúc dữ liệu và thuật toán cho JavaScript. Nó vẫn còn khá nhiều WIP nhưng tôi dự định biến nó thành một thư viện có thể được sử dụng như nguồn tham khảo cho việc học các cấu trúc và thuật toán dữ liệu.

Thực hành đến mức nhuần nhuyễn

Tiếp theo, làm quen với các thuật toán và cấu trúc dữ liệu trong ngôn ngữ lập trình bạn đã chọn.

Hãy thực hành và giải các câu hỏi thuật toán bằng ngôn ngữ bạn đã chọn. Trong khi Cracking the Coding Interview là một tài nguyên tốt, tôi thích giải quyết các vấn đề bằng cách tự viết code, cho phép nó chạy, và sẽ nhận được phản hồi ngay lập tức. Song song đó, bạn có thể nhận được sự trợ giúp từ các trang như LeetCode, HackerRank và CodeForces để thực hành các câu hỏi trực tuyến và làm quen với ngôn ngữ. Theo kinh nghiệm của tôi, các câu hỏi của LeetCode là thường được đặt ra trong các cuộc phỏng vấn nhất.

Hãy chắc chắn khoảng thời gian và mức độ phức tạp để viết các thuật toán trong ngôn ngữ bạn đã chọn. Đối với Python, trang này sẽ có ích. Ngoài ra, tìm hiểu về thuật toán phân loại cơ bản được sử dụng trong hàm  sort() của ngôn ngữ và các vấn đề liên quan về thời gian và không gian (trong Python thì đó là Timsort). Sau khi hoàn thành một câu hỏi trên LeetCode, tôi thường thêm những bình luận để nhắc nhở bản thân mình phải có khả năng phân tích thuật toán sau khi đã hoàn thành nó.

Mặt khác, hãy đọc về phong cách lập trình tối được khuyến nghị cho ngôn ngữ của mình. Nếu bạn chọn Python, hãy tham khảo PEP 8 Style Guide. Nếu bạn chọn Java, hãy đọc Google’s Java Style Guide.

Tìm hiểu và làm quen với những lỗi thường mắc phải trong ngôn ngữ. Nếu bạn có thể phát hiện và chỉ ra chúng trong buổi phỏng vấn, bạn sẽ ngay lập tức gây ấn tượng mạnh mẽ với người phỏng vấn, bất kể họ có quen thuộc với ngôn ngữ hay không.

Trong phần sau của bài viết, tôi đề cập đến các loại thuật toán và những câu hỏi hữu ích cho từng chủ đề để thực hành. Một lần nữa, hãy làm khoảng 100 đến 200 câu hỏi trên LeetCode và bạn sẽ ổn thôi.

Tạo Cv online miễn phí cho IT

(Hết phần 1)

TopDev via Medium

  Top 10 câu hỏi phỏng vấn Java thường gặp
  Để lọt vào mắt xanh của Google, Microsoft, Apple, hãy nhớ 4 bí kíp sau!

Top các khóa học Computer Science, Programming, Data Science MIỄN PHÍ cần học ngay!

COMPUTER SCIENCE

PROGRAMMING

DATA SCIENCE

TopDev via Medium

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 các khóa học Computer Science, Programming, Data Science MIỄN PHÍ cần học ngay!
Phân tích dữ liệu xổ số miền Bắc”]

Tại sao không nên lưu trữ data user trên Local Storage?

tai-sao-khong-nen-luu-tru-data-user-tren-local-storage

Tại sao Local Storage không an toàn và bạn không nên dùng nó để lưu trữ data nhạy cảm?

Stick Figure Instructor

Có một vấn đề: hầu hết những thứ xấu về local storage đều không quá quan trọng. Bạn vẫn có thể dùng nó nhưng app sẽ chậm hơn một chút và nhiều phiền toái cho dev. Nhưng vấn đề bảo mật thì khác. Model bảo mật của local storage rất rất quan trọng để biết và nó hoàn toàn ảnh hưởng đến trang web của bạn theo nhiều cách khác nhau.

Còn vấn đề của local storage đó nó không an toàn! Hoàn toàn không. Mọi người đều dùng local storage để store thông tin nhạy cảm như session data, user detail và tất cả những thứ bạn không muốn post công khai trên Facebook.

Local storage không được design như một cơ chế storage an toàn trên browser. Nó được design để store các string đơn giản mà dev có thể dùng để build các app single page phức tạp hơn một chút. Vậy thôi.

Việc làm Data engineer

Việc làm Database

Thứ nguy hiểm nhất trên thế giới là gì? JavaScript!

Hãy thử nghĩ xem: khi bạn store thông tin nhạy cảm lên local storage, bạn cũng đang làm một trong những việc liều lĩnh nhất thế giới là store thông tin lên công cụ tệ nhất mọi thời đại. Nếu bị tấn công cross-site scripting (XSS) thì sao? Tôi sẽ không kể lê thê hết về XSS đâu, nhưng tóm tắt là như thế này:

Nếu một attacker có thể run JavaScript trên wesite của bạn, họ có thể retrive mọi data bạn đã lưu trong local storage và gửi nó đi các domain khác của chúng. Nó có nghĩa là bất kì thứ gì nhạy cảm bạn có đều sẽ được công khai.

Bây giờ, có thể bạn sẽ nghĩ “Vậy thì sao? Website của tôi rất an toàn. Không một ai có thể run JavaScript trên website của tôi được.”

Nếu website của bạn thật sự an toàn và không kẻ nào có thể làm vậy thì căn bản là bạn an toàn nhưng thực tế thì nó rất khó trở nên như vậy. Nếu website của bạn chứa bất kì code JavaScript bên thứ ba nào gồm source ngoài domain:

  • Links đến bootstrap
  • Links đến jQuery
  • Links đến Vue, React, Angular, etc.
  • Links đến ad network code bất kì
  • Links đến Google Analytics
  • Links đến tracking code bất kì

Ví dụ website của bạn có nhúng script tag dưới đây:

<script src="https://awesomejslibrary.com/minified.js"></script>

Trong trưởng hợp này, nếu awesomejslibrary.com bị hack và script minified.js bị thay đổi:

  • Loop mọi data trong local storage
  • Gửi nó qua API được build để thu thập info bị mất

… thì lúc đó bạn tiêu rồi. Lúc này kẻ attack đã có thể xài bất cứ gì bạn có trong local storage và bạn chả bao giờ phát hiện được. Nhưng trên thực tế, chuyện này cũng khá hiếm.

Với nhiều công ty, team marketing trực tiếp quản lý public website dùng các WYSIWYG editors và tools khác nhau. Bạn có chắc là không có phần nào trên site của bạn không dùng JavaScript bên thứ ba không? Dám cá là không.

Lời cảnh báo và giảm risk về bảo mật: làm ơn đừng store cái gì lên local storage cả.

PSA: Đừng store các JSON Web Tokens trên Local Storage

Stick Figure with Stop Sign

Ngoài khuyên bạn tránh xa local storage, tôi nghĩ cũng nên nói về JSON Web Tokens (JWT). Một trong những vấn đề bảo mật tôi thấy là có những người store JWTs (session data) trên local storage. Nhiều người không nhận ra rằng JWTs cũng giống hệt như username và password.

Nếu attacker lấy được bản copy của JWT, chúng có thể gửi request đi trên danh nghĩa của bạn và bạn sẽ không biết được. Hãy xem nó như thông tin credit card của mình hoặc password: đừng lưu trữ nó trên local storage.

Có rất nhiều tutorial, video Youtube, và cả các lớp programming tại trường đại học và coding boot camp dạy cho các dev để store JWT trên local storgae như một cơ chế mặc định. Điều này rất không đúng. Nếu bạn nghe ai đó nói bạn như vậy, tránh xa ngay. Thế thì chẳng lẽ không dùng local storage nữa à? Vậy data user tui muốn lưu thì có cách nào thay thế không man? Mời anh em đọc bài sau.

TopDev

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

  Dùng gì để lưu trữ data thay thế local storage?

7 chiến thuật tuyển dụng IT thành công cho “Ngày hội việc làm IT”

Ngay-hoi-viec-lam-IT

“Theo báo cáo gần nhất của TopDev trong năm 2021 thị trường ngành IT thiếu khoảng 100.000 Developer. Ngày hội việc làm IT là một trong những xu hướng tuyển dụng đang được phổ biến rộng rãi về quy mô lẫn hình thức, một số sự kiện lớn luôn được “dân công nghệ” săn đón như Vietnam Mobile Day, Vietnam Web Summit, TechExpo,… diễn ra thường niên.”

Bạn có từng nghĩ sẽ trở thành nhà tuyển dụng hàng đầu tại ngày hội việc làm IT? Hãy nhớ rằng những ứng viên tài năng luôn nhận được nhiều lời đề nghị hấp dẫn, vì vậy bạn cần sẵn sàng vượt qua các đối thủ bằng mọi cách có thể. Cùng TopDev khám phá 7 chiến thuật tuyển dụng IT hàng đầu sau đây sẽ giúp công ty bạn trở thành đối thủ “nặng ký” với các công ty khác.

Chiến thuật số 1: Thu hút bằng nguồn năng lượng tích cực

Như lời đồn, nếu dân công nghệ khô khan thì ngày hội việc làm IT (Job Fair IT) cũng khó ướt át. Mục đích để tránh tình hình “chiến sự” trở nên căng thẳng anh/chị cần chuẩn bị cho mình những chiến thuật thu hút mang tính khác biệt. Là một HR “thâm niên” trong nghề anh/chị cũng biết rằng trong không gian tuyển dụng có phần ngột ngạt các ứng viên sẽ bị thu hút bởi những trò chơi mang tính trải nghiệm hấp dẫn hoặc một vài thử thách nhỏ nhưng không kém phần thú vị, và đặc biệt phải đánh đúng DNA của Developer với những trò chơi logic, trí tuệ. Với độ khó vừa đủ đô, năng lượng sảng khoái và tinh thần tích cực từ Booth của anh chị sẽ kích thích thêm máu nghề của ứng viên tìm đến và điều anh/chị nhận được đó là CV hoặc những thông tin liên quan mà anh/chị muốn khai thác.

Ngay-hoi-viec-lam-it

Chiến thuật số 2: Rò rỉ thông tin

Bạn có biết, chỉ có khoảng 15.9% ứng viên chủ động tìm kiếm việc, nhưng có đến gần 60% số còn lại là nằm vùng chờ cơ hội, chúng ta hay gọi là “passive candidate”. Nếu các nhà tuyển dụng biết cách tận dụng sức mạnh của các kênh cộng đồng lập trình để “feed” thông tin công ty của bạn tại ngày hội việc làm IT, thì tỷ lệ cao công ty của bạn sẽ được các ứng viên đặc biệt quan tâm và tìm hiểu.

Các trang tuyển dụng IT có thể sử dụng phương tiện truyền thông xã hội như Facebook, Google, LinkedIn, các trang cộng đồng IT như TopDev, Hội dev vui tính, Techtalk.vn, v,v,… và nguồn data ứng viên có sẵn (nếu có) sẽ giúp thông báo tốt về sự hiện diện của công ty bạn. Những thông tin cần thông báo không thể quên đó là vị trí của gian hàng, thời gian diễn ra sự kiện ngày hội việc làm IT, vị trí tuyển dụng và những hoạt động đặc biệt sẽ diễn ra vào ngày hội do chính công ty bạn thực hiện.

Chiến thuật số 3: “Công nghiệp hóa hiện đại hóa” khu vực booth theo chuẩn “Công ty ngành”

Để thể hiện màu sắc công nghệ của công ty mình, bạn có thể ứng dụng những công nghệ không quá phức tạp vào việc thu thập thông tin ứng viên. Ví dụ như thay vì ứng viên phải cầm bút điền thông tin, họ chỉ cần quét QR code và nhập thông tin trực tiếp trên điện thoại của mình, mọi theo tác sẽ trở nên chuyên nghiệp hơn.

Một cách tốt để hấp dẫn ứng viên đến và nộp CV là nhà tuyển dụng có thể sử dụng TV màn hình lớn, để trình chiếu các video về Employer Branding nhằm giúp cho việc giới thiệu công ty được trở nên sinh động hơn và hấp dẫn hơn là những chiếc flyer hay brochure truyền thống. Máy tính bảng sẽ là người bạn đồng hành sáng giá cho các hoạt động mini game hoặc giới thiệu ứng dụng của công ty bạn đến ứng viên tham gia sự kiện.

Ngay-hoi-viec-lam-it

Chiến thuật số 4: Bách phát bách trúng

Đừng tham gia bất kỳ ngày hội việc làm IT nào khi chưa xác định rõ vai trò tuyển dụng của bạn. Mục đích của anh chị không nhất định phải là tuyển dụng trực tiếp tại sự kiện (onsite recruitment), rất nhiều công ty đến với hội chợ việc làm chỉ với mục đích chính là quảng bá thương hiệu và giới thiệu sản phẩm của họ.

Cụ thể hơn ví dụ nếu anh, chị chỉ muốn làm Branding nhận diện thương hiệu thì hình ảnh và thông tin tiêu biểu của công ty phải được hiển thị càng nhiều càng tốt thông qua video, flyer, brochure giúp ứng viên có thể hình dung được phần nào hình ảnh của công ty. Ngoài ra, anh/chị cũng có thể tạo ra những bài viết chuyên về ngành IT trên các kênh cộng đồng sau đó gửi cho các ứng viên của mình thông qua thông tin mà họ cung cấp. Bạn có thể tham khảo thêm một số bài viết về ngành IT tại đây:

  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ệ!

  Lập trình đâu chỉ có những dòng code

Chiến thuật số 5: “Chọn mặt gửi vàng”

Brand name của công ty bạn sẽ được xây dựng thông qua các HR/Recruitment trực booth vì thế việc ứng cử nhân viên tuyển dụng cần lưu ý đáp ứng đủ các yêu cầu tối thiểu như sự năng động, cởi mở giúp thu hút ứng viên, độ nhạy bén cùng con mắt “nghề” đủ đánh giá khách quan những ứng viên tiêu biểu nhất tại sự kiện. Trong ngày hội việc làm IT nhà tuyển dụng sẽ tiếp xúc trực tiếp với hàng loạt ứng viên vì vậy những hành động giao tiếp nhỏ như nụ cười, sự hướng dẫn cụ thể và cách giúp đỡ nhiệt tình sẽ mang lại cái nhìn tốt từ các Developer.

Ngay-hoi-viec-lam-it

Chiến thuật số 6: “Cho đi và nhận lại”

Nếu anh/chị đã chuẩn bị một khởi đầu hoàn hảo như đã đề cập phía trên thì đừng để kết thúc tẻ nhạt. Sau khi hàng loạt hoạt động chính diễn ra hãy dành riêng một vài điều đặc biệt ở thời gian cuối ngày. Điều này có thể giữ chân được các ứng viên đến hết sự kiện hoặc cũng là lời cảm ơn cho những ứng viên đã đợi ứng tuyển. Anh/chị có thể xem xét về mặt kinh phí để đưa ra những lựa chọn tốt như sách về bí quyết hay trong nghề, áo thun có logo hoặc slogan của công ty, thẻ quà tặng,…nhưng chắc chắn rằng giá trị mang lại tên công ty bạn sẽ được nhắc lại ít nhất một lần nữa khi các ứng viên về đến nhà.

Chiến thuật số 7: Tận dụng điểm mạnh để mang lại chiến thắng

Nghiên cứu của TopDev cho biết có hơn 65% lập trình viên nói rằng mức lương là rất quan trọng với họ vì vậy trước khi tìm một công việc mới họ sẽ luôn tìm hiểu về Background của công ty trước khi nộp CV. Công ty của bạn đã đạt được những thành tựu tiêu biểu nào? Bạn đã từng được gọi tên trong bảng xếp hạng uy tín nào? Tầm nhìn và sứ mệnh của bạn cao cả ra sao? Hãy trưng bày và thể hiện thành tích của mình với các đổi thủ tuyển dụng khác và gây ấn tượng với ứng viên tiềm năng. Càng khẳng định là một thương hiệu uy tín trước các đối thủ thì bạn càng mang lại nhiều kỳ vọng cho ứng viên mong muốn được hợp tác. Tham khảo thêm 03 quy tắc vàng làm Employer Branding tại đây.

Ngày hội việc làm IT sẽ là cơ hội tốt đối với cả nhà tuyển dụng và ứng viên tiềm năng. Nhìn vào tổng thể nếu thực hiện tốt 7 chiến thuật “Xịn” như trên sẽ giúp bạn có một ngày hội việc làm IT thành công như mong đợi. Nhưng để nắm chắc cơ hội thành công bạn cần liệt kê chi tiết hơn và cụ thể hơn những việc phải làm trong từng hạng mục tại hội chợ. Kế hoạch càng bao quát bạn càng dễ dàng kiểm soát và loại bỏ những rủi ro không đáng có xảy ra. Cuối cùng chúc bạn thành công trong ngày hội việc làm IT sắp tới.

  • Có thể bạn quan tâm một sự kiện lớn trong ngành IT sắp diễn ra Vietnam Mobile Day 2019 | Liên hệ đặt Gian hàng tuyển dụng tại Vietnam Mobile Day 2019 – 10,000 lượt tham dự tại ĐÂY.

Máy học – Machine Learning và một vài hạn chế.

Máy học - Machine Learning và một vài hạn chế.

Mặc dù học máy (machine learning) chỉ bắt đầu phát triển vào những năm 1990, nhưng nó đã nhanh chóng trở thành một nhánh con phổ biến nhất và cũng có nhiều thành công nhất của AI, một xu thế được thúc đẩy bởi sự ra đời của phần cứng nhanh hơn và bộ dữ liệu lớn hơn.

Học máy liên quan chặt chẽ đến thống kê toán học, nhưng nó khác với thống kê ở nhiều khía cạnh quan trọng. Không giống như thống kê, học máy có xu hướng xử lý các bộ dữ liệu lớn, phức tạp (như bộ dữ liệu gồm hàng triệu hình ảnh, mỗi bộ gồm hàng chục nghìn pixel) mà phân tích thống kê cổ điển như phân tích Bayes trở nên không thực tế. Do vậy, học máy, và đặc biệt là học sâu, thiếu (có lẽ là rất thiếu) nền tảng toán học và có khuynh hướng kỹ thuật nhiều hơn.

Nó tuân thủ nguyên tắc thực dụng trong đó các ý tưởng thường được kiểm chứng bằng thực nghiệm hơn là được chứng minh một cách chặt trẽ. Trong cuộc sống hàng ngày, hầu hết chúng ta đã quen thuộc với việc mô tả các sự vật, hiện tượng của thế giới bên ngoài qua các khái niệm, các con số, các giác quan…gọi chung là các thuộc tính (feature). Những mô tả đó (tập các thuộc tính) được gọi là các biểu diễn (representation) của sự vật, hiện tượng.

Cùng một sự vật, hiện tượng cũng có nhiều cách biểu diến khác nhau, có biểu diễn rất sáng sủa và cũng có biểu diễn rất mờ mịt; có biểu diễn thuận lợi cho việc này nhưng không dễ xử lý ở công việc khác… Ví dụ chúng ta có thể gắn cho mỗi người một cái tên và một số định danh (duy nhất cho mỗi người). Với “tên”, chúng ta rất dễ nhớ nhưng cũng rất khó khăn khi cần phải xác định một con người cụ thể trong trường hợp trùng tên; ngược lại, “định danh” hoàn toàn xác định chính xác “ai là ai” nhưng gây phiền phức rất lơn khi bắt con người phải nhớ “định danh” của ai đó.

Các biểu diễn cũng có thể chuyển đổi cho nhau để phù hợp với từng nhu cầu cụ thể. Ví dụ chúng ta có thể biểu diễn một hàm số trên miền thời gian và cũng có thể biến đổi chúng về biểu diễn trên miền tần số bằng chuỗi fourier thông qua một ánh xạ mang tên biến đổi fourier. Ánh xạ này cho chúng ta nhìn thấy hình ảnh sáng sủa của một hàm “rối rắm” trong miền thời gian như tổng của các hàm tuần hoàn đơn giản.

Cách nhìn mới cho phép chúng ta áp dụng các công cụ phù hợp để tạo ra các ứng dụng có ý nghĩa hơn (ví dụ trong xử lý tín hiệu). Mục đích của học máy là tìm cách biến đổi các dữ liệu đầu vào thành các dữ liệu đầu ra có ý nghĩa hơn. Nói một cách khác, một mô hình học máy (machine learning model) sẽ ánh xạ dữ liệu từ một không gian biểu diễn vào một không gian biểu diễn khác mà trên đó chúng ta có thể hiểu rõ hơn về dữ liệu ban đầu. Chính vì vậy học máy cũng được gọi là là học biểu diễn (representation learning) hay học thuộc tính (feature learning). Một biểu diễn chính là một cách nhìn vào dữ liệu để biểu diễn hoặc mã hóa chúng.

Chẳng hạn, một hình ảnh màu có thể được mã hóa ở định dạng RGB (đỏ-lục-lam) hoặc ở định dạng HSV (hue-saturation-value): đây là hai cách biểu thị khác nhau của cùng một dữ liệu. Một số công việc có thể khó khăn với một biểu diễn nhưng có thể trở nên dễ dàng với một biểu diễn khác. Ví dụ, việc “chọn tất cả các pixel màu đỏ trong hình ảnh” đơn giản hơn ở định dạng RGB, trong khi đó “làm cho hình ảnh ít bão hòa hơn” lại đơn giản hơn ở định dạng HSV. Tất cả các mô hình học máy đều là việc tìm kiếm các biểu diễn thích hợp cho dữ liệu đầu vào của chúng – biến đổi dữ liệu của bộ dữ liệu làm cho một công việc nào đó trở nên dẽ dàng hơn, chẳng hạn như phân loại các đối tượng.

Quay trở lại ví dụ về phép biến đổi fourier. Phép biến đổi này là thành quả lao động có ý nghĩa vô cùng lớn đồng thời cũng chặt trẽ về mặt lý thuyết của những bộ óc siêu việt và được viết ra thành một công thức tường minh (tức là đã được thuật toán hóa). Tuy nhiên đời không như mơ. Trong thực tế thường không có sẵn (và thậm chí không tồn tại) những món ăn thịnh soạn chờ đợi chúng ta thưởng thức.

Với những trường hợp như vậy, học máy chính là người đấu bếp tạo ra các món ăn (các biểu diễn) từ nguyên liệu ban đầu là dữ liệu. Nói một cách hình tượng, học máy làm thay bộ não con người trong việc tìm kiếm các ánh xạ biến đổi biểu diễn ban đầu của dữ liệu thành dạng biểu diễn có ý nghĩa hơn, trừu tượng và bất biến hơn (ổn định hơn). Điều này cũng cắt nghĩa tại sao nền tảng toán học của học máy còn khá sơ khai. Trong vài năm gần đây, nhiều tác giả đang cố gắng xây dựng nền móng toán học cho học máy khi liên hệ bài toán học máy với các phương pháp giải bài toán ngược (Inverse Problem).

Từ cách nhìn như vậy chúng ta có thể phân biệt hai dạng học máy: học nông (shallow learning) và học sâu (deep learning).Thuật ngữ “deep learning” là cách nói đời thường và mang nhiều sắc thái tiếp thị đôi khi dẫn tới nhầm lẫn. Những người xa lạ với chuyên ngành học máy khi gặp thuật ngữ này thường nghĩ tới việc học một điều gì đó sâu sắc tới ngọn nguồn. Thực chất thuật ngữ “học sâu” ám chỉ việc áp dụng mốt cách tuần tự một chuỗi (lớn hơn 2 và trong thực tế ứng dụng có thể lên tới hàng ngàn) các anh xạ từ không gian biểu diễn này sang một không gian biểu diễn khác, mỗi kết quả (biểu diễn) của ánh xạ ở bước trước sẽ là đầu vào cho ánh xạ ở bước sau để tạo ra một biểu diễn mới mang nhiều ý nghĩa hơn.

Mỗi biểu diễn được goi là một tầng (layer). Chính vì thế học sâu cũng được gọi là “học biểu diễn phân tầng” (layered representations learning) hay “học biểu diễn phân cấp” “hierarchical representations learning”. Trong học sâu, việc học các biểu diễn phân tằng (layered representations) thông thường (hầu hết) được cài đặt dựa trên mô hình của mạng thần kinh (neural networks). Điều này cũng dẫn đến sự hiểu lầm rằng học sâu hoạt động như bộ não hoặc mô phỏng nó. Không giống mạng thần kinh được phát triển một phần nhờ vào cảm hứng từ sự hiểu biết của cúng ta về bộ não, học sâu chỉ là một framework toán học dành cho việc học các biểu diễn từ dữ liệu.

Trái với học sâu, các cách tiếp cận khác trong học máy biến đổi dữ liệu chỉ qua 1 hoặc 2 biểu diễn được gọi là học nông. Những đại diện tiêu biểu của học nông là Decision Trees, Naive Bayes, SVM (Support Vector Machine).

Sự khác biệt giữa học sâu và học nông không chỉ thể hiện về mặt kiến trúc mà còn ở những tính chất đặc trung mà chúng cần có khi áp dụng vào các bài toán khác nhau.
Nếu như với học nông việc xây dựng biểu diễn chủ yếu đặt lên vai con người thông qua “feature engineering” (hay “feature selection”) và đòi hỏi tri thức khá sâu về lĩnh vực ứng dụng thì trái lại học sâu có thể học được các biểu diễn trực tiếp từ dữ liệu mà cần rất ít các tri thức tiên nghiệm (như biến đổi và chuỗi fourier, Bayes…).

Có thể bạn quan tâm: Vị trí machine learning job in vietnam lương cao

Chính vì thế nó cũng được gọi bằng thuật ngữ thể hiện sát với bản chất hơn “feature learning”. Một nhiếp ảnh gia sử dụng công cụ biểu diễn phẳng là các pixel không phải lúc nào cũng ghi nhận được thần thái của nhân vật như bức ký họa nhân vật đó với những nét vẽ (feature) rất đơn giản cảm nhân được của một danh họa. Các “danh họa” như vậy đã được xây dựng trên cơ sở học sâu và có mặt khắp nơi trong các ứng dụng của Google, Facebook, Baidu… tạo nên lợi ích rất lớn.

Một đặc tính quý giá nhất của học sâu dưới quan điểm lý thuyết độ phức tạp tính toán là nó cung cấp cho chúng ta một biểu diễn compact của dữ liệu. Điều này cũng giống như phương pháp Phân tích thành phần chính (Principal Component Analysis – PCA) trong xử lý dữ liệu trên không gian tuyến tính nhẵm giảm số chiều của không gian dùng để biểu diễn dữ liệu – một phương pháp feature selection rất quen thuộc trong các cách tiếp cận học nông. Việc giảm số chiều của biểu diễn có ý nghĩa rất lớn để vượt qua “Lời nguyền của số chiều” (“The curse of dimensionality”) – cách nói ám chỉ hiện tượng bùng nổ tổ hợp trong lưu trữ và tính toán theo số chiều của biểu diễn.

Để thấy rõ hơn sức mạnh biểu diễn của kiến trúc sâu, chúng ta xem xét cài đặt một hàm logic n biến bằng mạch logic. Nếu sử dụng mạch logic nông (như dạng bảng chân lý) đòi hỏi 2**n phần tử tính toán – một việc không khả thi với n đủ lớn -; nhưng với kiến trúc sâu số phần tử tính toán cần thiết giảm đi đáng kể. Lý thuyết cũng chứng minh rằng luôn tồn tại những hàm có thể biểu diễn compact bằng một kiến trúc sâu k tầng nhưng lại phải biểu diễn bằng số lượng hàm mũ các phần tử tính toán khi dùng kiến trúc có k-1 tầng.

Học sâu cũng đồng thời tạo nên tiền đề cho việc biểu diễn phân tán (distributed representation), tính toán phân tán, tính toán song song…khi cho phép lưu trử, xử lý các thuộc tính học được trên nhiều thiết bị tính toán ở nhiều vị trí khác nhau về địa lý. Nó cũng tiềm ấn hy vọng cung cấp một công cụ mới cho việc phát triển transfer learning, multi-task learning – những nhu cầu cơ bản của AI – trong tương lai khi các thuộc tính, các biểu diễn trung gian học được từ một ứng dụng này có thể được sử dụng trong các ứng dụng khác.
Với những ưu điểm kể trên nhiều người lạc quan đã cho rằng “no more features engineering”. Trên thực tế, điều đó không hoàn toàn đúng. Luôn có sự đánh đổi giữa kiến thức tiên nghiệm, lượng dữ liệu đào tạo, khả năng khái quát hóa của các mô hình học được và khó khăn trong việc huấn luyện chúng.

Mặc dù học học máy, đặc biệt là học sâu, đã dẫn đến những thành tựu đáng chú ý trong những năm gần đây, nhưng kỳ vọng về những gì lĩnh vực sẽ có thể đạt được trong thập kỷ tới có xu hướng bị cường điệu hơn nhiều so với những gì có thể. Dưới đây liệt kê một vài rào cản lý thuyết mà học máy chưa thể vượt qua.

“Cho tôi dữ liệu, tôi sẽ sáng tạo lại thế giới”.Đó là sự cường điệu về học máy làm mê hoặc nhiều người và phản ánh sự chuyển hướng từ các phương pháp hướng mô hình trong AI (Model-driven AI, Symbolic AI) khi mục tiêu xây dựng mô hình cho các miền ứng dụng phức tạp tỏ ra không khả thi (ví dụ các hệ chuyên gia – expert systems) sang các phương pháp hướng dữ liệu (Data-driven AI).

Bảo toàn thông tin (conservation of information) là một thuật ngữ mới xuất hiện trong cuốn The Limits of Science xuất bản năm 1984. Trong cuốn sách ngắn gọn, xuất sắc này, tác giả Peter Medawar (nhà sinh vật học, chủ nhân giải Nobel) lý giải bản chất và những hạn chế của việc theo đuổi khoa học. Ba bài tiểu luận của ông liên quan đến một số câu hỏi lớn nhất mà con người biết đến: Khoa học có thể xác định sự tồn tại của Thiên Chúa không? Có một “phương pháp khoa học” nào mà tất cả các bí mật của vũ trụ có thể được khám phá? Peter Medawar đã chỉ ra rằng các hệ thống toán học và tính toán bị giới hạn trong việc tạo ra các hệ quả logic từ một tập hợp tiên đề (hoặc điểm bắt đầu), và do đó không thể tạo ra thông tin mới (mọi hệ quả logic đã tiềm ẩn ngay trong tập các tiên đề) và gọi đó là Định luật bảo toàn thông tin “Law of Conservation of Information”. Định luật này được chúng minh một cách tường minh trong nhiều lĩnh vực AI khác nhau (vd. Phan Đình Diệu, Nguyễn Minh Hải trong logic xác xuất).

Để hiểu ảnh hưởng của Định luật bảo toàn thông tin tới học máy, chúng ta cần thấy bản chất của học máy là tìm ra một biểu diễn tốt nhất giải thích cho mối quan hệ giữa các dữ liệu đầu vào với các dữ liệu đầu ra được kỳ vọng. Đó là một bài toán tối ưu với các ràng buộc chính là dữ liệu. Sau khi hệ thống học máy đã được huấn luyện chúng ta nhận được một mô hình (biểu diễn) giải thích tốt nhất cho dữ liệu. Khi bổ xung một dữ liệu mới tức là chúng ta thêm ràng buộc vào bài toán tối ưu cũ. Ràng buộc mới này có thể “tương thích” với các ràng buộc cũ, hay nói cách khác nó không làm thay đổi miền ràng buộc của bài toán, ta vẫn nhận được biểu diễn cũ. Điều đó có nghĩa dữ liệu mới đã được hệ thống “nhìn thấy” từ góc nhìn của mình (biểu diễn học được). Trường hợp ngược lại, ràng buộc bổ xung sẽ thay đổi miền ràng buộc và vì vậy để giải thích nó, hệ thống phải tìm kiếm một biểu diễn mới – nghiệm tối ưu của bài toán có thêm ràng buộc bổ xung. Một cách hình tượng, biểu diễn cũ không phù hợp để giải thích dữ liệu mới, tức là không “nhìn thấy” dữ liệu mới. Đây cũng là hạn chế chính khiến các hệ thống học máy không thể “ngoại suy” ra những gì chưa được học.

Để khắc phục nhược điểm này của các phương pháp hướng dữ liệu, các nhà nghiên cứu thường đề xuất kết hợp nó với các phương pháp hướng mô hình. “No Free Lunch Theorem” và “Ugly Ducking Theorem”. Đây là một “nút thắt cổ chai” khi cần trả lời câu hỏi “Thuật toán nào là tốt nhất cho học máy?”.

Để đánh giá hiệu quả của thuật toán chúng ta sử dụng tập dữ liệu kiểm tra (testing set).
Trong trường hợp tập dữ liệu kiểm tra hoàn toàn độc lập với tập dữ liệu huấn luyện (training set) chúng ta bị khống chế bới Định luật bảo toàn thông tin và vì vậy mọi thuật toán đều tồi tệ. Khi tập huấn luyện rất lớn và hai tập hợp chồng lấn lên nhau, các hệ thống học máy trở thành những học trò “học vẹt” để trả thi (kiểm tra mức độ thuộc bài) và không có khả năng trừu tượng hóa.

Định lý “No Free Lunch” chỉ ra rằng không tồn tại một thuật toán vượt trội thuật toán khác trong mọi tập dữ liệu có được. Hay nói cách khác, sai số trung bình trên mọi tập dữ liệu là như nhau đối với mọi thuật toán. Một thuật toán “tốt hơn” trong ứng dụng này có thể “tồi tệ” đối với ứng dụng khác. Điều này cản trở lớn tới việc scalling up các thuật toán học máy.
Tương tụ như “No Free Lunch Theorem”, định lý “Ugly Ducking Theorem” cũng khẳng định rằng không có tập thuộc tính (biểu diến) nào là “tốt nhất” nếu không xét đến các giả thiết bổ xung. Điều này cũng góp phần phủ định tư duy “no more features engineering” đã nhắc tới ở trên.

Để thay lời kết của bài này tôi xin trích dẫn ý kiến của Margaretta Colangelo – người có hơn 30 năm kinh nghiệm trong công nghệ phần mềm tại thung lũng Silicon với hơn 60 công bố giá trị về Deep Tech, AI và y sinh học hiện đại đồng thời tham gia điều hành nhiều tổ chức nghiên cứu trên thế giới – khi bà nhắc chúng ta chớ nên quên lãng giá trị của dữ liệu nhỏ cũng như khả năng trừu tượng hóa kỳ diệu của con người so với máy móc và kêu gọi nghiên cứu phát triển các phương pháp AI đòi hỏi ít dữ liệu hơn:

“Tất cả mọi thứ đều là dữ liệu nhỏ trước khi chúng ta có dữ liệu lớn. Những khám phá khoa học của thế kỷ 19 và 20 đều được thực hiện bằng cách sử dụng dữ liệu nhỏ. Darwin đã sử dụng dữ liệu nhỏ. Các nhà vật lý đã thực hiện tất cả các tính toán bằng tay, do đó họ chỉ sử dụng dữ liệu nhỏ. Tuy nhiên, họ đã khám phá ra những quy luật đẹp nhất và cơ bản nhất của tự nhiên. Hơn nữa, họ nén chúng thành các quy tắc đơn giản dưới dạng các phương trình thanh lịch. Einstein là nhà vô địch điều này với E = mc². Mặc dù người ta đã ước tính rằng có lẽ 60% đến 65% trong số 100 phát minh lớn nhất của thời đại chúng ta thực sự dựa trên dữ liệu nhỏ, các phát triển AI hiện tại dường như quá tập trung vào dữ liệu lớn mà quên đi giá trị của việc quan sát các mẫu nhỏ”

Có thể bạn quan tâm: Vị trí machine learning job in vietnam lương cao

TopDev via Minh Hai Nguyen

  Top 20 API trong AI và Machine Learning bạn nên biết
  Tổng hợp tài liệu tự học lập trình Python "from Zero to Hero"

5 ví dụ chứng minh dân coder là những anh chàng vui tính nhất thế giới

Những dòng code khô khan vẫn có thể ẩn chứa những trò đùa mỉa mai rất thâm sâu của giới lập trình.

Dịch vụ lưu trữ, chia sẻ code GitHub có tới 35 triệu dự án mã nguồn mở. Rất nhiều trong số đó là các gói sản phẩm phức tạp được cộng đồng lập trình viên và các doanh nghiệp trên thế giới tin dùng. Một số khác lại là các thư viện có mục đích đơn giản, dễ hiểu để tiết kiệm thời gian cho các coder khác.

Một số đơn giản chỉ là những trò đùa.

Những câu đùa dựa trên các dòng code có lẽ sẽ là quá khô khan với phần đông độc giả công nghệ. Đừng lo lắng, chúng tôi sẽ giải thích cho bạn về một số dự án (project) vui nhộn nhất trên GitHub.

1. TrumpScript: Một ngôn ngữ lập trình dựa trên tấm gương Donald Trump

Đây là tác phẩm do 4 sinh viên Đại học Rice tạo ra trong một cuộc thi hack. Theo mô tả, các tác giả của TrumpScript “phát hiện ra rằng không có ngôn ngữ nào trong số các ngôn ngữ lập trình hiện tại sẽ nhận được sự tán thưởng từ mái tóc vàng của Trump”.Với khoảng 1000 dòng code, TrumpScript là một “giả ngôn ngữ” với tính năng khá hạn chế dù vẫn có thể được sử dụng để làm một số tác vụ cơ bản. Sau đây là một số tính năng của TrumpScript:

– TrumpScript chỉ cho phép sử dụng các con số lớn hơn 1 triệu, vì “các thứ nhỏ nhặt không có giá trị”. Khi sử dụng các con số giá trị dưới 1 triệu, coder sẽ nhận được thông báo lỗi có nội dung là một tuyên bố nổi tiếng từ ngài Trump: “Tôi rất giàu. Một phần vẻ đẹp của tôi là tôi rất giàu“.

– TrumpScript không cho phép sử dụng phân số hoặc số thập phân mà chỉ chấp nhận các số nguyên, vì “Nước Mỹ sẽ không bao giờ làm thứ gì đó nửa chừng“.

– Khi chạy trên TrumpScript, bạn sẽ nhận được một thông báo lỗi khác từ ngài Trump: “Windows? Vấn đề lớn nhất của đất nước này là PC“.

– Tất cả mọi ứng dụng viết bằng TrumpScript phải kết thúc bằng câu “Nước Mỹ thật vĩ đại“.

Dĩ nhiên là với các tính năng này, TrumpScript sẽ là một ngôn ngữ gần như vô dụng. Trong phần lớn các trường hợp TrumpScript cũng không hiện thông báo lỗi, vì theo các tác giả, “Trump không thích nói về thất bại của mình”.

2. Is-thirteen: Kiểm tra xem một số nào đó có phải là 13 hay không

Bạn có thể kiểm tra xem một số nào đó có phải là số 13 hay không bằng cách viết ra những đoạn code tương tự như dưới đây:

Kể cả bạn không biết gì về code thì bạn vẫn có thể hiểu được 4 dòng code quá ư đơn giản này. Đó chính là trò đùa thâm sâu của các tác giả is-thirteen: gói phần mềm này mất tới hàng trăm dòng code chỉ để thực hiện tác vụ của 4 dòng code vô dụng. is-thirteen cũng có tới 92 người tham gia và thậm chí có cả chính sách chỉnh sửa/đóng góp code.

Is-thirteen được tạo ra để mỉa mai các gói phần mềm có công dụng quá đơn giản và thừa thãi. Ví dụ, một project trong đời thực sẽ kiểm tra xem liệu một số có lớn hơn 0 hay không. Triết lý chế tạo các gói phần mềm quá vụn vặt, có tính năng quá giới hạn như thế này đã từng bị chỉ trích kịch liệt vào năm ngoái, khi một hacker mũ trắng xóa đi 11 dòng code được anh này đóng góp cho javaScript.

Các lập trình viên khác cũng hưởng ứng trò đùa này rất tích cực. Trên GitHub, is-thirteen có hẳn một mục thảo luận với những đầu mục như:

– Thêm tính năng hỗ trợ XIII

– Bỏ hỗ trợ cho Thứ sáu Ngày 13

– Thêm tính năng hỗ trợ bộ phim “Thirteen”.

– Thành lập Ủy ban Chiến lược Công nghệ.

– Hỗ trợ máy học.

Nếu bạn muốn sử dụng (và phụ thuộc) vào các gói mã nguồn như is-thirteen, hãy lưu ý tới cảnh báo của các tác giả: “Hãy đọc mã nguồn vì chúng tôi thay đổi rất nhanh và làm hỏng nhiều thứ”.

  Học lập trình thế nào để không thất nghiệp?

3. ComcastifyJS: Giảm tốc độ tải ảnh

Bất bình trước chất lượng dịch vụ và chăm sóc khách hàng ngày càng đi xuống của nhà mạng ComCast, các lập trình viên làm việc cho tờ báo biếm họa The Onion đã tạo ra giải pháp ComcastifyJS để giải quyết vấn đề “Đôi khi ảnh web load quá nhanh”.

“Với tất cả những cái thứ Internet này, đôi khi bạn muốn tận hưởng cảm giác giật gân của những trang web ì ạch. Hãy cho phép người dùng của bạn được tận hưởng một phần của tương lai bằng cách tải trang web thật chậm nhờ có ComcastifyJS”.

Trang demo của ComcastifyJS sẽ trình bày tính năng đã quá quen thuộc với người dùng Comcast: ảnh tải siêu chậm. Một lập trình viên vui tính đề xuất Comcastify tạo ra một gói dịch vụ trả phí cao cấp để người dùng có thể tận hưởng trải nghiệm tải ảnh… chậm hơn nữa. Một người khác biến Comcastify thành extension cho Chrome.

Nếu có thời gian, bạn có thể ghé qua trang GitHub của The Onion để tìm hiểu thêm về các project buồn cười khác như fartscroll.js, một plugin web có khả năng tạo ra tiếng “xì hơi” mỗi lần bạn cuộn trang trên web.

4. Thay thế Lorem Ipsum bằng lyrics của Justin Bieber.

Dù có code hay không thì chắc hẳn bạn cũng đã từng nhìn thấy cụm “Lorem Ipsum” khi đi tìm biểu mẫu web, blog hay Word, Excel, PowerPoint. “Lorem Ipsum” thực chất là một đoạn triết học khó hiểu viết bằng tiếng Latin được sử dụng trong nhiều thế kỷ, giúp cho các nhà thiết kế có thể tạo biểu mẫu dàn chữmà không cần lo lắng người dùng sẽ bị phân tâm như khi đọc nội dung có nghĩa.

Nhưng tại sao lại trình diễn giao diện tuyệt đẹp của bạn bằng một cụm chữ Latin cổ. Trong mục awesome-ipsum trên GitHub, bạn có thể sử dụng rất nhiều cụm từ (có vẻ) vô nghĩa khác thay thế, ví dụ như:

– Pasta Ipsum: Bao gồm rất nhiều loại Mỳ Ý khác nhau. Có tùy chọn thêm từ… chửi thề một cách ngẫu nhiên.

– Hipster Ipsum: Thêm vào những từ ưa thích của giới hipster.

– Corporate Ipsum: Thêm vào những cụm từ “đao to búa lớn” của giới lãnh đạo doanh nghiệp.

– Justin Bieber Ipsum: Thêm vào những câu nói kinh điển từ Justin Bieber.

5. Những thư viện JavaScript hoàn toàn vô dụng

Chịu trách nhiệm quản lý các tác vụ “động” (ví dụ như tải thêm các câu status cũ khi bạn cuộn tới cuối trang Facebook thay vì tải lại toàn bộ), JavaScript là một trong 3 phần quan trọng nhất của trải nghiệm web. Và cũng giống như các ngôn ngữ lập trình khác, JavaScript sở hữu nhiều thư viện để mỗi lập trình viên có thể tái sử dụng các tính năng đã được một lập trình viên khác tạo ra.

Nhưng vấn đề với các thư viện code là ở chỗ đôi khi chúng không nên tồn tại: rất nhiều người đã và đang tạo ra những thư viện nhằm cung cấp các tính năng đã có sẵn từ các bộ thư viện tiêu chuẩn. Để mỉa mai tình trạng này, một số coder đã tạo ra các thư viện JS vui nhộn như:

– vapor.js: thư viện không có một dòng code nào, được mô tả là “Thư viện JavaScript Nhỏ nhất và Nhanh nhất”.

– semicolon.js: “Phiên bản an toàn và ổn định hơn của vapor.js”. Nội dung của semicolon.js là một dấu chấm phẩy (ký tự dùng để kết thúc câu lệnh).

– vanilla.js: biên dịch JavaScript thành… JavaScript. Thư viện vô dụng tuyệt đối này đã từng khiến một lập trình viên kém may mắn mắc lừa và lên Stack Overflow đặt câu hỏi: “Tại sao vanilla.js lại được coi là một framework?”.

TopDev Via GenK

  Cách mà một dòng code đã thay đổi cuộc đời tôi!
  Lập trình đâu chỉ có những dòng code

Flutter Vs. React Native: So sánh chi tiết về những điểm tương đồng và ưu việt

flutter-vs-react-native-so-sanh-chi-tiet-ve-nhung-diem-tuong-dong-va-uu-viet

Tác giả: SPEC INDIA

Cách đây vài ngày, Google đã cho ra mắt Google Hummingbird, một platform phát triển ứng dụng mới của Google và phát hành phiên bản ổn định hơn cho Flutter, một SDK phát triển mobile app nguồn mở của Google.

Những điểm đáng chú ý của Flutter

Flutter là SDK nguồn mở của Google dùng để tạo các ứng dụng chất lượng cao cho Android và iOS bằng cách sử dụng một codebase.

Ngày 4 tháng 12, Google đã tổ chức sự kiện Flutter Live để chào mừng SDK mobile mới, Flutter và phiên bản ổn định đầu tiên của nó.

Họ cũng công bố project Google Hummingbird cho phép các developer chỉ cần build một ứng dụng một lần và sau đó có thể chạy nó ở bất kỳ nơi nào.

Thời gian gần đây, sự phổ biến của các mobile app dường như không có dấu hiệu giảm nhiệt. Mỗi ngày đều có rất nhiều app được develop và deploy trên các app store. Không chỉ native app mà cross-platform app và hybrid app cũng được các app developer và chuyên gia kinh doanh tập trung phát triển.

Bên cạnh các ưu và nhược điểm của mình thì mỗi framework đều có kiến trúc độc đáo để build app. Trong khi các native app cung cấp trải nghiệm người dùng vượt trội, thì cross-platform và hybrid được thiết kế để tiết kiệm thời gian và chi phí cũng như cung cấp time-to-market nhanh hơn.

Trong bài viết này, chúng ta sẽ thảo luận về sự tương đồng và khác biệt giữa hai tool phát triển cross-platform app là React Native và Flutter.

Có thể bạn quan tâm

  Flutter khác biệt gì so với những công nghệ đương thời?

Flutter đang dần được nhiều người ưa thích: Tại sao bạn nên chú ý đến nó?

Như đã được đề cập ở trên, SDK nguồn mở và miễn phí này được hỗ trợ bởi Google và được dùng để phát triển các ứng dụng cho Android và iOS.

Nó dựa trên ngôn ngữ Dart và cung cấp thư viện đồ họa hấp dẫn. Các feature chính của platform này là:

  • SDK cho platform chính xác và chi tiết
  • Các widget được thiết kế chi tiết, chính xác
  • Môi trường hoàn toàn tùy chỉnh
  • Native Performance
  • Feature Stateful Hot Reload để phát triển app nhanh hơn

Tháng 05/2017, Google giới thiệu Flutter tới cộng đồng, sau đó vào ngày 04/12/2018, phiên bản ổn định hơn của Flutter được phát hành. Bên cạnh đó, Flutter có thể được sử dụng để tạo các ứng dụng cho Google Fuchsia, một hệ điều hành dựa trên khả năng của Google.

Feature Stateful Hot Reload của Flutter: Các developer sẽ thích

Feature này cho phép các developer build các UI một cách nhanh chóng và dễ dàng hơn. Nó đưa code được update vào Dart Virtual Machine, cho phép phản ánh nhanh các thay đổi và fix bug.

Ai đang sử dụng Flutter?

  • Alibaba, gã khổng lồ eCommerce lớn nhất thế giới, đã sử dụng Flutter để tạo ra trải nghiệm tuyệt vời trên app Xianyu của họ
  • Reflecting, một app tạp chí hấp dẫn cũng được build với Flutter
  • Hamilton Musical, app chính thức của Broadway Music được tạo bởi Flutter
  • Google Greentea, app quản lý khách hàng nội bộ sử dụng Flutter trong môi trường phát triển của nó
  • JD Finance, một công ty FinTech hàng đầu sử dụng Flutter
  • App Abbey Road Studios được build với Flutter

Mặt khác, React Native cũng đang phát triển mạnh mẽ với hiệu suất ứng dụng vượt trội trên cả hai platform, iOS và Android. Tính tới thời điểm hiện tại, React Native là một trong những project nguồn mở hàng đầu trên GitHub.

Facebook chủ yếu sử dụng React Native cho những project quan trọng của mình.

Oculus Go VR Headset cùng với mobile app đi cùng cũng được build hoàn chỉnh với React Native.

Facebook và React Native Community đang cải tiến framework tái kiến trúc quy mô lớn để làm cho nó linh hoạt và tốt hơn.

Mặc dù Flutter và React Native là hai framework khác nhau nhưng chúng cũng có một số điểm chung.

Điểm tương đồng giữa Flutter và React Native

Cả hai đều được thiết kế để phát triển cross-platform app

React Native và Flutter đều cung cấp hiệu suất ứng dụng vượt trội, nhanh chóng và chất lượng cao trên nhiều platform bao gồm Android, iOS và UWP.

(Lưu ý: Flutter hỗ trợ platform Android và iOS)

Cả hai framework được hỗ trợ bởi các cộng đồng công nghệ khổng lồ

React Native được cung cấp bởi Facebook còn Flutter là SDK nguồn mở của Google để phát triển mobile app. Cả hai đều có cộng đồng các developer mạnh mẽ

Nguồn mở, miễn phí và nhanh chóng

React Native và Flutter là các SDK nguồn mở và miễn phí cho phép các developer tạo ra các app tuyệt vời một cách nhanh chóng dựa vào native performance của chúng.

Documentation chi tiết và luôn được cập nhật

Các cộng đồng của cả hai framework này luôn nỗ lực hết sức để liên tục cập nhập documentation mới nhất với các tài liệu tham khảo API và tài nguyên toàn diện.

Hỗ trợ UI và Native Experience tuyệt vời

React Native sử dụng các yếu tố xây dựng UI cơ bản trong Android / iOS để mang lại native experience. Flutter cũng sử dụng các widget để cung cấp native experience đáng chú ý trên platform Android và iOS.

Hot reloading và sửa đổi nhanh

React Native hỗ trợ “Hot reloading” cho phép đồng thời chạy code mới và giữ trạng thái ứng dụng, thay vì phải recompile. Tính năng này làm cho sự phát triển nhanh hơn, tức thì và hiệu quả.

Flutter cũng không hề kém cạnh. “Stateful Hot Reloading” của nó hỗ trợ phản ánh các thay đổi ngay lập tức mà không cần restart hoặc trong trường hợp mất trạng thái ứng dụng.

Chúng ta đã điểm qua sự giống nhau của React Native và Flutter, bây giờ hãy cùng xem qua những khác biệt của chúng trong process, flow, và feature.

Tham khảo việc làm React Native lương cao cho bạn

Flutter vs. React Native: Khám phá sự khác biệt

Điểm khác biệt chính nằm ở ngôn ngữ lập trình

Flutter sử dụng Dart.

React Native cho phép bạn phát triển một app bằng JavaScript. Tôi không cần giới thiệu thêm gì nữa về Javascript vì nó đã quá phổ biến bởi code dành cho mobile, web, hoặc server-specific rồi.

Mặt khác, Dart khá mới đối với các developer. Nó sử dụng các feature hiện đại của một số ngôn ngữ để code các native app đẹp. Trong khi đó Javascript không có bất kỳ component và styling nào, cũng như không có sự tách biệt của các template, style và data. Dart rất dễ sử dụng cho những người có kinh nghiệm phát triển app bằng các ngôn ngữ OOP như C ++ và Java.

Tính ổn định và tính linh hoạt

Xét về tính ổn định, không có sự khác biệt đáng kể nào vì cả hai đều được quản lý bởi các cộng đồng công nghệ mạnh mẽ.

Xét về tính linh hoạt và tùy biến, Flutter cung cấp một set widget tùy chỉnh phong phú để build những trải nghiệm hấp dẫn. Mặt khác, React Native cung cấp trải nghiệm người dùng liền mạch thông qua giao tiếp trực tiếp với các native platform.

Flutter đang cố gắng để có chỗ đứng trên thị trường do phát hành bản ổn định gần đây, còn React Native vẫn đang tận hưởng vị trí đầu tiên trong danh sách các tool phát triển ứng dụng cross-platform trên thị trường.

Thời gian phát triển của một app

Các công ty tận dụng cross-platform để tiết kiệm thời gian code app bằng nhiều ngôn ngữ.

Bên cạnh đó, cả React Native và Flutter đều cam kết cung cấp time-to-market cho app nhanh hơn. Bạn có thể sử dụng library của bên thứ ba và các component sẵn-sàng-để-sử-dụng để build một app. Một loạt các widget tùy chỉnh và chất lượng cao giúp build một app trong thời gian ngắn hơn so với phát triển native app.

Hiệu suất: Ai thắng?

Flutter chắc chắn chiến thắng ở phần này nhờ vào sự đơn giản của nó.

Tuy nhiên, React Native lại nổi tiếng với việc truyền tải trải nghiệm người dùng tuyệt vời trên cả hai platform. Flutter có thêm lợi thế là sử dụng lại code trong khi React Native ít phù hợp hơn do kiến ​​trúc của nó. Một lợi thế khác của Flutter khi so với layer JavaScript là giúp giao tiếp với các native component dễ dàng hơn.

Cả hai đều là sự lựa chọn đáng tin cậy nhưng Flutter có lợi thế cạnh tranh hơn vì tính đơn giản và Dart platform của nó.

IDE và dễ code

Flutter còn khá mới và được hỗ trợ bởi Android Studio / IntelliJ, Visual Studio Code hiện tại. Còn React Native đã có 3 năm tuổi kể từ khi ra mắt, nó được hỗ trợ tốt bởi hầu hết các IDE hàng đầu.

React Native cung cấp curve dễ học do sử dụng JavaScript. Flutter thì đòi hỏi phải học Dart để tạo ra một app. Tuy nhiên, Dart là một điểm cộng cho các C ++ và Java developer.

Flutter vs React Native – So sánh nhanh

Cả hai framework đều có những ưu và nhược điểm riêng của mình.

Hãy cùng khám phá thêm một số ưu điểm và hạn chế của Flutter

Ưu điểm

  • Documentation sạch sẽ, rõ ràng và trơn tru
  • Sự hỗ trợ từ Google và một cộng đồng mạnh mẽ
  • Tốc độ phát triển nhanh hơn
  • Native app performance tuyệt vời
  • Một loạt các UI component dễ biểu đạt và linh hoạt
  • Stateful Hot Reloading cho sự thực hiện thay đổi nhanh hơn
  • Khả năng truy cập native SDK và các feature của chúng
  • Cách tiếp cận coding hiện đại, nâng cao và linh hoạt
  • API hỗ trợ các hiệu ứng, animation và gesture 2D

Nhược điểm

  • Mặc dù Dart là một ngôn ngữ lập trình dễ sử dụng, nhưng Flutter yêu cầu phải học Dart
  • Khó khăn trong việc styling cho các component
  • Quản lý vòng đời phức tạp hơn so với React Native
  • Vì chỉ mới ra mắt được một năm , nó không trưởng thành như React Native

Chúng ta không thể xác định được cái nào là tốt nhất vì phụ thuộc vào nhiều yếu tố như requirement, budget, feature và các developer. Tuy nhiên, bạn có thể thích cái nào cũng được và dùng cho project phát triển app cross-platform tiếp theo vì cả 2 đều là tool nhất quán, đơn giản và tốt

Kết luận

Chọn Flutter nếu bạn muốn cross-platform, UI hấp dẫn, native performance tuyệt vời, time-to-market nhanh hơn và tận dụng lợi thế cạnh tranh của Dart trong môi trường lập trình của bạn.

Chọn React Native nếu bạn muốn tận dụng sự hỗ trợ từ cộng đồng mạnh mẽ và trưởng thành hơn, native app performance và sự phổ biến của JavaScript trong việc phát triển các cross-platform app.

Hy vọng bạn thích đọc bài viết này.

  Biết chọn gì đây? Flutter, React Native hay Xamarin?

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

Hướng dẫn bắt đầu GraphQL với Node.js (Phần 1)

Hướng dẫn bắt đầu GraphQL với Node.js (Phần 1)

Hầu hết chúng ta có thể rất quen thuộc với việc tạo REST API. GraphQL là một query language được tạo ra bởi Facebook với mục đích xây dựng các ứng dụng cho khách hàng dựa trên cú pháp trực quan và linh hoạt để mô tả các yêu cầu và tương tác dữ liệu. GraphQL được thiết kế để giải quyết một trong những nhược điểm lớn nhất của các API giống như REST. Một dịch vụ GraphQL được tạo ra bằng cách định nghĩa các loại và các trường, sau đó cung cấp các chức năng cho mỗi trường trên mỗi loại.

Một khi dịch vụ GraphQL đang chạy (thường là tại một URL trên web), nó có thể được gửi các truy vấn GraphQL để xác nhận và thực hiện. Truy vấn đã nhận được kiểm tra lần đầu để đảm bảo nó chỉ đề cập đến các loại và trường được xác định, sau đó chạy các hàm để tạo ra kết quả.

#Tính năng của GraphQL 

  • Hierarchical – các truy vấn chính xác như dữ liệu mà chúng trả về.
  • Các truy vấn do khách hàng chỉ định – khách hàng có quyền tự do quyết định lấy gì từ máy chủ,
  • Strongly typed – bạn có thể xác thực một truy vấn theo cú pháp và trong hệ thống kiểu GraphQL trước khi thi hành. Điều này cũng giúp thúc đẩy các công cụ mạnh mẽ để cải thiện trải nghiệm phát triển, như GraphiQL.
  • Introspective – bạn có thể truy vấn hệ thống sử dụng cú pháp GraphQL. Điều này rất tốt cho việc phân tích cú pháp dữ liệu đến vào các giao diện strongly-typed và không phải  phân tích cú pháp và chuyển đổi bằng tay JSON thành các đối tượng.

#Tại sao phải dùng GraphQL

Một trong những thách thức chính đối với các REST call truyền thống là không có khả năng khách hàng yêu cầu một bộ dữ liệu tùy chỉnh (giới hạn hoặc mở rộng). Trong hầu hết các trường hợp, một khi khách hàng yêu cầu thông tin từ máy chủ, nó sẽ nhận tất cả hoặc không có bất kì trường nào.

Một khó khăn khác là làm việc và duy trì nhiều điểm cuối. Khi nền tảng phát triển, do đó số lượng sẽ tăng lên. Vì vậy, khách hàng thường cần phải yêu cầu dữ liệu từ các endpoint khác nhau. GraphQL API được tổ chức theo các loại và trường, chứ không phải endpoint. Bạn có thể truy cập đầy đủ các tính năng của dữ liệu từ một điểm cuối.

Khi xây dựng một máy chủ GraphQL, chỉ cần có một URL cho tất cả dữ liệu tìm nạp và biến đổi. Do đó, khách hàng có thể yêu cầu một bộ dữ liệu bằng cách gửi một chuỗi truy vấn, mô tả những gì họ muốn, đến một máy chủ.

#Cài đặt

Chúng ta sẽ bắt đầu với một cấu trúc tệp đơn giản và một đoạn code mẫu đơn giản. Để làm theo hướng dẫn này, bạn tạo một thư mục GraphQLvà bên trong thư mục khởi tạo một dự án npm sử dụng npm init -y. Sau đó, tạo tệp server.js mà sẽ là tệp chính. Đối với code hoàn chỉnh, sao chép bằng cách sử dụng các hướng dẫn trong kho github đính kèm.

Chúng tôi sẽ cài đặt các package cần thiết.

npm i graphql express express-graphql -S   #Install required packages

Chúng tôi sẽ thiết lập một máy chủ đơn giản dùng Express và Express-Graphql, một máy chủ trung gian HTTP. Đừng lo lắng về ý nghĩa của code bởi vì chúng ta sẽ khám phá từng bước một trong các bước tiếp theo khi thêm nội dung khác.

var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

// Initialize a GraphQL schema
var schema = buildSchema(`
  type Query {
    hello: String
  }
`);

// Root resolver
var root = { 
  hello: () => 'Hello world!'
};

// Create an express server and a GraphQL endpoint
var app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,  // Must be provided
  rootValue: root,
  graphiql: true,  // Enable GraphiQL when server endpoint is accessed in browser
}));
app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));

#Concepts

Cho đến nay chúng ta đã khám phá một số tính năng và lợi thế của GraphQL. Chúng ta sẽ nghiên cứu các thuật ngữ khác nhau và triển khai một số tính năng kỹ thuật trong GraphQL. Chúng tôi sẽ sử dụng một máy chủ Express đơn giản để phân tích các feature.

  Hướng dẫn bắt đầu GraphQL với Node.js (Phần 1)
Xây dựng forum bằng GraphQL, React, Apollo và Prisma – Part 1 :Application Introduction and Technologies Overview”]

Schema

Trong GraphQL, Schema quản lý các truy vấn và đột biến, xác định những gì được phép thực hiện trong máy chủ GraphQL. Một giản đồ định nghĩa một hệ thống kiểu của GraphQL API. Nó mô tả tập hợp các dữ liệu có thể (object, field, relationship, mọi thứ) mà khách hàng có thể truy cập. Cuộc gọi từ máy khách được xác nhận và thực hiện đối với lược đồ. Một khách hàng có thể tìm thông tin về schema thông qua quá trình phân tích. Một schema nằm trên máy chủ GraphQL API.

Ngôn ngữ GraphQL Interface Definition (IDL) hoặc Ngôn ngữ Schema Definition (SDL) là cách ngắn gọn nhất để chỉ định GraphQL Schema. Các component cơ bản nhất của GraphQL schema là các loại đối tượng, chỉ đại diện cho một loại đối tượng mà bạn có thể lấy ra từ dịch vụ của mình và những trường nào nó có. Trong ngôn ngữ GraphQL schema, chúng ta có thể đại diện cho nó như sau:

type User {
  id: ID!
  name: String!
  age: Int
}

Trong đoạn trên, chúng ta đang sử dụng hàm buildSchema để xây dựng một đối tượng Schema từ ngôn ngữ GraphQL schema.

var schema = buildSchema(`
  type Query {
    hello: String
  }
`);

Xây dựng các Type

Bên trong buildSchema, chúng ta có thể định nghĩa các kiểu khác nhau. Bạn có thể nhận thấy trong hầu hết các trường hợp kiểu Query {...} và type Mutation {...}type Query {...} là một đối tượng đang nắm giữ các chức năng sẽ được ánh xạ tới các truy vấn GraphQL; được sử dụng để lấy dữ liệu (tương đương với GET trong REST) trong khi type Mutation {...} chứa các chức năng sẽ được ánh xạ tới mutaions; được sử dụng để tạo, cập nhật hoặc xóa dữ liệu (tương đương với POST, UPDATE và DELETE trong REST).

Chúng tôi sẽ làm cho chema phức tạp hơn bằng cách thêm một số loại hợp lý. Ví dụ: chúng tôi muốn trả lại user và một mảng users có các thuộc tính   idname ,age và gender .

var schema = buildSchema(`
  type Query {
    user(id: Int!): Person
    users(gender: String): [Person]
  },
  type Person {
    id: Int
    name: String
    age: Int
    gender: String  
  }
`);

Bạn có thể thấy một số cú pháp thú vị ở trên, [Person] có nghĩa là trả về một mảng kiểu Person trong khi dấu chấm than trong user(id: Int!) Có nghĩa là id  phải được cung cấp. truy vấn users lấy một biến giới tính tùy chọn.

Resolver

Resolver có trách nhiệm lập bản đồ hoạt động để thực hiện function. Bên trong type Query, chúng tôi có một hoạt động được gọi là users. Chúng tôi xác định hoạt động này đến một function có cùng tên tại root. Chúng tôi cũng sẽ tạo ra một số người dùng giả cho function này.

...
var users = [  // Dummy data
  {
    id: 1,
    name: 'Brian',
    age: '21',
    gender: 'M'
  },
  {
    id:2,
    name: 'Kim',
    age: '22',
    gender: 'M'
  },
  {
    id:3,
    name: 'Joseph',
    age: '23',
    gender: 'M'
  },
  {
    id:3,
    name: 'Faith',
    age: '23',
    gender: 'F'
  },
  {
    id:5,
    name: 'Joy',
    age: '25',
    gender: 'F'
  }
];

var getUser = function(args) { ... }  // Return a single user
var retrieveUsers = function(args) { ... } // Return  a list of users
...
var root = { 
  user: getUser,   // Resolver function to return user with specific id
  users: retrieveUsers
};

Để làm cho code trở nên dễ đọc hơn, chúng ta sẽ tạo các function riêng biệt thay vì xếp tất cả mọi thứ vào bộ root resolver. Cả hai function này lấy một tham số tùy chọn args mang các biến từ truy vấn của khách hàng. Hãy cung cấp một thực hiện cho các resolver và thử nghiệm các function của chúng.

...
var getUser = function(args) { // return a single user based on id
  var userID = args.id;
  return users.filter(user => {
    return user.id == userID;
  })[0];
}

var retrieveUsers = function(args) { // Return a list of users. Takes an optional gender parameter
  if(args.gender) {
    var gender = args.gender;
    return users.filter(user => user.gender === gender);
  } else {
    return users;
  }
}
...

Query

query getSingleUser {
    user {
        name
        age
        gender
    }
}

Output

Trong biểu đồ ở trên, chúng tôi đang sử dụng một hoạt động getSingleUser để có được một người dùng duy nhất với tên, giới tính và độ tuổi. Chúng tôi có thể tùy ý chỉ định rằng chúng tôi cần tên của họ chỉ khi chúng tôi không cần tuổi và giới tính.

Khi có trục trặc trong nhật ký mạng hoặc máy chủ GraphQL, sẽ dễ dàng xác định truy vấn trong codebase bằng tên thay vì cố gắng giải mã nội dung.

Truy vấn này không cung cấp id đã được yêu cầu và GraphQL cung cấp cho chúng tôi một thông báo lỗi mô tả rất. Bây giờ chúng ta sẽ thực hiện một truy vấn chính xác, chú ý việc sử dụng các biến / đối số.

Query

query getSingleUser($userID: Int!) {
    user(id: $userID) {
        name
        age
        gender
    }
}

Variables

{ 
    "userID":1
}

Output

 Còn tiếp…

TopDev via Scotch

  Tại sao bây giờ là thời điểm thích hợp để học GraphQL?

 

1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++

Con trỏ và tham số của hàm

Chúng ta đã tìm hiểu về 2 kiểu tham số của hàm:

  • Hàm có tham số nhận giá trị: giá trị truyền vào hàm có thể là giá trị của biến, một hằng số hoặc một biểu thức toán học…
  • Hàm có tham số kiểu tham chiếu: giá trị truyền vào cho hàm là tên biến, và tham số của hàm sẽ tham chiếu trực tiếp đến vùng nhớ của biến đó.

Chúng ta còn có thêm một kiểu truyền dữ liệu vào cho hàm nữa, đó là truyền địa chỉ vào hàm (Pass arguments by address). Do đó, kiểu tham số của hàm có thể nhận giá trị là địa chỉ phải là con trỏ.

void foo(int *iPtr)
{
	cout << "Int value at " << iPtr << " is " << *iPtr << endl;
}

int main()	
{
	int iValue = 10;
	foo(&iValue);
	
	system("pause");
	return 0;
}

Trong đoạn chương trình trên, sau khi truyền địa chỉ của biến iValue vào hàm foo, tham số iPtr bây giờ sẽ giữ địa chỉ của biến iValue, và chúng ta có thể sử dụng toán tử dereference cho con trỏ iPtr. Kết quả in ra màn hình trên máy tính của mình là:

Int value at 0xBFBA144C is 10

Nếu vùng nhớ tại địa chỉ được sử dụng làm đối số cho hàm không phải là hằng, chúng ta có thể thay đổi giá trị của vùng nhớ đó ngay bên trong hàm thông qua toán tử dereference:

void changeValue(int *iPtr)
{
	*iPtr = 10;
}

int main()
{
	int iValue = 5;
	cout << "Value = " << iValue << endl;
	
	changeValue(&iValue);
	cout << "Value = " << iValue << endl;
	
	system("pause");
	return 0;
}

Kết quả in ra:

Value = 5
Value = 10

Như vậy, chúng ta có thể hoán vị giá trị của 2 số nguyên thông qua hàm như sau:

void swapIntValue(int *ptr1, int *ptr2)
{
	int temp = *ptr1;
	*ptr1 = *ptr2;
	*ptr2 = temp;
}

int main()
{
	int value1 = 2;
	int value2 = 5;
	
	cout << "Before swap: " << value1 << " " << value2 << endl;
	swapIntValue(&value1, &value2);
	cout << "After swap : " << value1 << " " << value2 << endl;
	
	system("pause");
	return 0;
}

Kết quả:

Before swap: 2 5
After swap : 5 2

Như các bạn thấy, con trỏ khi làm tham số cho hàm cũng có khả năng thay đổi giá trị của vùng nhớ không phải hằng như con trỏ thông thường thông qua toán tử dereference.

Chúng ta còn có thể truyền địa chỉ của mảng một chiều vào cho tham số kiểu con trỏ của hàm. Ví dụ:

void printArray(int *arr, int length)
{
	for (int i = 0; i < length; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

int main()
{
	int iArr[] = { 3, 2, 5, 1, 7, 10, 32 };
	printArray(iArr, sizeof(iArr) / sizeof(int));
	
	system("pause");
	return 0;
}

Lưu ý, chúng ta không thể biết chính xác kích thước của mảng một chiều thông qua con trỏ, do đó, chúng ta cần tính toán trước kích thước của mảng trước khi truyền vào cho hàm.

Sử dụng Pointer to const để làm tham số cho hàm

Như các bạn đã biết, Pointer to const là loại con trỏ chỉ có chức năng để đọc (read-only). Do đó, sử dụng Pointer to const làm tham số cho hàm sẽ đảm bảo rằng giá trị tại vùng nhớ được truyền vào cho hàm sẽ không bị thay đổi.

void printArray(const int *arr, int length)
{
	for (int i = 0; i < length; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

int main()
{
	int arr[] = {};
	int length = sizeof(arr) / sizeof(int);
	
	printArray(arr, length);
	
	system("pause");
	return 0;
}

Lúc này, chúng ta có thể đảm bảo rằng giá trị của các phần tử trong mảng arr sẽ không bị thay đổi bởi hàm printArray.

Tham số của hàm là tham chiếu vào con trỏ

Khi chúng ta truyền đối số cho hàm là một địa chỉ, cái địa chỉ này cũng chỉ là bản copy của địa chỉ ban đầu. Về bản chất, truyền địa chỉ vào hàm là truyền đối số là giá trị (pass by value). Địa chỉ của đối số sẽ được copy và gán lại cho tham số con trỏ của hàm. Nếu bên trong hàm có câu lệnh thay đổi địa chỉ được truyền vào, chúng chỉ thay đổi bản sao của địa chỉ gốc. Để dễ hình dung hơn, chúng ta xem xét ví dụ sau:

void setToNull(int *ptr)	
{
	ptr = NULL; // (4)
}  // (5)

int main()
{
	int value = 5;
	int *pValue = &value; // (1)
	
	cout << "pValue point to " << pValue << endl; // (2)
	setToNull(pValue); // (3)
	cout << "pValue point to " << pValue << endl; // (6)
	
	system("pause");
	return 0;
}

Có 6 bước để nói về đoạn chương trình trên:

(1) Gán địa chỉ của biến value cho con trỏ pValue.
(2) In ra địa chỉ mà con trỏ pValue đang nắm giữ.
(3) Truyền giá trị của con trỏ đang nắm giữ cho hàm setToNull
(4) Sau khi con trỏ ptr trong hàm setToNull nhận được giá trị đầu vào, con trỏ ptr này được gán lại giá trị NULL.
(5) Ra khỏi phạm vi của hàm setToNull, con trỏ ptr bị hủy.
(6) In ra lại giá trị của con trỏ pValue. Lúc này, chúng ta có thể thấy giá trị của pValue không hề thay đổi, nó vẫn còn trỏ đến địa chỉ của biến value.

Như vậy, giá trị địa chỉ được truyền vào hàm được nắm giữ bởi tham số con trỏ của hàm, từ đó chúng ta có thể sử dụng toán tử dereference để thao tác với vùng nhớ tại địa chỉ đó. Chúng ta cũng có thể cho tham số của hàm trỏ đến địa chỉ khác, nhưng không ảnh hưởng gì đến con trỏ gốc.

Trong một số trường hợp cụ thể, chúng ta muốn thay đổi địa chỉ của con trỏ đối số đang trỏ đến, chúng ta có thể sử dụng tham chiếu cho con trỏ đối số. Xét đoạn chương trình bên dưới:

void setToNull(int *&ptr)	
{
	ptr = NULL;
}

int main()
{
	int value = 5;
	int *pValue = &value;
	
	cout << "pValue point to " << pValue << endl;
	setToNull(pValue);
	if(pValue == NULL)
		cout << "pValue point to NULL" << endl;
	else
		cout << "pValue point to " << pValue << endl;
	
	return 0;
}

Kết quả của đoạn chương trình này cho thấy con trỏ pValue sau khi truyền vào hàm setToNull đã được gán giá trị NULL. Do tham số con trỏ của hàm setToNull là một tham chiếu kiểu (int *), nó sẽ tham chiếu đến đối số được truyền vào, trong trường hợp này, tham số tham chiếu con trỏ ptr có cùng địa chỉ với pValue, việc thay đổi giá trị mà ptr nắm giữ cũng làm thay đổi giá trị của pValue.

  Modern C++ binary RPC framework gọn nhẹ, không cần code generation

Con trỏ và kiểu trả về của hàm

Chúng ta đã cùng tìm hiểu 2 kiểu giá trị trả về của hàm có kiểu trả về:

  • Hàm trả về giá trị.
  • Hàm trả về tham chiếu.

Bây giờ, chúng ta sẽ cùng tìm hiểu một số vấn đề về kiểu giá trị trả về của hàm là địa chỉ (return by address).

Khi nói về việc trả về địa chỉ từ hàm, chúng ta hiểu rằng đó là địa chỉ của những biến hoạt động bên trong hàm. Địa chỉ này sẽ được trả về cho lời gọi hàm, và địa chỉ này thường được tiếp tục sử dụng bằng cách gán nó lại cho 1 con trỏ. Do đó, kiểu trả về của hàm cũng phải là kiểu con trỏ.

Ví dụ:

int * createAnInteger(int value = 0)
{
	int myInt = value;
	return &myInt;
}

int main()
{
	int *pInt = createAnInteger(10);
	cout << *pInt << endl;
	
	return 0;
}

Sau khi nhìn vào kết quả, chúng ta thấy có vẻ chương trình đã cho ra kết quả như mong muốn:

10

Nhưng thực chất, đoạn chương trình trên đã gây ra lỗi nghiêm trọng. Lý do là biến myInt được khai báo bên trong hàm là biến cục bộ, được cấp phát bằng kỹ thuật Automatic memory allocation, và vùng nhớ được cấp phát cho biến myInt được lưu trữ trên phân vùng Stack của bộ nhớ ảo. Do đó, ngay sau khi ra khỏi hàm, vùng nhớ của biến myInt đã bị hệ điều hành thu hồi, nhưng địa chỉ của biến myInt trước đó đã được trả về cho lời gọi hàm, nên con trỏ pInt trong hàm main được gán một địa chỉ của một vùng nhớ không thuộc quyền quản lý của chương trình hiện hành nữa.

Như mình đã nói, nếu không may, một chương trình khác yêu cầu cấp phát vùng nhớ ngay tại địa chỉ của biến myInt lúc chưa bị hủy, nội dung bên trong vùng nhớ này sẽ bị các chương trình khác thay đổi, dẫn đến việc sử dụng toán tử dereference đến vùng nhớ đó không cho ra kết quả như ban đầu nữa. Các bạn có thể chạy đoạn chương trình sau để kiểm chứng:

int * createAnInteger(int value = 0)
{
	int myInt = value;
	return &myInt;
}

int main()
{
	int *pInt = createAnInteger(10);
	cout << "Print immediately:         " << *pInt << endl;
	_sleep(1000);
	cout << "After a fews seconds:   " << *pInt << endl;

	system("pause");
	return 0;
}

Kết quả trên máy tính của mình:

Như các bạn thấy, chỉ sau thời điểm vùng nhớ của biến myInt bị hủy mới có 1 giây mà đã có chương trình khác sử dụng vùng nhớ đó, làm cho giá trị in ra màn hình console không còn như ban đầu nữa. Và nếu không may hơn nữa, nếu chương trình khác sử dụng cơ chế đồng bộ của kỹ thuật multithreading lên vùng nhớ này, việc dereference vào vùng nhớ đó cũng có thể gây crash chương trình.

Nguyên nhân của những hệ quả mà mình vừa kể ra đều là do vùng nhớ được cấp phát trên Stack thông qua kỹ thuật Automatic memory allocation sẽ bị thu hồi tự động bởi hệ điều hành. Để giải quyết vấn đề này, chúng ta cần sử dụng phân vùng Heap để có thể tự quản lý thời điểm giải phóng vùng nhớ để trả lại cho hệ điều hành quản lý.

int * createAnInteger(int value = 0)
{
	return new int(value);
}

int main()
{
	int *pInt = createAnInteger(10);
	
	cout << "Print immediately:   " << *pInt << endl;
	_sleep(5000);
	cout << "After a few seconds: " << *pInt << endl;
	
	system("pause");
	return 0;
}

Kết quả lúc này đã được đảm bảo do chúng ta biết rằng vùng nhớ cấp phát trên Heap chỉ bị hệ điều hành thu hồi khi toàn bộ chương trình kết thúc.


Tổng kết

Trong bài học này, chúng ta đã biết cách truyền tham số là địa chỉ (hoặc con trỏ) vào cho hàm, và trả về địa chỉ cho lời gọi hàm. Bên cạnh đó, chúng ta cũng đã biết được một số vấn đề phát sinh khi sử dụng các kỹ thuật này. Vẫn còn nhiều vấn đề cần phải nói khi sử dụng con trỏ, chúng ta sẽ cùng tiếp tục tìm hiểu trong các bài học tiếp theo.

Bài tập cơ bản

Xét đoạn chương trình của ví dụ trên.

#include <iostream>
using namespace std;

int * createAnInteger(int value = 0)
{
	return new int(value);
}

int main()
{
	int *pInt = createAnInteger(10);
	
	cout << "Print immediately:   " << *pInt << endl;
	_sleep(5000);
	cout << "After a few seconds: " << *pInt << endl;
	
	system("pause");
	return 0;
}

Đoạn chương trình trên cho ra kết quả đúng, giá trị được in ra khi sử dụng toán tử dereference để truy xuất không bị thay đổi theo thời gian, nhưng nó lại phát sinh một vấn đề khác. Đó là vấn đề gì?

TopDev via daynhauhoc.com

  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++
Lương của Developer (C++, PHP) tại Cốc Cốc có thể lên đến $2,000?”]

5 tips cải tiến chất lượng phát triển Mobile App

Với Mobile App Development (MAD), chất lượng nói lên tất cả, hay nói cách khác App càng chất lượng, khách hàng càng tin tưởng. Vậy làm thế nào để cải thiện chất lượng App là một câu hỏi hàng đầu khi bắt tay vào mọi project. Hãy cùng TopDev điểm qua những tips cực hữu ích dành cho Mobile Application Development dưới đây nhé.

Cập nhật dữ liệu không ngừng

Cập nhật dữ liệu không ngừng

Dữ liệu được liên tục được cập nhật luôn làm hài lòng người dùng. Thực tế, có rất nhiều ứng dụng yêu cầu vấn đề này, từ book vé xem phim, vé máy bay và những yêu cầu khác để truyền tải thông tin mới nhất. Tuy nhiên chiến lược truyền tải thông tin đến khách hàng lại là một điều quan trọng khác khi di động đang phát triển mạnh mẽ và bạn nên biết phải vận dụng điều này.

Song, một lỗi nhỏ trong việc đặt vé cũng có thể làm sập đổ cả ứng dụng hoặc tệ hơn là làm mất lòng tin của khách hàng.

Độ phản hồi chính xác

Độ phản hồi chính xác

Độ phản hồi là một trong những yếu tố quan trọng mà bạn không nên mạo hiểm nếu không muốn đánh mất sự hài lòng của khách hàng khi họ thực hiện các hoạt động trên mobile, đặc biệt trải nghiệm của khách hàng sẽ quyết định sự thành bại tới app của bạn. Vậy nên, độ chính xác và tốc độ phản hồi là hai yếu tố quan trọng nhất mà chúng ta cần quan tâm về response khi tạo app. Nếu bạn gặp rắc rối về chúng, các vấn đề này có thể được giải quyết khi chọn những nền tảng (platform) được cải tiến.

Khả năng mở rộng và phát triển

Khả năng mở rộng và phát triển

Đây thực sự là yếu tố quan trọng khi viết app. Đừng bao giờ nghĩ rằng App của bạn sẽ bị ràng buộc với một lượng khách hàng cụ thể. Bạn nên xây dựng app dựa trên những giải pháp khác nhau có khả năng thích ứng trong tương lai. Thử hình dung mobile app của bạn trở nên viral cùng với sự gia tăng khách hàng và lượt tải về. Từ đó, tính linh hoạt cũng như lượt sử dụng, không gian, tốc độ và database, … nên được ưu tiên hàng đầu.

Khả năng truy cập đa nền tảng

Khả năng truy cập đa nền tảng

Mọi thứ nên được cân nhắc kỹ lưỡng khi xây dựng bất kỳ ứng dụng nào, vì chúng ta không lường trước điều gì là cần thiết trong tương lai. Vậy nên sao không hiện thực hóa những platform tân tiến ngay từ đầu, điều này giúp giảm thiểu việc đau đầu khi phát triển app trong tương lai.

Rất nhiều khách hàng khi có ứng dụng android đã yêu cầu một phiên bản iOS trong tương lai và ngược lại. Nên nếu sử dụng những platform đa nền tảng, chúng ta sẽ tiết kiệm được khá nhiều thời gian và chi phí.

Những lưu ý về độ an toàn

Những lưu ý về độ an toàn

Khi tạo ra những app có thể trao đổi dữ liệu doanh nghiệp cơ bản, chúng ta phải chú ý đến việc giải quyết lỗ hổng an ninh. Khâu xác thực khách hàng phù hợp phải tiến hành để đảm bảo tính bảo mật của bất kỳ dữ liệu hay thông tin nhạy cảm có khả năng bị rò rỉ qua ứng dụng.

Có khá nhiều tổ chức xây dựng app mobile trên toàn thế giới. Để nổi bật hơn những tổ chức này, app của bạn phải đạt chuẩn, được xác minh vượt trội hơn hẳn để gây ấn tượng với khách hàng của mình. Khi xem xét tất cả những điều trên, khả năng ROI (Hệ số thu nhập trên đầu tư) được nâng cao là điều dễ hiểu.

Việc tạo ra một app đầy thú hút thì bạn hoàn toàn có khả năng kiếm một khoảng tiền lớn, tuy nhiên sự đầu tư cho một app là không nhỏ và cải thiện nó lại là quá trình lâu dài mới khiến app của bạn sống sót trong trong thời đại mobile. 5 tips về Mobile App Development trên không nhiều cũng không ít nhưng cũng đủ để bạn hình dung được đâu sẽ là sự quyết định cho thành công cho “đứa con cưng” của mình.

source: masif

Cập nhật mới nhất, ứng dụng nhiều hơn, lắng nghe nhiều hơn các chia sẻ từ chuyên gia  trong lĩnh vực Mobile Technology & Digital và hơn hết là kết nối cộng đồng tại Vietnam Mobile Day 2019, sự trở lại của năm thứ 9 không khiến khán giả thất vọng!

Lập trình đâu chỉ có những dòng code

Lập trình đâu chỉ có những dòng code

Lập trình đâu chỉ là những dòng code – TopDev via Persol

Học lập trình thế nào để không thất nghiệp?

Dạy học ở VN là một bài toán chưa có lời giải. Học xong, tốt nghiệp nhiều nhưng thất nghiệp và làm trái ngành cũng nhiều. Tôi muốn góp phần giải bài toán này để có nhiều người có thể làm đúng đam mê của mình.

Trước hết, người viết xin nói lên quan điểm của mình về vấn đề này, tại sao người học lập trình lại không thể xin việc, hay nói cách khác là không thể lập trình đúng nghĩa. Theo tôi đó là do cách dạy học ở mình còn nặng thành tích và tập trung vào cách làm sao có điểm cao là được.

Trường phổ thông thì tôi không nói, mọi người lao đầu vào học và giải bài để đi thi ĐH. Nhưng lên ĐH rồi, tôi còn thấy nhiều bạn đi học kèm thì tôi cảm thấy quá thất vọng. Tôi từng viết một bài có hơi chua chát, cách học lập trình thất bại. Mọi người vẫn có tư tưởng ở phổ thông là giải thật nhiều bài tập, xin đừng hiểu sai ý của tôi. Tôi không phê phán việc giải nhiều bài tập, nhưng cái tôi muốn nói tới là giải bài tập vừa đủ để hiểu vấn đề. Đừng giải quá nhiều bài tập để thành thợ giải toán, thợ giải bài tập mà không đi sâu được. Mọi người cứ nghĩ lên ĐH rồi vẫn cần phải đi học kèm, phải giải thật nhiều dạng đề. Cái gì, giải nhiều dạng đề để làm gì? Doanh nghiệp họ đâu có tuyển lập trình viên vào giải đề? Trừ phi bạn giải đề để đi thi competitive programming.

Như hôm nay tôi có trả lời một câu hỏi của một bạn, bạn ấy hỏi thợ code là gì? Theo tôi, thợ code là người code nhanh, code nhiều, code không cần nghĩ. Ở đâu thì có thợ code, ở các nước đang phát triển như VN thì thợ code rất nhiều.

Các bạn học lập trình, không học cơ bản, thích học công nghệ. Ra trường vào một công ty outsource, không phải mọi outsource đều xấu, tôi chỉ đang ví dụ một số công ty outsource cơ bắp. Khách hàng từ các nước phát triển không muốn phí tiền làm công việc cơ bắp, họ gửi đơn hàng về VN. Khi này, các thợ code có cơ hội ra tay, code mỗi ngày rất nhiều, mỗi tháng có thể làm được vài KLOC (K line of code) nhưng cứ code đi code lại một vài tính năng quản lý thành quen. Sau cùng, từ một người đam mê công nghệ, bạn mình, có người muốn bỏ nghề làm cái khác. Nhưng cuối cùng cũng vì cơm áo gạo tiền mà lại tiếp tục nai lưng ra làm thợ code.

Khi đi học trên trường, có giai đoạn tôi rất thích học. Đó là khi được học cơ bản, biết về biến, con trỏ, hàm, class. Đó là khi được học giải thuật, học cách bảng băm hoạt động, cách mã hóa dữ liệu, cách nén và giải nén, cách xử lý ảnh, học về trí tuệ nhân tạo, …. Đó mới chính là những cái tôi thích học, tuy nhiên tôi muốn nhấn mạnh đây là sở thích cá nhân, cũng không cho rằng mọi người nên hoặc phải có cùng sở thích với tôi.

Nhưng cái tôi muốn dạy cũng gần như những cái ở trên, đó là dạy cách suy nghĩ của một kỹ sư phần mềm chứ không phải dạy để ra làm thợ code. Dạy những cái thật sự cơ bản, nguyên lý của mọi thứ. Có thể tôi không làm được trong một sớm một chiều, vì khả năng của tôi cũng có giới hạn, nhưng nhất định tôi sẽ không bỏ. Nếu không đủ kiển thức, tôi sẽ học thêm để có thể truyền đạt lại cho mọi người.

Cái tôi nhìn thấy sau mấy năm đi làm là một người học CNTT ra, nhưng không có tư duy lập trình không có giải thuật, không có tìm hiểu, chỉ code như cái máy code thì không thể nào so sánh được với một người không cần từ ngành CNTT ra, nhưng họ có đam mê, họ muốn tìm hiểu, họ học hỏi từ người khác. Họ nghĩ trước khi code, họ nghĩ trước khi làm.

Những người này, tôi không có khả năng dạy, bởi vì hầu hết họ giỏi hơn tôi.

Tóm lại, tôi nghĩ học CNTT ta cần phải có đam mê, nắm cơ bản ngôn ngữ lập trình, cấu trúc dữ liệu & giải thuật, sau đó tự tìm hiểu cái mình cần. Tôi sẽ cố gắng đem những điều đó vào trong khóa học C++. Tên nó là khóa học C++ nhưng bản chất là học cách lập trình thông qua ngôn ngữ C++.

Một điều tôi rất may mắn học được ở ĐH KHTN là những kiến thức cơ bản. tôi và những bạn học cùng lớp từng có nhiều lần nói chuyện với nhau sau khi ra trường rằng thực ra chỉ cần học 2 năm là đi làm được. Bỏ đi 1 năm đại cương, bỏ đi năm 4 học “phân tích phát triển phần mềm”, chỉ cần 2 năm là đủ đi làm.


Note về Competitive programming:

Competitive programming là cái gì?

Đây là các cuộc thi giải thuật, bạn phải thật sự giỏi giải thuật thì mới có thể chiến thắng ở các cuộc thi này. Giống như các cuộc thi toán.

Cái này có tốt cho học lập trình hay không?

Tôi nghĩ là có, competitive programming yêu cầu bạn có hiểu biết sâu về giải thuật.

Cái này có giúp ta làm ra phần mềm tốt không

Theo tôi nghĩ là không, competitive programming hầu hết là giải các bài toán, code để giải các bài toán này thường gói gọn trong một hàm. Làm phần mềm tốt yêu cầu nhiều hơn thế.

Có giải cao khi thi các giải này có lợi cho việc kiếm việc làm không?

Cá nhân tôi thì nghĩ là không lợi không hại. Robert Love, người phát triển Kernel cho Android và đang ở trong hội đồng tuyển dụng của Google, cho rằng có giải trong các ký thi này không có ý nghĩa gì đối với ổng.

Robert Love’s answer trên Quora

Các câu trả lời khác của các câu hỏi tương tự, có cùng chung quan điểm với Love.

Người viết Lê Trần Đạt

TopDev via Daynhauhoc

  Liệu tôi có làm Junior Developer "mãn kiếp"?
  Làm kỹ sư AI, mức lương 500 triệu là bình thường

Autosaving cùng Vuex

Một vài thông tin background

Vào thời đâu những năm 2000, nếu tôi đang sử dụng Microsoft Word và rồi tắt máy mà quên nhấn Ctrl+S, chắc chắn tôi đã không sống yên ổn. Mọi công sức ra đi và không cách nào có thể lấy lại nó. Trong các phiên bản mới của Word họ đã cho ra mắt công cụ autorecovery, nghĩa là nếu may mắn thì bạn sẽ lấy lại một phần nào đó. Điều này rất tuyệt nhưng MVP thực thụ chính là Google Docs, với indicator luôn tự động sao lưu, sẽ lưu ý bất cứ khi nào bạn đổi doc và tự động lưu nó lên cloud sau mỗi giây.

Autosave đang thực sự thay đổi cuộc chơi. Nếu app cho phép user nhập content, chúng sẽ không cần phải tìm kiếm nút “Save” nữa. Chúng chỉ làm sao để upload lên cloud nhanh nhất có thể ngay khi được nhập vào. May thay, với các webapp hiện đại thì không quá khó để ứng dụng nó.

Hôm nay tôi sẽ chỉ cho bạn cách viết một autosaver dùng Vue.js, Vuex và một cái plugin Vuex. Một điều tốt về method này đó là nó không yêu cầu app bạn phải gửi đi API request mỗi lần có thay đổi; thay vì thế Vuex plugin sẽ xem state của app và phản ứng khi cần, cách ly các công việc nội bộ của app từ tương tác của nó với API. Tôi đã ứng dụng nó vào project ưa thích của tôi, Edward, và nó chạy như một giấc mơ.

Các thành phần

Đây là một vài tool chúng ta sẽ sử dụng:

  • Vue.js là một framework đơn giản và quyền lực để viết web component. Nó tương đương với React về quy mô và mô hình, nhưng đầy đủ shortcut làm nó trở nên dễ sử dụng hơn.
  • Vuex là một tool quản lý state cho Vue. Nó giống với Redux. Nó là một cơ chế immutable state, nghĩa là nó quản lý một object lớn đầy data mà app bạn cần, và mỗi lần data thay đổi thì nó sẽ cho ra một object hoàn toàn mới.
  • Lodash là một JavaScript toolchain (giống như Underscore hoặc một phần cảu jQuery) rất nhiều thứ thú vị. Chúng ta chỉ cần một function từ nó. và chúng ta có thể qua được mà không cần nó, nếu chúng ta muốn.
  • Một web browser.

Một mẫu repo ở đây. Và đoán xem? Không cần đến npm install, không cần build step (bạn có thể mở index.html ngay trên browser), và mọi thứ chỉ dưới 100 dòng code (không tính comment). Ngoài ra, tất cả đều là ES5 thuần.

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

  15 chứng chỉ "vàng" đáng giá trong ngành lập trình
  Mười điều răn dành cho lập trình viên

Cách thực hiện

Đầu tiên bạn cần một file index.html basic. Nó chứa div để Vue đính vào, các tag <script> chó các thư viện chúng ta cần, một tag <script> cho file JavaScript, và một tag <style>  để làm mọi thứ trông nhẹ nhàng hơn.

<body>
  <div id="app"></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://unpkg.com/vuex@3.0.1/dist/vuex.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
<script src="./index.js"></script>
<style>
  textarea {
    height: 100px;
    width: 300px;
  }
</style>

Bạn có thể thấy chúng ta đang thử trên Vue, Vuex, Lodash và file JavaScript riêng tên là index.js. Nó dùng cho file này.

Tạo file index.js. Chúng ta sẽ bắt đầu bằng bootstrap Vue app của chúng ta:

var app = new Vue({
  el: '#app',
  template: '<div></div>',
})

Bạn nên giữ đoạn code này ở cuối file index.js, vì nó sẽ liên hệ với mọi thứ chúng ta build từ đây.

Vue sẽ tìm được element match với el selector và kiểm soát nó. Hiện tại nó sẽ để một<div></div> trong đó. Chúng ta cần nó làm gì khác thú vị hơn lúc này.

Bây giờ hãy tạo một component để user nhập text vào:

Vue.component('text-entry', {
  template: '<textarea v-model="content" @keyup="registerChange"></textarea>',
  data: function () {
    return {
      content: '' // This is the initial value of the textarea
    }
  },
  methods: {
    registerChange: function () {
      // We'll do something whenever the textarea changes
    }
  }
})

Nó sẽ hiện textarea và update value của content bất cứ khi nào user gõ vào. Add nó vào app của chúng ta bằng cách update Vue constructor:

var app = new Vue({
  el: '#app',
  template: '<div> <text-entry></text-entry> </div>',
})

Bây giờ ta cần thấy textarea trong app. Sau đó, sẽ tạo ra một Vuex store:

var store = new Vuex.Store({
  state: {
    content: ''
  },
  mutations: {
    'UPDATE_CONTENT': function (state, newContent) {
      state.content = newContent
    }
  }
})

Đây là store Vuex khá basic. Nó có một phần data và một mutation. Khi bạn trung thành với mutation, nó sẽ save bất kì thứ gì chsng ta đi qua như một giá trị mới của content.

Chúng ta cần store này ở 3 chỗ:

  • Một cái trong app declaration thì Vue biết cách dùng.
  • Một cái trong app declaration của component text-entry, nên nó sẽ đặt giá trị của textarea dựa trên tình trạng của Vuex.
  • Một cái trong method registerChange của component text-entry, để gắn với mutation mọi chỗ user thay đổi text trong textarea.

Khi chúng ta đã thực hiện cả ba, file index.js sẽ như thế này:

var store = new Vuex.Store({
  state: {
    content: ''
  },
  mutations: {
    'UPDATE_CONTENT': function (state, newContent) {
      state.content = newContent
    }
  }
})

Vue.component('text-entry', {
  template: '<textarea v-model="content" @keyup="registerChange"></textarea>',
  data: function () {
    return {
      content: this.$store.state.content
    }
  },
  methods: {
    registerChange: function () {
      this.$store.commit('UPDATE_CONTENT', this.content)
    }
  }
})

var app = new Vue({
  el: '#app',
  template: '<div> <text-entry></text-entry> </div>',
  store: store
})

Để giải thích feature autosaving, chúng ta cần một nơi để store data để vẫn cố định sau khi refresh page. Tôi không dính dáng đến những vấn đề liên quan đến tạo web server cho mục đich này. Thay vì thế hãy dùng LocalStorage:

var storageKey = 'content'
var api = {
  load: function () {
    var json = window.localStorage.getItem(storageKey) || JSON.stringify('')
    return JSON.parse(json)
  },
  save: _.debounce(function (content, callback) {
    window.localStorage.setItem(storageKey, JSON.stringify(content))
    callback()
  }, 1000, { maxWait: 3000 })
}

Fake API của chúng ta có hai method, save và loadload dùng để đưa state khỏi LocalStorage, và nếu nó không ở đó, trả về một string rỗng. Còn save đưa giá trị cho LocalStorage key, và yêu cầu callback. Chúng ta sử dụng method debounce của Lodash để đảm bảo rằng save không bao giờ bị call hơn 1 lần mỗi giây. Quan trọng là vì nếu chúng ta không debounce method này, nó sẽ bị call mỗi lần user gõ một key. Điều này không quá tệ với LocalStorage, nhưng nếu bạn đang thực hiện các request XHR, một user nhập 70 từ trên một phút có thể submit nhiều request trên giây, có thể làm chậm mọi thứ và cả bạn nữa. Tôi đã sử dụng parameter maxWait, để đảm bảo nếu user gõ liên tục, content sẽ được autosave mỗi 3 giây.

Bây giờ, chúng ta có thể tạo một Vuex plugin để autosave content trong textarea. Một Vuex plugin là một function chấp nhận Vuex store như một argument. Nó có thể subscribe vào store để được thông báo mỗi khi state thay đổi.

var autosaverPlugin = function (store) {
  store.commit('UPDATE_CONTENT', api.load())

  store.subscribe(function (mutation, state) {
    if (mutation.type === 'UPDATE_CONTENT') {
      api.save(mutation.payload, function () {
        // This callback doesn't need to do anything yet
      })
      return
    }
  })
}

Khi plugin được load lần đầu, ngay lập tức sẽ load application state từ LocalStorage và theo nó như một mutation. Sau đó chúng ta subscribe vào Vuex store. Mỗi lần mutation commit, chúng ta sẽ đươc báo. Chúng ta có thể check loại mutation để đảm bảo content được update, sau đó gửi đi payload vào fake API để lưu trên LocalStorage.

Bây giờ hãy add plugin này vào Vuex declaration:

var store = new Vuex.Store({
  state: {
    content: ''
  },
  mutations: {
    'UPDATE_CONTENT': function (state, newContent) {
      state.content = newContent
    }
  },
  plugins: [autosaverPlugin]
})

Nếu bạn nhập vào textarea, đợi một chút và refresh page, bạn sẽ thấy một vài thay đổi nhỏ. Và vue component không phải quan tâm về nó; Vuex plugin đã làm hết những việc nặng nề.

Bước cuối

Chúng ta có thể dùng một cách để báo cho user biết những gì họ làm đã được lưu. Nó sẽ đảm bảo lại cho user và giúp bạn nắm được là app vẫn hoạt động bình thường. Hãy add một vài text hiển thị “Saving…” hoặc “Saved”.

Đầu tiên, add một vài state vào Vuex store:

var store = new Vuex.Store({
  state: {
    content: '',
    saveStatus: 'Saved'
  },
  mutations: {
    'SET_SAVE_STATUS': function (state, newSaveStatus) {
      state.saveStatus = newSaveStatus
    },
    'UPDATE_CONTENT': function (state, newContent) {
      state.content = newContent
    }
  },
  plugins: [autosaverPlugin]
})

saveStatus sẽ chứa một string thông báo cho user phần của họ đã được lưu chưa. Và SET_SAVE_STATUS sẽ update nó.

Bây giờ chúng ta sẽ tạo một component để hiển thị nó:

Vue.component('saving-indicator', {
  template: '<div>{{ saveStatus }}</div>',
  computed: {
    saveStatus: function () {
      return this.$store.state.saveStatus
    }
  }
})

Và cho hiện nó ở trên textarea bằng cách chỉnh app template:

var app = new Vue({
  el: '#app',
  template: '<div> <saving-indicator></saving-indicator> <text-entry></text-entry> </div>',
  store: store
})

Hãy update autosaver plugin để commit các mutation với saveStatus:

var autosaverPlugin = function (store) {
  store.commit('UPDATE_CONTENT', api.load())

  store.subscribe(function (mutation, state) {
    if (mutation.type === 'UPDATE_CONTENT') {
      store.commit('SET_SAVE_STATUS', 'Saving...')
      api.save(mutation.payload, function () {
        store.commit('SET_SAVE_STATUS', 'Saved')
      })
      return
    }
  })
}

Và cuối cùng, file index.js trông giống như mẫu trong repo. Xem thử tại đây: https://github.com/isaaclyman/vuex-autosaver/blob/master/index.js

Hãy thử xem! Khi bạn nhập vào textarea, message báo “Saving…” và một khi hoàn thành, nó sẽ báo “Saved”. Giống như trong Google Docs. Một công cụ web development đỉnh cao tại đây.

Homework

Đây là một vài thứ bạn có thể add vào project để không phải dính vào rắc rối:

  • Saving indicator có thể báo”Error” nếu có lỗi trong api.save method.
  • Fake API có thể dùng timeout để giả mạo một XHR request chậm.
  • Fake API cũng có thể return một Promise thay vì chấp nhận callback.
  • Có thể có hai textareas, và mỗi cái có thể autosave bằng càng ít code duplication càng tốt. Gợi ý: Hãy autosave object thay vì cái string.
  • Nếu api.save không nhận callback, nó sẽ hiện error.
  • Mọi thứ có thể trông chuyên nghiệp hơn nhiều. Nó có thể là phiên bản Craigslist của Google Docs.

Tham khảo các vị trí tuyển dụng VueJS lương cao cho bạn tại Topdev.

  Xử lí sự kiện trong VueJS
  Xây dựng ứng dụng chat realtime bằng Laravel + Vuejs + Socket + Redis