Home Blog Page 224

AI giúp cuộc sống tương lai tốt đẹp hơn như thế nào?

AI với tương lai
AI giúp cuộc sống tương lai tốt đẹp hơn như thế nào?

AI với tương lai sẽ ra sao? AI có thể giúp cho cuộc sống tốt đẹp hơn, giúp chúng ta hiểu rõ cuộc sống của chính mình hơn. Đó chính là cách AI được mang đến với mọi người và hiện đang được nghiên cứu, phát triển ngày một rộng mở.

  "Cơ hội phát triển sự nghiệp AI với các ngành nghề là tương đồng" - Bảo Đại, AI Researcher tại Knorex
  5G & IoT hứa hẹn điều gì trong tương lai?

AI có thể giúp gì cho các hoạt động của mỗi cá nhân?

AI với hoạt động thường nhật

Hãy tưởng tượng buổi sáng bạn thức dậy và AI chơi một bản nhạc nhẹ để bạn có thể khởi đầu ngày mới vui vẻ hơn. Tiếp theo đó, khi trên đường đi làm, AI có thể tự động điều hướng và tìm kiếm cho bạn lộ trình đường đi sao cho nhanh chóng và an toàn nhất, tránh được kẹt xe.

Sau khi kết thúc một ngày làm việc, bạn có thể tham gia các hoạt động thể dục thể thao và AI sẽ hỗ trợ thông qua các thiết bị như đồng hồ. Từ đó AI thu thập các chỉ số cơ thể và giới thiệu những bài tập phù hợp với tình trạng cơ thể hiện tại mà vẫn đáp ứng được các bài tập mà trainer giao cho bạn.

Khi chuẩn bị đi ngủ vào ban đêm, AI có thể dựa vào sở thích âm nhạc và các chỉ số cơ thể hiện tại của bạn để chọn ra những bài nhạc phù hợp nhất tại thời điểm đó, giúp bạn dễ đi vào giấc ngủ và có một giấc ngủ sâu hơn. Bên cạnh đó, AI cũng giúp lưu giữ chất lượng giấc ngủ của bạn mỗi đêm để đưa ra các giải pháp cải thiện giấc ngủ vào ngày tiếp theo.

AI cho một chuyến du lịch thoải mái hơn

AI còn giúp việc đi du lịch thoải mái và tiện lợi hơn nhiều so với trước đây. Hãy tưởng tượng bạn đang lên kế hoạch cho một chuyến du lịch, AI dựa vào lịch trình có thể gợi ý những điểm du lịch phù hợp cho bạn. Dựa trên tình hình thời tiết và địa điểm, AI có thể đề xuất những việc nên và không nên làm khi đến nơi. Không những vậy, khi tới địa điểm checkin, AI còn có thể giới thiệu với bạn những điểm vui chơi hay du lịch hấp dẫn xung quanh điểm đến đó.

AI với tương lai
AI trong tương lai sẽ được cải tiến với nhiều công nghệ hiện đại hơn

AI với công nghệ shopping thông minh

AI giúp việc shopping thuận tiện hơn. Cuộc sống bận rộn khiến việc ra cửa hàng trực tiếp để mua hàng trở nên khó khăn hơn do mất nhiều thời gian để lựa chọn. Trong AI có một chức năng gọi là AR, qua ống kính AR có thể đo được kích thước vật phẩm, màu sắc vật phẩm trong môi trường thật có chính xác hay không.

Hoặc khi đang đi trên đường, bạn nhìn thấy một vật phẩm mà không biết giá và tên của nó là bao nhiêu thì AI có thể detect và báo tên cũng như các thông tin của sản phẩm ngay lập tức.

Và AI cũng hỗ trợ việc thanh toán không cần tiền mặt. Hiện nay có rất nhiều ví điện tử ra đời và áp dụng các hình thức thanh toán như scan QR code. Nhưng với sự ứng dụng ngày một rộng rãi của AI, việc sử dụng code sau này sẽ không còn cần thiết, mà mọi thứ sẽ được đơn giản hóa qua sự kết nối của các công nghệ giúp việc thanh toán đơn giản hơn.

Đâu là giải pháp để tối ưu hiệu quả làm việc của AI?

Huawei đưa ra một giải pháp cho tương lai, đó là sự kết hợp giữa các thiết bị thông minh và mạng 5G, sẽ phá vỡ rào cản của thế giới vật lý và thế giới số. Những hệ thống được đưa ra là sự kết hợp giữa phần mềm và phần cứng để xây dựng một hệ sinh thái thông minh cho tất cả các thiết bị.

Hệ sinh thái này gồm có 3 thành phần:

  • Applications Eco – hệ sinh thái ứng dụng
  • Hardware Eco – hệ sinh thái phần cứng
  • AI-5G-Harmony OS – thành phần kết nối và cốt lõi

Applications Eco (HMS)

Là phần core mobile service, cung cấp cho các nhà phát triển những tools, services trên hệ thống di động như location, reading, music, video, xa hơn nữa là các bộ tool kits dùng để phát triển game, entertainment, social, office, media,…

Hardware Eco

Hardware Eco được phát triển theo hướng 1+8+N. 1 là điện thoại di động, 8 là 8 loại devices do Huawei sản xuất như laptop, tai nghe,… N là các thiết bị của nhà sản xuất thứ 3 như TV, modem,…

AI-5G-Harmony OS

Các thành phần ở giữa sẽ giúp kết nối 2 thành phần trên với nhau và phá bỏ những rào cản mà hiện tại các nhà phát triển đang gặp phải. Đó là các vấn đề về kết nối và chia sẻ dữ liệu giữa phần cứng và phần mềm của các hãng điện thoại khác nhau và các thiết bị khác nhau.

Sơ lược về lịch sử phát triển của Huawei Mobile Service

AI với tương lai

Huawei Mobile Service được phát triển từ 4 năm về trước. Vào năm 2016 khi vừa ra đời đó là version 2.0, lúc đó chỉ có account, in-app purchases và push kit. Lần lượt đến tháng 8/2019, HMS Core 3.0 ra đời, 1/2020 là HMS Core 4.0 và gần nhất là 6/2020, HMS Core 5.0 có khả năng hỗ trợ rất nhiều về đồ họa, games và tools cho các nhà phát triển.

HMS Eco đang phát triển rất nhanh chóng, đây được xem là giải pháp mở và toàn thắng cho cả hai bên. Hiện nay Huawei đang là 1 trong 3 hệ thống lớn nhất thế giới, bên cạnh Google và Apple. Số lượng mobile phone đã tăng đến 7 triệu thiết bị, cộng đồng developer tăng đến 1.600.000 người và application hiện có 81000 ứng dụng, chỉ trong 1 năm từ 2019 đến 2020.

Tổng quan về HMS Core

HMS Core là một hệ thống mở, phát triển trên 7 lĩnh vực gồm App services, Graphics, Media, Smart Device, AI, Security, System.

App services

Huawei sở hữu những công cụ giúp cho các nhà phát triển build ứng dụng một cách nhanh chóng và tiện lợi.

Graphics

Huawei luôn phát triển theo tiêu chí chipset, device và cloud. Chipset có các bộ kits hỗ trợ tối ưu hóa những chipset của thương hiệu gồm Scene Kit, CG kit, AR engine.

System

Một điểm mạnh nữa của Eco system hiện tại là phần System. Các bộ kits Nearby service giúp các thiết bị di động như điện thoại, loa, đồng hồ, tai nghe có thể nhận biết được các thiết bị xung quanh, kết nối nhanh. Huawei hiện cũng đang dẫn đầu về công nghệ 5G và công nghệ truyền thông dữ liệu. Đó chính là điểm mạnh trong hệ thống Eco system có thể đáp ứng được các yêu cầu khi phát triển một ứng dụng AI.

Media

Hỗ trợ các thiết bị audio và video hoạt động một cách mượt mà và bảo mật. Khi phát triển AI và AI kết hợp với những services như play music, play video, chúng ta thường quan tâm đến vấn đề bản quyền – copyright protection. Huawei cung cấp giải pháp đó là WisePlay DRM sẽ cover tất cả những services như Camera Kit, Audio Kit, Video Kit và Image Kit. Sâu hơn có thể cung cấp thêm Camera Engine và Audio Engine.

Camera của Huawei hiện tại được đánh giá là camera tốt nhất thế giới. Vậy làm sao để tận dụng được sức mạnh đó? Các services như Camera Kit và Camera Engine sẽ giúp bạn tận dụng tối đa được sức mạnh này để làm cho application của mình tốt hơn.

Smart Device

Huawei là đơn vị có thể sản xuất đa dạng các loại thiết bị. Do đó Huawei cung cấp các Distributed Capability gồm những bộ kit để các thiết bị có thể kết nối với nhau và truyền tải dữ liệu một cách dễ dàng. Nhờ đó đáp ứng được các yêu cầu mà một ngôi nhà thông minh đòi hỏi, như sự kết nối giữa điện thoại, đèn, các thiết bị điện, TV, các thiết bị gia dụng trong ngôi nhà của chúng ta.

AI

Huawei cung cấp một trải nghiệm hoàn toàn mới về AI. Việc phát triển AI trong công cuộc phát triển phần mềm sẽ cung cấp các foundation và framework, với các bộ kit ở 2 level để tối giản hóa việc phát triển (Computer visual, AI innovation và Customizing Model).

Security

Việc để một thiết bị AI nắm quá nhiều thông tin cá nhân là không nên, do đó mọi người luôn suy nghĩ về việc làm thế nào để bảo mật thông tin cá nhân. Trong hệ sinh thái của Huawei chúng tôi cung cấp các giải pháp về security và đạt đến mức bảo mật cao nhất của châu Âu là TEE. Áp dụng các tiêu chuẩn bảo mật lên tất cả các lĩnh vực như Authentication, Data, Application, Content.

Một số ứng dụng AI, ML đang được Huawei phát triển

AI với tương lai

Face Detection: hiện tại AI đã có thể bắt được tất cả các biểu cảm trên khuôn mặt người dùng. Đây là nền tảng dựa trên các cảm xúc và khuôn mặt của con người.

Text Recognition: nhận biết về text, extract các text từ ống kính AI cũng như dịch thuật.

Scan Kit: với các ứng dụng scan thông thường, khi barcode nằm quá xa sẽ rất khó để scan hoặc barcode nằm ở những góc thiếu ánh sáng, góc xiên sẽ không thể scan được. Nhưng khi sử dụng giải pháp của Huawei, bạn có thể tận dụng được sức mạnh của camera zoom tới 30x và 50x, tận dụng AI và machine learning để có thể scan được QR code nằm ở rất xa, góc xiên hay môi trường thiếu ánh sáng.

Ngoài ra, AI cũng có thể apply trong Awareness Kit. Đây là một giải pháp thông minh được Huawei cung cấp để lấy được user behavior và experience. Những thông tin có thể lấy được như time, location, device awareness, ambient light, weather, behavior.

Về AR Engine, sẽ giúp tăng convergence như AR Games, AR Show, AR Education, AR Shopping,…

Trong tương lai, AI sẽ giúp cho mọi thứ trở nên thông minh hơn và dễ dàng kết nối với nhau.

Bài viết được trích dẫn từ phần trình bày của anh Nguyễn Quang Nhật tại sự kiện Vietnam Mobile Day 2020 LIVE do TopDev tổ chức


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

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

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Flipkart là trang website bán hàng lớn nhất tại Ấn Độ. Với hơn 100 triệu người dùng đăng kí, cung cấp hơn 80 triệu sản phẩm đến từ 80 ngành hàng khác nhau cùng với gần 8 triệu chuyến hàng vận chuyển hàng tháng. Tuy vậy, theo số liệu chỉ ra, app web của Flipkart vẫn đang bị giảm số lượng khách hàng cũng như tỉ lệ người dùng từ bỏ app cao. Vì vậy, chúng tôi đã quyết định sẽ thiết kế lại UX của Flipkart nhằm cải thiện trải nghiệm sử dụng cho khách hàng.

Có thể nói, việc phải nhìn nhận lại thiết kế của UX là điều tất yếu nhằm tìm ra giải pháp phù hợp cho việc tạo nên một thói quen sử dụng cho khách hàng cũng như ảnh hưởng lên quyết định người dùng, bao gồm:

  • Tiếp cận khách hàng tốt hơn
  • Nâng cao hình ảnh thương hiệu của Flipkart
  • Kích thích tăng trưởng

Khách hàng mua sắm online rất nhạy cảm về giá cả. Nói cách khác, họ chẳng quan tâm sản phẩm đến từ website nào miễn là cái giá hời nhất cho họ.

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Chính vì vậy mà chúng ta luôn cần phải tự hỏi:

  • Làm sao để khiến trang web của mình là lựa chọn đầu tiên để khách hàng tìm kiếm
  • Làm sao để thuyết phục khách hàng lắng nghe thông tin của mình trước so với những đối thủ khác để rồi quyết định mùa sản phẩm của ta

Việc làm thiết kế ux ui

Sau một thời gian tìm hiểu, chúng tôi đã xác định được một số vấn đề đang tồn tại trong team thiết kế UX cho app của Flipkart – sau đây là cách chúng tôi giải quyết chúng:

Hiểu được khách hàng thông qua những câu hỏi thông minh

Điều rõ ràng là phải hiểu được suy nghĩ của khách hàng cũng như thói quen mua sắm của họ thì mới có thể tối ưu hóa trải nghiệm sử dụng cho khách hàng

Để xác định được vấn đề gốc cần phải tự hỏi “Why” 5 lần. Bằng cách tự hỏi bản thân “tại sao” nhiều lần, bạn sẽ nhìn thấu được đâu là triệu chứng và đâu mới là vấn đề thật sự

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Sau đó, Flipkart Team lại tiếp tục tự hỏi:

  • Làm thế nào để khiến khách hàng trung thành và tăng sự tương tác của họ đối với app của mình?
  • Cần phải phân tích hành vi nào của khách hàng để có thể đưa ra hướng giải pháp tốt nhất?
  • Làm thế nào để khách hàng có trải nghiệm tốt nhất cũng như đưa ra được những giá trị bền vững để khiến khách hàng luôn quay lại mua và sử dụng sản phẩm của mình?
  • Làm sao để khắc phục việc khách hàng xóa bỏ app của mình?

Với sự hợp tác từ nhiều nhóm thiết kế UX khác nhau, cùng với các lần họp lên ý tưởng, chúng tôi quyết định thay đổi chiến thuật cho UX cũng như thiết kế lại Flipkart app

Giải pháp được đặt ra là thiết kế lại app để tạo ra một trải nghiệm sử dụng hàng toàn khác biệt so với những app online mua sắm khác

Tuy vậy, trước tiên ta phải nhận ra một số thách thức được đặt ra:

Thách thức #1: Tỉ lệ khách hàng xóa app vẫn còn cao

Mối liên hệ giữa người dùng và app là rất mỏng manh: họ chỉ giữ lại những app mà họ thật sự yêu thích và xóa phần lớn những app khác. Số liệu đã chỉ ra: 77% người dùng không bao giờ sử dụng lại một app sau 72 tiếng từ lúc cài đặt. Nói cách khác, những nhà thiết kế app cần phải khiến người dùng yêu thích ứng dụng của họ ngay từ tuần đầu tiên.

Những app thành công nhất luôn là ứng dụng có thiết kế tương thích với thói quen mua sắm của khách hàng – Đó là những “sticky” app không thể thiếu và được người dùng sử dụng thường xuyên.

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Các trang web bán hàng online luôn dựa vào các sự kiện bán hàng. Đó có thể là ngày lễ hoặc là những ngày đặt biệt như sự kiện giảm giá. Một ví dụ điển hình, Amazon’s “Prime Day” là ngày bán hàng hàng giảm giá của riêng hãng và không được xem là một ngày lễ nào cả. Thế nhưng Amazon’s “Prime Day” vẫn được xem là sự kiện thành công nhất trong nghành bán hàng online với doanh số cao ngất ngưỡng, đạt 60% sale toàn cầu trong năm 2015.

Cũng trong năm 2015, Flipkart thu vào hơn 300 triệu đô nhờ vào sự kiện “Big Billion Day”, một sự kiện tương tự như Amazon’s “Prime Day”. Số lượng người  download Filpkart app cũng tăng đột biến trông thời điểm trên nhờ vào nhiều ưu đãi cho người mua hàng thông qua mobile.

Tuy vậy, ngay sau sự kiện “Big Billion Day” kết thúc, tỉ lệ người dùng xóa bỏ ứng dụng lại tăng nhanh ngay lập tức. Chỉ khoảng 30% người dùng, trước và sau sự kiện “Big Billion Day”, là vẫn giữ app. Một trong số những nguyên nhân là do sự giới hạn về mặt lưu trữ đối với dịch vụ di động (tại Ấn Độ, một số dịch vụ di động chỉ cho phép người dùng lưu trữ 20 app). Vì vậy, người dùng tại Ấn Độ thường chỉ giữ lại những ứng dụng quan trọng mà họ sử dụng thường xuyên như Facebook, Youtube, WhatApp và một số app khác.

Chúng tôi tiếp tục tìm hiểu sâu hơn về mối liên kết giữa từng loại ứng dụng và sự trung thành của người dùng

Có thể thấy, News, Sports, Weather dẫn đầu trong nhóm app được khách hàng “giữ lại”. Nguyên nhân là bởi đó là những ứng dụng cần thiết, luôn được người dùng sử dụng. Vì vậy, để Flipkart nằm trong nhóm trên thì cần phải thiết kế app theo khuôn mẫu “habbit forming” – trở nên cần thiết cho người dùng.

Thế thì “Habbit froming” app là gì? Làm sao để khiến ứng dụng cần thiết với người dùng?

Thử Thách #2: Khách hàng không có sự trung thành

Thói quen là những hành động được thực hiện trong vô thức hoặc rất ít. Các nhà nghiên cứu chỉ ra rằng khoảng 40% những gì chúng ta làm hàng ngày là thói quen. nói cách khác, khi chúng ta thích làm một điều gì đó hoặc lặp đi lặp lại một hành động thì thói quen sẽ được hình thành. Đó cũng là cách mà các nhà làm game áp dụng, họ tạo ra những game dựa trên những ý tưởng “hook” mà người dùng yêu thích nhằm khiến họ luôn quay lại và chơi game của hãng.

Qua “hook”, ta thấy được con người sẽ thực hiện một hành động nhất định để nhận được phần thưởng (Reward). nói cách khác, phần thưởng sẽ khiến chúng ta thực hiện một hành vi và từ đó tạo nên một vòng tròn hoàn chỉnh khiến người dùng luôn thực hiện hành động để nhận phần thưởng.

“Hook” bắt đầu khi người dùng nhận được một sự “kích hoạt”. Có 2 loại “kích hoạt”. “kích hoạt” bên ngoài với ví dụ điển hình là bản thông báo sản phẩm, thông tin cho người dùng. Tuy vậy, “kích hoạt” từ bên trong có tác động mạnh mẽ hơn trong việc tạo nên thói quen bền vững. Thường “kích hoạt” từ bên trong có liên quan đến cảm xúc của người dùng, họ muốn được thoải mái, vui vẻ. Đó là nguyên nhân người dùng thường xuyên sử dụng Facebook để xem ảnh hoặc Gif chó mèo khi họ buồn.

FOMO

Mỗi khi chúng ta thức dậy, đôi lúc sẽ cảm thấy lo lắng vì không cập nhật được những chuyện xung quanh. Vì vậy mà mỗi sáng, chúng ta luôn check mail, Facebook, Youtube và những app khác để được kết nối và cảm thấy an toàn. Dựa vào đó, nhóm Flipkart nhận ra cơ hội để sử dụng “kích hoat” này để khiến “hook” cho app của hãng tốt hơn.

FOMO (Fear of missing out) là một từ mới được đưa vào từ điển tiếng anh Oxford vào năm 2013. FOMO ám chỉ nổi sợ khi chúng ta mất đi sự liên kết với môi trường và xã hội xung quanh khiến cho ta phải luôn check thông tin thông qua nhiều app khác nhau.

Để có thể tạo ra một “hook” tốt thì cần phải có khuôn mẫu UX khả thi và phù hợp. Để có được điều đó thì ta phải chấp nhận rằng phương thức thông báo kiểu cũ không còn hiệu quả bởi người dùng không còn quan tâm đến thông báo như trước.

Flipkart có hơn 80 triệu sản phẩm thuộc hơn 80 nhóm khác nhau. Vì thế, việc phân chia sản phẩm phù hợp với khách hàng dựa trên sở thích, vị trí là điều không thể thiếu. Do vậy, một thức thách khác được đặt ra.

Thử thách #3: Sự liên quan và cá nhân hóa

Một nhóm người dùng Kipflart được phỏng vấn về cách thức họ mua sắm online. Kết quả cho thấy, người dùng thường chỉ mua sản phẩm liên quan và tương đồng với sở thích, tính cách cũng như cần thiết với họ. Chúng ta đều biết, hệ thống gợi ý sản phẩm (traditional model) cho người dùng dựa vào thói quen mua và sử dụng sản phẩm trong quá khứ. Tuy vậy, đối với Flipkart, nó chỉ giải quyết được 1 phần vấn đề. Chúng tôi nhận ra rằng người dùng sẽ hay mua một sẩn phẩm dựa vào 2 tiêu chí (Themes):

  1. Ý định: Người dùng tìm kiếm sản phẩm mà họ đã xác định được ngay từ đầu. Nói cách khác, ta cần phải quan sát và theo dõi nội dung tìm kiếm (“online searching”) của từng người dùng.
  2. Sở thích: Người dùng tìm kiếm sản phẩm trong phạm vi xa hơn, gồm nhiều loại sản phẩm khác nhau nhưng đều nằm trong sở thích của người dùng. Nói cách khác, nó tùy thuộc vào sở thích cũng như xu hướng. Một ví dụ điển hình là người dùng có sở thích với leo núi, cặp và xe mô tô cũng sẽ thường xuyên tìm kiếm những sản phẩm trong các nhóm trên.

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Phân loại vs Kết nối

Sau khi đã giản lược đi hàng triệu sản phẩm thành một số nhóm nhỏ hơn. Chúng tôi cần phải sắp xếp những sản phẩm trong những group đó sao cho tương đồng với sở thích của người dùng.

Qua quan sát người dùng, chúng tôi nhận ra họ thường tìm kiếm và mua sản phẩm dựa theo từng nhóm chủ đề. Vì vậy, Flipkart đặt ra một set các tag khác nhau cho từng loại sản phẩm nhằm tạo ra kết nối đến người dùng có sở thích và chủ đề tương đồng. Thay vì sử dụng khuôn mẫu sắp xếp và phân chia theo loại, chúng tôi thay đổi cách tiếp cận và sắp xếp các sản phẩm dựa theo “chủ đề” phù hợp.

Để tạo ra một ma trận chủ đề kết nối với nhau và với người dùng, Flipkart đã yêu cầu người dùng chọn những tag và chủ đề theo ý thích của họ nhằm tạo nên những “câu chuyện” riêng về từng khách hàng – a customer persona

Kết quả là một vụ trũ thông tin chứa đựng sở thích khách hàng được tạo ra vững chắc và kết nối với một vũ trụ thông tin khác của các sản phẩm, phục vụ cho việc shoping của từng khách hàng phù hợp với ý định cũng như sở thích của họ.

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Mục tiêu của Flipkart là để người dùng không chỉ xem sản phẩm họ đang tìm kiếm mà còn các sản phẩm khác nằm trong sở thích của họ. Nhờ đó mà tạo ra cảm giác phong phú trong sự lựa chọn sản phẩm cho người dùng mà không gây cảm giác mơ hồ, lộn xộn.

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

 

Giải pháp: Thông báo ngắn gọn hàng ngày

Internet chứa đựng lượng thông tin gần như là vô tận. Tuy vậy, khách hàng thì chỉ muốn những thông tin thiết thực và chất lượng. Do đó, Flipkart đã phải xây lại một search engine mới từ con số 0.

Feed vô tội vạ vs có chừng mực

Chúng tôi đã quyết định chỉ sử dụng một bài thông báo ngắn gọn hàng ngày về một set các sản phẩm nhất định cho từng khách hàng. tất nhiên là nội dung sản phẩm luôn được thay đổi nhưng vẫn phù hợp với sở thích của người dùng. nói cách khác, Flipkart nhận ra nếu cứ đưa ồ ạt thông tin của tất cả các sản phẩm cho khách hàng sẽ khiến người dùng bị bối rối, nhầm lẫn và dẫn đến không quan tâm đến các thông tin đó.

Vì vậy cứ mỗi buổi sáng, từng khách hàng sẽ nhận được thông báo về thông tin sản phẩm thích hợp với họ (daily digest)

Cải thiện “Hook” để tăng khả năng thành công hình thành thói quen online shopping từ người dùng

Điều cốt lõi của giải pháp mà Flipkart đề ra chính là việc sử dụng “Hook” để tạo thói quen shopping cho người dùng nhằm thu hut khách hàng tiềm năng sử dụng app của hãng.

Chúng ta đã biết khách hàng sẽ dễ chấp nhận tham gia vào một sự kiện nếu như họ được nhận một phần thưởng cho việc đó. Thế nên, Flipkart sử dụng “daily digest”, một loại hình thông báo dựa trên các chủ đề và sở thích của từng người dùng.

“Daily digest”, giải pháp của Flipkart được thiết kế dựa vào sự hiểu biết của hãng về thói quen của khách hàng. Cùng với việc chỉ đưa ra thông báo về một nhóm các sản phẩm mà hãng chắc chắn người dùng quan tâm tới, Flipkart có thể tận dụng được thói quen mua sắm online bằng điện thoại vốn đã ăn sâu vào người dùng.

Thay vì cứ cố gắng thay đổi thói quen mua sắm của khách hàng hoặc thuyết phục họ tin vào Flipkart, chúng tôi cho người dùng thêm nhiều lựa chọn để củng cố thêm thói quen mua sắm dựa trên hành vi FOMO – fear of missing out

Các hãng mua sắm trực tiến vẫn đang tranh đua với nhau nhằm thu hut khách hàng mà theo dự đoán của giới chuyên gia là sẽ đạt mức 4 tỉ vào nằm 2020. Tuy vậy, những ông lớn thành công và đứng đầu sẽ vẫn là những người biết hướng tới sự cải thiện vào đổi mới thay vì dựa vào công thức tiếp cận khách hàng cũ kỹ.

Bí mật giúp thiết kế UX cực hiệu quả cho sản phẩm e-commerce

Tương lai của ngành mua sắm trực tuyến nằm ở khả năng thu hút người dùng nhờ vào cách tiếp cận dựa trên sự tương đồng về sở thích, thói quen của khách hàng chứ không đơn giản là phân loại sản phẩm và ép buộc người dùng mua sản phẩm mà hãng muốn.

Nguồn: Techtalk via Toptal

10 bí kíp để startup và FinTech startup thành công đột phá

Ngày càng nhiều ngân hàng đang xem xét việc hợp tác với các Fintech startups và biến họ trở thành đồng minh của mình. Vấn đề đặt ra là làm sao chọn được ứng viên phù hợp trong nhiều doanh nghiệp đang hoạt động trong lĩnh vực FinTech?

Sau đây là 10 bí kíp mà bất kỳ Fintech startup nào cũng nên nắm rõ để không bỏ lỡ cơ hội hợp tác với các ngân hàng lớn trong tương lai.

1. Huy động đủ nguồn vốn hỗ trợ

Hãy xác định trước khi bắt đầu dự án là chi phí luôn bị đội lên gấp hai và thời gian sẽ tốn thêm gấp ba lần so với dự tính.

Có thể thấy được rằng tạo dựng nguồn vốn không đủ cho công ty thường có mức độ ảnh hưởng nhanh hơn tất cả những gì startup đã dự tính trước. Khi startup nhận ra cần bổ sung kinh phí hoạt động, họ thường không tính đến thời gian trước khi tiền được chuyển vào từ nhà đầu tư.

Thời gian để các nhà đầu tư xem xét cấp vốn có thể mất từ 3 tháng đến 1 năm. Đó là chưa tính đến việc họ phải kiểm duyệt nhiều lần, làm chậm trễ rất nhiều hoạt động của startup.
Thậm chí, nhiều startup còn cho rằng khách hàng sẽ tự tìm đến sản phẩm của mình, đặc biệt là những mối quan hệ từ ngân hàng nên theo họ, chi phí kinh phí Marketing là không cần thiết.

Nhưng, nên nhớ rằng chỉ cần vụ mua bán này thất bại hoặc bị trì hoãn, startup của bạn sẽ trở nên “nguy kịch”

Các FinTech startups nên tìm nhiều nguồn liên kết vốn càng sớm càng tốt; không bao giờ phụ thuộc vào thỏa thuận hứa hẹn ban đầu rồi mới xét đến thương vụ tiếp theo mà phải tiếp tục tìm các hợp đồng hợp tác khác. Và cuối cùng, hãy dành nguồn kinh phí lớn cho các hoạt động Marketing.

Kết quả hình ảnh cho funding

2. Ước lượng thời gian của chu trình bán hàng

Nếu bạn đang có giải pháp kinh doanh FinTech cho bất kì tổ chức tài chính nào – cả tổ chức nhỏ hoặc ngân hàng tiền tệ trung tâm – đều phải chấp nhận một chu trình bán hàng dài hạn, gian khổ với nhiều sự chậm trễ.

Các FinTech startups thường nghĩ rằng sản phẩm hay dịch vụ của họ là tốt nhất và hay coi thường các nguyên tắc về thời gian khi họ bán sản phẩm, dịch vụ của mình cho các tổ chức tài chính. Tuy nhiên, FinTech startups cần phải kiên nhẫn và suy nghĩ thực tế để xây dựng một chu trình bán hàng dài hơn trong kế hoạch hoạt động – ít nhất là 18 tháng.

3. Tìm hiểu kỹ về thị trường

Nhiều startup luôn tin rằng giải pháp của công ty mình sẽ thay đổi hoàn toàn cách vận hành của ngân hàng và không cần phải sử dụng những công cụ đang có.

Trừ trường hợp bạn hợp tác tốt với những đơn vị khác, còn không nguyên tắc “Khách hàng sẽ tự tới” không thể áp dụng trong lĩnh vực FinTech.

4. Xây dựng chiến lược bán hàng thành công

CEO là người biến tất cả các kế hoạch trở nên khả thi nhưng thực tế là những người sáng lập của Fintech startup thường là các kỹ thuật viên phần mềm có ít kỹ năng về Marketing và bán hàng. Vì vậy, bước đầu tiên của các CEO và Người sáng lập là phải học hỏi thêm kinh nghiệm về bán hàng và Marketing, chuẩn bị đầy đủ những kiến thức cần thiết trong những bước đi đầu tiên.

5. Chia sẻ cơ hội bán hàng với tất cả nhân viên kinh doanh

Bạn phải luôn có những nhân viên kinh doanh dưới trướng của mình, phòng hờ trường hợp “nhân viên superstar” xin nghỉ việc. Chuyện startup thuê những người đại diện bán hàng thời vụ chỉ xuất hiện khi có đơn đặt hàng lớn là chuyện bình thường.

 

Hình ảnh có liên quan

Đừng để việc như thế này xuất hiện “Bob của chúng ta, cậu ấy biết giám đốc của 3 ngân hàng và đã chốt deals xong, vì vậy chúng ta không cần nỗ lực bán hàng trong năm nay nữa. Sau khi Bob thực hiện các hợp đồng bán hàng, chúng ta có thể bắt đầu tuyển nhân viên kinh doanh cho năm sau”

Và hãy đưa ra cho nhân viên kinh doanh những lý do hợp lý để họ cam kết ở lại với công ty với các cổ phần vốn ưu đãi. Ngoài ra, một nhân viên kinh doanh nên biết về mục tiêu dài hạn của công ty: chiến lược thoái vốn là gì? Công ty có tiềm năng cho một thương vụ sáp nhập không? Liệu nhân viên có biết họ sẽ được tưởng thưởng thế nào nếu làm việc trung thành trong 5 năm?

6. Hãy khởi đầu tốt

Bạn chỉ có duy nhất một cơ hội để gây ấn tượng với thị trường. Các tổ chức tài chính sẽ bỏ qua những công ty không thể truyền đạt chính xác những gì công ty đó muốn. Tại sao khách hàng/ các nhà đầu tư tiềm năng nên mua sản phẩm của công ty bạn và mua sản phẩm đó với giá trị chính xác bao nhiêu – xét cả về thời gian lẫn tiền bạc

Nếu công ty của bạn vẫn đang trong quá trình tìm hiểu sản phẩm và phân khúc thị trường, vậy thì đừng bán sản phẩm.

Khi cần, bạn hãy chi thêm tiền vào bộ phận nghiên cứu và phát triển sản phẩm để xây dựng một giải pháp bán hàng khả thi. Không bao giờ để nhân viên của bạn đem bán ra thị trường một sản phẩm hoặc một dịch vụ nào đó chưa hoàn chỉnh.

7. Rộng rãi trong thời gian chuẩn bị bán hàng

Những người làm trong lĩnh vực FinTech thường xuyên phải bỏ ra 5 đến 6 năm “mồ hôi nước mắt” cũng như sống tiết kiệm để đầu tư vào một dự án tâm huyết. Đó là kiệt tác, là tầm nhìn của họ và chỉ có họ mới kể câu chuyện của mình một cách tốt nhất.

Mọi yếu tố của bản thuyết trình bán hàng đều được họ hoàn thiện và chuẩn bị kỹ càng như một vở kịch Shakespears. Những bài thuyết trình bán hàng tuyệt vời không thể chỉ qua một đêm là có được. Thế giới kỹ thuật số làm thay đổi khả năng tập trung của con người. Bây giờ không còn ai sử dụng một bản Powerpoint 50 trang nữa. Những slide ngắn gọn, đơn giản với nhiều hình ảnh minh họa đã trở thành chuẩn mực Powerpoint mới.

8. Đừng bao bọc mọi thứ quá kỹ càng

Đừng để cơ hội vuột mất khỏi tầm tay do quá bao bọc giải pháp của công ty mình. Tuy rằng, CEO của những FinTech startup thành công không bao giờ tiến hành bất cứ điều gì mà không có sự kiểm tra, kiểm soát kỹ càng. Thực tế, một khi công ty bắt đầu vận hành thành công, danh tiếng công ty đã lấp đầy truyền thông thông qua chính sách PR và Marketing táo bạo.

Điều quan trọng nhất là nên thiết lập ưu thế tiếp cận đầu tiên tại thị trường thông qua các hoạt động PR và Marketing hơn là chờ đợi đến khi có đối thủ cạnh tranh thì mới bắt đầu truyền thông cho sản phẩm của mình.

9. Trang web phải sẵn sàng khi bắt đầu chạy sản phẩm

Hãy nhớ rằng trang web là “mặt tiền”, là lý do khiến khách hàng quay lại thường xuyên, dành thời gian cho đến khi họ mua hàng. Nếu trang web chưa sẵn sàng hoạt động, hãy để dòng chữ “Sorry you found our homepage. We’re not ready for any business” tại trang chủ.

Kết quả hình ảnh cho 404 not found

Cho dù đó là sản phẩm hay dịch vụ nào thì trang web cũng là một công cụ bán hàng và Marketing đắc lực. Hãy xây dựng trang web của bạn trước khi bắt đầu bán hàng. Nên nhớ, trang web nên cung cấp 90% thông tin về sản phẩm dịch vụ của bạn cho những khách hàng tiềm năng.

10. Tư duy sản phẩm phải độc lập

Trước khi một công ty đạt được tham vọng của mình, họ phải nỗ lực hết sức để xây dựng các mối quan hệ đối tác hoặc ít nhất là liên kết với các ngân hàng tương đương.

Có khả năng startup của bạn đang phát triển một giải pháp tương tự với các giải pháp cốt lõi giữa các ngân hàng. Tuy nhiên ta thường thấy các ngân hàng mua sản phẩm của FinTech startup nếu sản phẩm chứng minh được sự vượt trội. Startup cũng nên tìm kiếm sự tư vấn từ các chuyên gia trong ngành, các nhà phân tích và các phương tiện hỗ trợ truyền thông. Đây là những lực lượng ảnh hưởng đến những giá trị cốt lõi và ảnh hưởng đến cả các tổ chức tài chính

Nguồn: Techtalk via bankingexchange

Các kênh Youtube mà developer và designer không thể không Subscribe

các kênh youtube

Youtube đang dần trở thành TV của thế hệ mới – và người ta đang phụ thuộc ngày càng nhiều hơn vào Youtube để cập nhật những thông tin mà họ quan tâm. Dưới đây là một số kênh design và công nghệ nổi tiếng bạn có thể theo dõi.

Tác giả: Fabricio Teixeira

For Designers

The Futur

Channel này có nội dung khá dang dạng, từ thiết kế UX, đến Branding, trải đến Business. Các video được sản xuất rất kỹ và có đầu tư.

 

Howard Pinsky

Adobe Photoshop với nhiều kỹ thuật khác nhau, như text effects, photo composition, photo retouch, photoshop cơ bản, special effects,… Đặc biệt, giọng đọc của Howard rất dễ nghe.

Laith Wallace

Lời khuyên, công cụ, và nguồn động lực cho những ai đang theo học UX/UI Design, các doanh nghiệp nhỏ và cá nhân mong muốn bắt đầu sự nghiệp về UX.

No Divide

Là nơi học tập và tìm cảm hứng trong ngành thiết kế web. Trong loạt video #LetsTalkDesign của mình, tác giả bàn về một loạt chủ đề đang dạng như sự nghiệp, học tập và quản lý các dự án thiết kế.

UX Hacker & Sketch TV

Các bài hướng dẫn về Sketch App, lời khuyên cho prototype gồm có InVision, Marvel và Principle.

Adobe Photoshop

Cái này thì chắc khỏi cần giới thiệu.

Mike Locke

Từ hướng dẫn phần mềm đến lời khuyên sự nghiệp; đây là kênh nội dung đa dạng liên quan đến Design và UX.

High Resolution

Tuy chỉ mới ra mắt, nhưng channel này đã có thể mang đến những cuộc phỏng vấn với senior designers về quan điểm, cách giao tiếp và triển khai thiết kế của các công ty lớn.

Sarah Doody

Video chân thật về lời khuyên sự nghiệp trong ngành thiết kế, công nghệ và kinh doanh.

Expose UX

Web series về trải nghiệm người dùng, tại đây startup founder tìm sự trợ giúp từ các chuyên gia về UX.

UX Salon

Mỗi tháng là một video mới về những ý kiến độc đáo từ các chuyên gia đi đầu về User Experience và Design. Các video là những chuỗi đối thoại đầy thú vị.

UX Mastery

 Kênh Youtube bổ ích với những video dễ hiểu về UX cùng các thách thức trong nghề.

Better Elevation

Kênh Youtube giải thích lý do và cách thức làm ra thứ này thứ kia. Số lượng video không quá đáng kể, mang đến một số lý giải kỳ thú về những chủ đề hay ho như The Future of Interfaces, và Designing for Humans.

CareerFoundry

Hỗn hợp hội thảo web, phỏng vấn, và video truyền cảm hứng về thiết kế và UX. Đôi khi có chèn vào một ít nội dung được tài trợ.

Mackenzie Child

Product Designer và Illustrator chia sẽ các bài hướng dẫn thiết kế landing pages, illustrations, wireframes…

Topic: User Experience

Bên cạnh các kênh cụ thể trên, bạn cũng có thể follow topics trên interest — như User Experience, chẳng hạn.

For Developers

DevTips

Video hàng tuần về chủ đề phát triển và thiết kế web. Playlists gồm có Design Thinking, CSS, Responsive Design…

Ihatetomatoes

Channel về lập trình Front-end với rất nhiều hướng dẫn về web animation, deconstructions cùng thủ thuật cho các developers và designers front-end. Được cập nhật hàng tuần.

Google Developers

Được cập nhật khá thường xuyên, Kênh Youtube này được rât nhiều lập trình viên tại Google liên tục cung cấp thông tin, và bàn đến nhiều chủ đề như Android, Chrome, và Web Development.

Code Course

Kênh Youtube giúp bạn học cách code, với lượng lớn videos đào sâu vào từng công nghệ một.

LevelUp Tutorials

Kênh Youtube nhắm vào vấn đề nan giải trong việc học công nghệ — sự thiếu hụt các bài hướng dẫn chuyên sâu, cơ bản; dạy bạn nhiều hơn những gì bạn đã gõ vào thanh tìm kiếm.

LearnCode.Academy

Hướng dẫn lập trình web theo các chủ đề như HTML, CSS, JavaScript, Responsive Design, React.js, Node.js, Angular.js, Backbone.js, Docker,…

The New Boston

Các chủ đề xoay quanh lập trình Angular, Node.js và Android.

JREAM

Hướng dẫn lập trình phần mền với các chủ đề: PHP, Python, JavaScript, Node, Front-End, Linux, Photoshop, Illustrator, và các chủ đề tương tự.

Sass Bites

Một channel nữa với hướng dẫn và phỏng vấn về lập trình.

TheDigiCraft

Nhiều mặt về coding — PHP, AJAX, CSS Media Queries,…

The New Boston

Hướng dẫn video cho lập trình viên về các ngôn ngữ như Java, HTML5, Angular và các framework lập trình khác.

Techtalk via medium

Xem thêm: Developer Job hay Designer job lương cao hấp dẫp tại Topdev.vn

Tăng trưởng thị phần nhờ phân loại khách hàng và tối ưu theo thời gian

tối ưu trải nghiệm người dùng
Tăng trưởng thị phần nhờ phân loại khách hàng và tối ưu theo thời gian

Sau hơn 6 năm làm việc ở những công ty tăng trưởng rất mạnh mẽ, giành được nhiều thị phần trong khoảng thời gian ngắn, mình muốn chia sẻ với mọi người cách để tối ưu trải nghiệm người dùng, những hướng tiếp cận có thể áp dụng vào doanh nghiệp của mình trong thời gian tới. Mẫu số chung của những doanh nghiệp thành công là gì và làm thế nào để áp dụng vào công ty của bạn, liệu chúng ta có bị cản trở vì thiếu tiền hay chọn sai thị trường hay không?

tối ưu trải nghiệm người dùng

Các công ty hiện tại đang phát triển không chỉ nhờ lựa chọn đúng thời điểm, đúng thị trường mà còn vì họ làm việc một cách tối ưu hóa và rất chi tiết. Mọi thông tin và số liệu đều được cập nhật theo từng ngày. Họ làm document rất tốt, theo dõi tất cả mọi thứ rất cặn kẽ.

tối ưu trải nghiệm người dùng

Làm thế nào để đạt được hiệu quả khi tối ưu trải nghiệm người dùng?

Trước tiên là sự khác biệt trong cách tiếp cận vấn đề. Mỗi một giai đoạn bạn sẽ được giao một ngân sách nhất định và mục tiêu là làm thế nào để với ngân sách giới hạn đó, bạn có thể tối ưu hóa hiệu quả công việc.

Phân tích Business view

Khách hàng từ hai nơi là Hồ Chí Minh hoặc Hà Nội mua hàng thông qua hình thức offline hoặc online (app/web). Khi mua hàng online, dữ liệu khách hàng sẽ được lưu trữ trong hệ thống Data Warehouse, lúc đó mình sẽ biết được khách hàng đã mua hàng như thế nào, tính toán được lợi nhuận so với mức chi phí đã bỏ ra.

tối ưu trải nghiệm người dùng

Hiện tại hầu hết các doanh nghiệp đang sử dụng các công cụ khác nhau để theo dõi việc kinh doanh. Để tracking traffic trong app hoặc web, bạn có thể sử dụng Appsflyer / Adjust / Kochava để quan sát các số liệu về tỷ lệ organic vs inorganic, CPI/installation từ Facebook hoặc Google, phải tốn bao nhiêu chi phí để khách hàng submit một order.

Ở giai đoạn thứ 2, sau khi khách hàng đã hoàn tất việc mua hàng thì có thể thấy được hành vi mua hàng của khách trong app/web như thế nào, tỉ lệ bounce rate, cancel ra sao. Cuối cùng, sau khi đã có được dữ liệu hoàn chỉnh trong data warehouse, bắt đầu quá trình phân tích dữ liệu Data Studio, Big Query,…

  Thực tế ảo - trải nghiệm công nghệ mới lạ ở Việt Nam
  App User Centricity: Làm sao tăng tỷ lệ duy trì lên 66%?

Nhưng vấn đề là nếu tiếp tục phát triển theo hướng này, tất cả những thứ mà business làm chỉ đơn thuần là làm thế nào để thúc đẩy khách mua hàng nhiều hơn, đơn hàng lớn hơn trong khi chưa thật sự quan tâm đến trải nghiệm của user, nên không thể tạo ra các loyal user. Vì thế câu hỏi đặt ra ở đây là làm thế nào để gia tăng trải nghiệm người dùng?

Làm thế nào để tăng trải nghiệm người dùng?

Thay vì đặt câu hỏi xem làm cách nào để tối ưu hóa việc sử dụng tiền của doanh nghiệp, việc định hướng cách làm thế nào để tạo ra giá trị mà khách hàng thích nhất xuyên suốt trải nghiệm mua hàng là một trong những giải pháp hữu ích.

Tối ưu trải nghiệm người dùng trong bài chia sẻ này sẽ được phân ra thành 4 chặng:

  • Firsting stage: đây là giai đoạn cả hai bên vẫn chưa biết gì nhau.
  • Dating stage: giai đoạn này đã có tiếp xúc một cách tương đối khi khách hàng vào app/web và đặt đơn hàng thành công.
  • In-a-relationship stage: đây là giai đoạn từ lúc khách hàng mua đến khi nhận được đơn hàng.
  • Marriage stage: lúc này khách hàng đã unbox món hàng và quyết định có mua lại sản phẩm đó nữa hay không. Điểm cuối cùng của giai đoạn này mình muốn tạo ra một khách hàng “heathy and balance” – sự khỏe mạnh theo đúng tính chất mà họ có. Làm thế nào để giúp khách hàng có trải nghiệm mua hàng tốt nhất và phù hợp nhất với họ. Đó chính là nền tảng cho sự phát triển của một doanh nghiệp.

Firsting stage

Một người trung bình mỗi ngày sẽ nhận khoảng 46 thông báo mới trên điện thoại từ Facebook, Instagram, các phần mềm thanh toán, email,… Nếu chúng ta cố gắng bắn cho khách hàng thêm một thông báo nữa cũng sẽ trở thành một thứ mờ nhạt trong số đó. Do đó bạn cần tạo ra một thông báo thật sự đáp ứng đúng những gì khách hàng đang cần thì họ mới để tâm đến thông báo này.

Cuộc chiến này không chỉ nằm ở thông báo trên điện thoại mà còn ở Facebook, Google, tất cả những kênh thông tin nào mà chúng ta tiếp cận khách hàng. Và trở ngại chính là các đối thủ của chúng ta cũng sẽ tiếp cận khách hàng ở những kênh thông tin tương tự như thế.

Điểm thứ hai cần cân nhắc là khi làm về marketing, về truyền thông, chúng ta nên cố gắng tận dụng những trend đang có trên thị trường để tăng hiệu quả về hiển thị. Điều quan trọng là chúng ta phải biết cách cân bằng giữa tính chất thương hiệu với xu hướng đó. Nếu không phù hợp với nhau rất dễ tạo ra sự bất đối xứng và không gây được ấn tượng với khách hàng.

Dating stage

Giai đoạn này quyết định trải nghiệm mua hàng của khách hàng sẽ như thế nào. Trung bình trên điện thoại mỗi người sẽ có từ 60 – 90 apps nhưng chúng ta chỉ thực sự sử dụng khoảng 3 apps. Do đó việc làm sao để khách hàng truy cập vào app của mình thật sự rất quan trọng.

Vấn đề thứ 2 là giữa khách hàng nữ và nam, khách hàng mới và cũ, liệu họ có thể nhìn thấy được các vấn đề giống nhau hay không? Có gì cuốn hút họ vì nó đã được cá nhân hóa cho phù hợp với tính chất của họ hay không.

tối ưu trải nghiệm người dùng
Các giai đoạn của quá trình tối ưu trải nghiệm người dùng

In-a-relationship stage

Giai đoạn này có hiệu ứng tâm lý cần để tâm, đó là nếu trong khoảng thời gian chờ đợi món hàng, khách hàng không phải làm gì hết thì họ sẽ thấy việc chờ đợi này lâu hơn so với thời gian thực tế rất nhiều. Từ đó tạo ra trải nghiệm rất tệ cho khách hàng và việc tối ưu trải nghiệm người dùng gần như là không thể.

Thêm vào đó, một đơn hàng lớn liệu có thật sự tốt hay không? Thực tế là mỗi khách hàng sẽ có mức thu nhập khác nhau và cách chi tiêu khác nhau nên chúng ta không thể đánh đồng cách chi tiêu của mọi khách hàng đều như nhau được. Không chỉ đơn giản là làm thế nào để khách hàng mua được nhiều hơn mà còn phải làm thế nào để giúp họ chi tiêu một cách thông minh nhất trong số tiền hàng tháng mà họ có.

Marriage stage

Nếu khách hàng thật sự thích sản phẩm thì làm thế nào để kích thích họ chia sẻ thông tin và nên chia sẻ những gì? Đa phần khách hàng sẽ chia sẻ về tinh thần của thương hiệu, trải nghiệm mua hàng như thế nào hay chỉ đơn giản là việc họ mua món hàng với giá rất rẻ. Người chủ doanh nghiệp cần nhìn nhận xem mình muốn tạo ra giá trị gì cho khách hàng chia sẻ.

Thật ra có một trải nghiệm tâm lý khác, đó là khi khách hàng không thể nhớ hết toàn bộ trải nghiệm này mà họ chỉ nhớ lúc họ vui nhất, lúc họ tệ nhất và khi nhận hàng, sản phẩm như thế nào mà thôi. Do đó mọi người cũng nên cân nhắc về trải nghiệm tâm lý này.

Tối ưu trải nghiệm người dùng thông qua mỗi quy trình làm việc riêng biệt

1. Phần đầu tiên là Psychographic segment (Personas): chia khách hàng thành những nhóm khác nhau dựa trên yếu tố tâm lí.

2. Phần thứ hai là Behavioral segment: dựa trên hành vi mua hàng của khách hàng để phân chia.

3. Phần thứ ba là Performance: khả năng chi tiêu và hành vi mua hàng sau một khoảng thời gian sẽ như thế nào. Mô hình RFM thường được dùng trong hình thức này.

4. Phần thứ tư là giai đoạn Willing to share: dùng “Net Promoter Score” segment làm rõ vấn đề xem ai là người chia sẻ trải nghiệm và giới thiệu nhãn hiệu của mình với những người khác.

Để dễ hiểu hơn, mình sẽ chia sẻ về cách làm việc ở mỗi giai đoạn theo thứ tự từ dưới lên:

NPS segment

Chia khách hàng thành 3 nhóm:

  • Promoter: những người sẵn sàng giới thiệu thương hiệu, sản phẩm của mình với người khác.
  • Passive: những người không có ý định làm gì.
  • Detractors: những người thật sự không thích sản phẩm.

RFM segment

Khách hàng sẽ được chia thành rất nhiều nhóm khác nhau dựa trên đóng góp chi tiêu của họ như thế nào. Bằng cách chia nhiều loại khách hàng như thế có thể tạo ra những coupons riêng biệt. Cá nhân mình thấy RFM hoạt động cực kỳ hiệu quả và dễ dàng ứng dụng. Đặc biệt trong thời điểm Covid-19 này, bạn có thể bán cả Cash vouchers cho khách hàng.

Có nhiều cửa hàng trong thời kỳ giãn cách xã hội sẽ không có traffic đến cửa hàng nữa, nên họ rất cần tìm cách để giữ được mối quan hệ với khách hàng trong khoảng thời gian họ không đến tiệm, cũng như tối ưu hóa được hiệu suất làm việc của nhân viên khi work from home. Đối với nhóm khách hàng Loyal và Champions thì việc họ mua cash vouchers để dùng sau này sẽ rất cao. Từ phía doanh nghiệp, không chỉ khắc phục được những nhược điểm trên mà còn tối ưu được dòng tiền.

Behavioral segment

Giai đoạn này chia nhóm khách hàng dựa trên hành vi mua hàng của họ. Ở app/web, dữ liệu được lưu trữ rất nhiều nên có thể dùng machine learning, các thuật toán về gom nhóm để làm việc.

Psychographic segment

Giai đoạn này phân loại khách hàng dựa vào mặt tâm lý. Có 3 mô hình chính mà mọi người có thể tham khảo: Myers-Briggs type, Big Five personality traits, The nine Enneagram type.

The nine Enneagram type là mô hình được lựa chọn nhiều nhất vì 2 mô hình đầu tiên quá khó để thu thập dữ liệu. Với mô hình thứ 3 mọi người có thể tạo ra những hướng tiếp cận riêng, phân loại khách hàng và tạo những coupons phù hợp. Nó không còn là vấn đề giá trị coupons đến mức nào nữa mà đã trở thành nội dung truyền thông bạn đẩy đến họ có phù hợp hay không.

Vậy đối với những công ty nhỏ, không đủ ngân sách đáp ứng các công cụ này thì giải pháp là gì? Với một số tiền nhất định, bạn có thể sử dụng hiệu ứng tâm lý The Peak-end Rule. Với hiệu ứng này, trải nghiệm mua hàng của khách hàng phụ thuộc vào 2 thời điểm, thời điểm cao nhất và thời điểm kết thúc. Điều đó có nghĩa, nếu bạn không có quá nhiều tiền, trong 4 giai đoạn ở trên bạn có thể tập trung vào giai đoạn mà công ty làm tốt nhất để hoàn chỉnh hiệu suất công việc của mình cũng như tối ưu trải nghiệm người dùng.

Bài viết được trích dẫn từ phần trình bày của anh Mạnh Phan tại sự kiện Vietnam Mobile Day 2020 LIVE do TopDev tổ chức


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

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

Xây dựng nội dung và tận dụng Google Assistant theo nhiều cách khác nhau

google assistant
Những cách làm việc khác nhau với Google Assistant

Google Assistant là trợ lý ảo của Google. Đây là kết quả phát triển từ tính năng Android Google Now, mục đích là cung cấp cho người dùng những thông tin mà không cần bạn phải hỏi. Google Assistant được xem là đối thủ cạnh tranh với Siri của Apple, Alexa của Amazon và Cortana của Microsoft.

Google Assistant hiện đang hỗ trợ với hơn 19 ngôn ngữ ở hơn 80 quốc gia. Google Assistant cũng có mặt trên các thiết bị smart display, android phone, iphone, google home và rất nhiều các thiết bị khác. Chúng ta có thể tận dụng các lợi thế đó của Google Assistant để phục vụ cho công việc và sử dụng platform này cho việc hoạt động trên Google.

google assistant
Google Assistant giúp các lập trình viên thuận lợi hơn trong quá trình làm việc

Nếu là một web content owner, bạn có thể sử dụng Content Actions: recipes, how-tos, podcasts, news,… Nếu là lập trình viên Android app, bạn có thể sử dụng App Actions. Hoặc với Innovator cho các nền tảng chat, bạn có thể sử dụng Conversational Actions trong Interactive Canvas. Ngược lại, nếu là một Hardware developer, bạn có thể sử dụng Smart home SDK.

  10 Add-on Google Sheets phải có dành cho các Recruiters
  AWS, Azure và Google Cloud là gì? Chứng chỉ nào tốt nhất cho sự nghiệp của bạn?

Content Actions – giải pháp cho nội dung trở nên tuyệt vời hơn cùng Google Assistant

Bạn có thể build website bằng cách tìm kiếm các giả định trên Google để phục vụ cho công việc. Với một website, podcasts, news, recipes, FAQs, how-to bạn có thể đồng bộ thông tin thông qua Google Assistant. Đánh dấu cấu trúc dữ liệu để làm cho các contact available trong những tìm kiếm mang tính kết nối.

App Actions

Kích hoạt chức năng giọng nói cho các apps trên thiết bị Android

App Actions cho phép người dùng khởi chạy các tính năng cụ thể trong ứng dụng bằng Google Assistant. Thông qua việc kích hoạt App Actions để mở rộng ứng dụng, người dùng có thể dễ dàng liên kết sâu hơn và làm việc với Assistant khi nói yêu cầu của mình với Assistant. Nó kết nối với người dùng trên gần 18 thiết bị Android phones khác nhau, thông qua việc sử dụng tính năng hiểu ngôn ngữ tự nhiên của Google để làm việc trong ứng dụng.

Đưa thông tin trực tiếp vào hệ thống

Đầu tiên, người dùng có thể nói yêu cầu của mình vào thiết bị. Sau đó thiết bị sẽ xác nhận yêu cầu của user và những thông tin cần thiết sẽ được xử lý.

Xem thêm 10 Add-on Google Sheets phải có dành cho các Recruiters

Built-in Intents

Built-in Intents (BII) là hình thức mô hình hóa những cách phổ biến mà người dùng thể hiện các nhiệm vụ họ đang cố gắng thực hiện, hoặc thông tin họ tìm kiếm, chẳng hạn như đặt một bữa ăn, đặt một chuyến xe hay kiểm tra số dư tài khoản. Việc xây dựng App Actions yêu cầu bạn triển khai các built-in intents (ý định có sẵn). Khi xây dựng App Actions, bạn nên nghiên cứu và thử nghiệm với tất cả BII có liên quan đến chức năng trong ứng dụng của bạn để có thể cung cấp trải nghiệm tốt hơn cho những người dùng muốn kích hoạt App Actions.

Android Slices

Slices là các mẫu giao diện người dùng có thể hiển thị nội dung phong phú và tương tác từ từ trong ứng dụng Google Search và cả ở những nơi khác như Google Assistant.

Smart Homes – Kiểm soát thiết bị bằng giọng nói

Phân loại và đặc điểm các thiết bị thông minh cho gia đình

Các loại thiết bị smart home được hỗ trợ hiện nay khá đa dạng với những đặc điểm riêng mà bạn có thể lựa chọn sao cho phù hợp với nhu cầu của mình. Các loại thiết bị này đều khai thác khả năng xử lý ngôn ngữ tự nhiên của Google Assistant.

google assistant
Google Assistant hỗ trợ đắc lực cho các thiết bị Smart Home

Ví dụ, một thiết bị như đèn có thể được bật theo nhiều cách khác nhau khi người dùng điều khiển bẳng giọng nói như “Bật đèn”, “Bật đèn phòng khách của tôi”. Ngoài đèn thì rèm cửa, máy quạt, điều hòa, lò sưởi,… hiện đều đã được tích hợp chức năng này. Một số ưu điểm có thể kể đến của các thiết bị thông minh này là khả năng lựa chọn thoải mái để phù hợp nhất với gia đình, đa dạng các trạng thái hoạt động, có thể điều khiển thông qua mạng, độ cảm biến cao và dễ dàng vận chuyển.

Vậy các thiết bị này được tích hợp với nhau như thế nào?

Để kết nối thiết bị với Google Assistant, bạn cần thiết lập Smart home actions – Hành động cho ngôi nhà thông minh. Assistant sẽ xử lý cách người dùng kích hoạt Actions của bạn (bằng nhiều ngôn ngữ) và cung cấp siêu dữ liệu hữu ích thông qua Home Graph (chẳng hạn như trạng thái của một thiết bị cụ thể dựa trên thông tin của người dùng). Tất cả những gì bạn cần làm là phản hồi các yêu cầu thông qua dịch vụ thực hiện của bạn.

Local Home SDK

Local Home SDK cung cấp các kiểu gõ TypeScript để xây dựng ứng dụng hỗ trợ việc thực hiện tích hợp mang tính cục bộ cho gia đình dưới sự hỗ trợ của Google Assistant. Các kiểu chữ này được phân phối dưới dạng npm. Bạn có thể tìm thấy mã nguồn trong repo GitHub Local Home SDK. SDK có sẵn thông qua mạng phân phối nội dung của Google (CDN).

Xây dựng các cuộc trò chuyện phong phú hơn

Xây dựng trải nghiệm trò chuyện tùy chỉnh bằng API giọng nói và hình ảnh của Google Assistant. Sử dụng khả năng hiểu ngôn ngữ tự nhiên (Natural Language Understanding) của Assistant và các công cụ hữu ích khác cho các dev. Người dùng sẽ gửi câu hỏi đến Google Assistant, user input sẽ được xử lý thông qua Conversational Action và trả về phản hồi. Google Assistant sẽ chuyển câu trả lời đến với user ngay lập tức.

Natural Language Understanding (NLU)

Các cuộc trò chuyện và tương tác bằng lời nói có thể có nhiều dạng và nhận được dữ liệu người dùng sớm, giúp các Action trở nên hữu ích, hiệu quả và thú vị hơn. Khi làm việc, hãy chú ý đến các lỗi và cảnh báo. Ngay cả khi Actions của bạn đang hoạt động tốt, nó có thể gặp sự cố trong tương lai và bạn sẽ dành nhiều thời gian hơn để điều tra các vấn đề. Quá trình đọc hiểu ngôn ngữ tự nhiên này diễn ra giữa Google Assistant và Conversational Action. Dữ liệu ở quá trình này sẽ được đọc hiểu và trả về kết quả dễ hiểu nhất cho user.

Actions Builder

Actions Builder là một IDE dựa trên web, dễ sử dụng trong bảng điều khiển Actions. Giao diện người dùng Builder được truy cập trong tab Develop của bảng điều khiển.

Scenes

Scenes là một trong những nền tảng chính của Actions Builder và đại diện cho các trạng thái riêng biệt của cuộc trò chuyện. Mục đích chính của họ là sắp xếp cuộc trò chuyện thành các phần hợp lý, thực hiện các tác vụ, thu thập dữ liệu cụ thể từ người dùng và trả lại lời nhắc cho người dùng.

Intents

Intents đại diện cho một tác vụ mà Assistant cần thực hiện, như xử lý thông tin nhập của người dùng hoặc các sự kiện hệ thống.

Types

Types cho phép trích xuất dữ liệu từ đầu vào của người dùng. Được sử dụng để chú thích các cụm từ trong intent và dữ liệu để xử lý. Types cũng có thể được sử dụng để xác nhận các điều kiện trong một scene.

Actions SDK

Actions trên Google cho phép bạn mở rộng chức năng của Google Assistant với Actions. Các tác vụ cho phép người dùng hoàn thành công việc thông qua giao diện trò chuyện. Actions SDK là một phương pháp phát triển conversation mà không cần sử dụng Dialogflow.

  SDKMan là gì? Tại sao lập trình viên Java nên cài đặt SDKMan?

Khi sử dụng Actions SDK, bạn cũng phải cung cấp các mẫu truy vấn trong Actions để xác định các cụm từ mẫu mà người dùng có thể nói. Có nhiều cách khác nhau để phát triển ứng dụng dựa trên phương thức này như dựa trên file, cấu hình, resources, khả năng sử dụng local IDE, giao diện dòng lệnh, nhập/xuất hàng loạt dữ liệu, triển khai thư viện ứng dụng webhook Node.js client.

Ngoài ra, việc nâng cao trải nghiệm người dùng được thể hiện qua những app mang tính tương tác cao hơn. Các dev có thể sử dụng Interactive Canvas – xem thêm về các tính năng hiện có của Interactive Canvas với bài viết này: Sử dụng Google Assistant để tạo ra các Interactive Games

Continuous Match Mode (CMM)

CMM cho phép các nhà phát triển Canvas luôn mở microphone cho các truy vấn của người dùng và nhận kết quả nhận giọng nói có độ trễ thấp hơn. Tính năng này cho phép người dùng cung cấp một loạt các đầu vào mà Canvas Action xác nhận được trong thời gian thực. Sử dụng CMM bạn vẫn có thể hoạt động với Interactive Canvas, microphone vẫn được mở, sử dụng trong khoảng thời gian tối đa 180 giây, người dùng có thể thoát khỏi chương trình với các nút lệnh như “cancel”, “exit”,…

Ngoài ra, Interactive Canvas sở hữu nhiều tính năng khác:

  • Cấu hình là một phần trong Canvas response.
  • Các dev được cung cấp danh sách các cụm từ dự kiến và thời lượng.
  • Web app nhận callbacks cho mỗi user input phù hợp.
  • Không truy cập vào raw query.
  • Mode ends ở thời lượng cấu hình hoặc có thể invoke một API để close mode.
  • Action quay lại để chuyển sang hội thoại.

Bài viết được trích dẫn từ phần trình bày của Jessica Dene Earley-Cha tại sự kiện Vietnam Web Summit 2020 LIVE do TopDev tổ chức


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

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

PHP & MySQL: Novice to Ninja, 5th Edition

PHP & MySQL: Novice to Ninja, 5th Edition

Dưới đây là tài liệu về PHP & MySQL mà Topdev đã tham khảo được trên diễn đàn.

Người mới làm quen với Ninja là một hướng dẫn thực hành thực tế để tìm hiểu tất cả các công cụ, nguyên tắc và kỹ thuật cần thiết để xây dựng một trang web hướng cơ sở dữ liệu đầy đủ chức năng bằng cách sử dụng PHP & MySQL

Tải tại đây

Tham khảo thêm việc làm php nhiều ngành nghề tại đây

Cách tuyển dụng coder độc nhất vô nhị từ Google: cực kỳ hiệu quả, lọc được toàn nhân tài mà không tốn chi phí “săn đầu người”

Có lẽ với Google, những gì bạn tìm kiếm sẽ phản ánh chính trình độ và con người bạn, vậy tại sao lại không gửi lời mời tuyển dụng đến những người mà họ cần.

Google có rất nhiều cách khác nhau để tìm kiếm tài năng. Bên cạnh một bộ phận tuyển dụng chuyên nghiệp “cây nhà lá vườn” của mình, họ luôn có một danh sách dài các ứng viên đến từ bên ngoài. Nhưng nếu bạn có thói quen tra cứu các câu lệnh khó hiểu, bạn có thể thấy một trong những phương pháp tuyển dụng “còn khó hiểu” hơn của công ty này. Đó là một thông điệp từ Google cho biết rằng bạn đang “nói ngôn ngữ của chúng tôi,” và hỏi xem bạn có “sẵn sàng cho một thách thức”.

Theo Max Rosett, một cựu tư vấn tuyển dụng đang trong quá trình hoàn thành khóa học Master trực tuyến về khoa học máy tính từ Đại học Công nghệ Georgia, cho biết trên trang TheHustle.co, anh đã gặp một lời mời như vậy trong khi tìm kiếm một thuật ngữ của Python.

Sau khi hoàn thành sáu câu hỏi liên tiếp, anh được yêu cầu gửi bản thông tin liên lạc của mình và một vài ngày sau, anh nhận được một email từ nhà tuyển dụng. Anh được bỏ qua phần kiểm tra tiêu chuẩn qua điện thoại, và ba tháng sau khi lần đầu tiên nhìn thấy các câu hỏi từ công ty, anh cho biết giờ mình là một nhân viên của Google.

Bạn cũng có cơ hội thử thách bản thân nếu click vào link này, nhưng bạn chỉ có thể đăng nhập và thử nó nếu nó “đang tìm bạn”.

Những câu chuyện tương tự cũng đã từng xuất hiện trên các phương tiện truyền thông trước đây. Ví dụ vào cuối năm 2014, một thành viên của trang Hacker News, sau một loạt các tìm kiếm có liên quan đến ngôn ngữ lập trình python, đã được Google mời làm một bài kiểm tra. Ngoài ra, cũng vào năm 2014, một nhà nghiên cứu mã hóa có tên Phil Tower, sau khi truy cập vào địa chỉ 146.148.62.204 và giải được một ô chữ mật mã, cũng nhận được lời mời vào làm tại công ty.

Với bài đăng của Rosett cho thấy công cụ này không hẳn chỉ là một dự án của ai đó ở công ty khởi động và bỏ quên trên internet – nó thực sự là một cách để có được công việc. Nó cũng khuyến khích những người đang tìm cách bước chân vào ngành công nghệ hoặc thay đổi công việc rằng, có một con đường phi truyền thống để vào được công ty như một lập trình viên.

Dưới đây là lời mời mà David Yanofsky, phóng viên nhóm Things của trang Quartz nhận được sau khi tìm kiếm một số từ khóa về ngôn ngữ Python.

Còn đây là màn hình sau khi anh ấn vào dòng chữ “I want to play” (Tôi muốn tham gia chơi).

Theo trang Hacker News, một số thuật ngữ tìm kiếm và chủ đề sẽ dẫn mọi người đến thách thức trên ví dụ như “angularJS directives” (các lệnh trong thư viện angularJS) hay “ mutex lock ”. Trong khi đó, Rosett tìm kiếm với từ khóa “ Python lambda function list comprehension .”

Trang Quartz đã liên lạc với Google để hỏi về vấn đề này, và dưới đây là câu trả lời mà họ nhận được:

\u0050\u0075\u007a\u007a\u006c\u0065\u0073\u0020\u0061\u0072\u0065\u0020\u0066\u0075\u006e\u002e\u0020\u0053\u0065\u0061\u0072\u0063\u0068\u0020\u006f\u006e\u002e

Để dịch dòng trên thành bảng mã Unicode mà bạn có thể đọc được, hãy mở terminal trên máy tính của bạn, gõ echo –e, sau đó là dấu cách và toàn bộ dòng trên được đặt trong dấu ngoặc đơn, nhấn Enter bạn sẽ nhận được kết quả (rất tiếc với những người dùng Windows, cách này chỉ dùng cho Linux và Mac). (Đáp án là “Puzzles are fun. Search on.”)

Chiến thuật này cũng tương tự như một biển quảng cáo khó hiểu mà công ty đặt tại Boston và California vào năm 2004, trong đó là một câu đố toán học để dẫn tới một website. Những người có thể truy cập được vào trang web đó sẽ thấy một câu đố khác. Nếu họ giải được chúng, họ sẽ được mời gửi lý lịch của mình tới một hòm thư đặc biệt.

Biển quảng cáo tuyển dụng vào năm 2004 của Google.

Mặc dù cách làm này khá thú vị, nhưng theo quyển sách gần đây của Laszlo Bock, cựu giám đốc bộ phận nhân sự của Google, điều này sẽ dẫn đến một đợt lũ lụt các hồ sơ lý lịch và câu hỏi tuyển dụng, chất lượng đầu vào thấp và lãng phí nguồn lực. Ông không tán thành cách làm này. Dưới đây là những gì ông mô tả trong quyển sách của mình:

Phần lớn những người truy cập vào được không vượt qua được các câu đố. Trong cuộc phỏng vấn với những người đã làm được, chúng tôi nhận ra rằng những người giỏi trong việc một mình giải quyết các câu hỏi không phải lúc nào cũng có thể trở thành một thành viên trong nhóm. Và cho dù những người thắng trong các cuộc thi này rất tài giỏi, nhưng họ thường chỉ thành thạo trong một lĩnh vực. Hoặc họ đã quen với việc giải quyết những vấn đề với các mục đích giới hạn và những giải pháp rõ ràng thay vì hướng đến những thách thức phức tạp của thế giới thực.”

Trong trường hợp này, nhà tuyển dụng nên được kiểm soát nhiều hơn, họ nên được tiếp xúc trước với người mà họ chọn, thay vì phải đối mặt với một trận đại hổng thủy của các hồ sơ lý lịch.

Theo Quartz

Thử thực hiện 4 Stage khi Compile C bằng GCC

GCC biên dịch một file .c thành file chạy trong 4 Stage.

Preprocessing (tiền xử lý), Assembly Code Compiling (diên dịch sang mã Assembly), Machine Code Compiling (biên dịch sang mã máy), Linking.

Trong compile thông thường dạng

$gcc -o HelloWorld HelloWorld.c

Với câu lệnh trên, ta sẽ không thấy kết quả của 3 Stage đầu tiên.

Để hiểu rõ hơn, trong giới hạn hiểu biết, mình sẽ thử thực hiện các Stage bằng tay xem liệu có thể tạo ra file chạy như câu lệnh compile trên hay không.

1. Thực hiện Stage 1 (Preprocessing)

Như trong bài trước, stage này sẽ lấy đầu vào là file .c và cho kết quả đầu ra là file .i (thông thường)

Đầu vào: HelloWorld.c

Đầu ra: HelloWorld.i

Câu lệnh thực hiện:

$gcc -E HelloWorld.c -o HelloWorld.i

Hoặc bằng câu lệnh cpp:

$cpp HelloWorld.c -o HelloWorld.i

File HelloWorld.i khá dài so với HelloWorld.c.

Về nội dung, file HelloWorld.i vẫn là một file source C như bao file Source Code C khác mà thôi, chứ hoàn toàn chưa chuyển sang dạng khác.

2. Thực hiện Stage 2 (Compiling to Assembly Code)

Stage này sẽ chuyển từ source C chứa trong các file HelloWorld.i sang Assembly Code, file HelloWorld.s:

Đầu vào: HelloWorld.i

Đầu ra: HelloWorld.s

Câu lệnh thực hiện:

$gcc -S HelloWorld.i -o HelloWorld.s

3. Thực hiện Stage 3 (Compiling to Machine Code)

Bước này sẽ chuyển Assembly Code sang mã máy mà chương trình sẽ chạy:

Đầu vào: HelloWorld.s

Đầu ra:HelloWorld.o

Câu lệnh thực hiện:

$as HelloWorld.s -o HelloWorld.o

as chính là Assembler, một trình biên dịch Assembly.

4. Thực hiện Stage 4 (Linking)

Linker trong Linux là ld hay tên đầy đủ là GNU Linker. Xem thêm ở man ld

  • Lần 1: Ta thấy 3 stage ở trên thực hiện không mấy khó khăn gì.
    Cùng dạng câu lệnh như thế mà thực hiện thì sao.
    Đây là kết quả:
$ ld HelloWorld.o -o HelloWorld
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
HelloWorld.o: In function `main':
HelloWorld.c:(.text+0xa): undefined reference to `puts'

Lần 2: Đọc một chút về Linker trong man page.
Có vẻ puts sinh ra từ printf đang được gọi trong source.
Và hiểu ra một chút rằng, chương trình C ta viết sử dụng hàm printf, hàm này không phải ta tự viết.
Người mới học vẫn gọi là hàm chuẩn, hầu như không quan tâm nó đến từ đâu.
Nhưng ta đang làm manual mà. Bản thân ngôn ngữ C không bao gồm một thư viện, hay hàm nào cả.
Vậy hàm printf lấy từ đâu, ta phải chỉ cho Linker biết. Đó là thư viện libc, chứa những hàm cơ bản mà chúng ta bảo là chuẩn cho Linux.
Tham khảo ví dụ trong
man page,
ta thực hiện lại việc link bằng command:

$ ld -o HelloWorld /lib/crt0.o HelloWorld.o -lc
ld: cannot find /lib/crt0.o: No such file or directory

Lỗi trên do không có file.

Bỏ /lib/crt0.o đi thì sao:

$ ld -o HelloWorld HelloWorld.o -lc
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400260

Lỗi trên entry_point (địa chỉ hàm mà CPU sẽ nhảy vào đầu tiên để bắt đầu thực hiện chương trình) chưa được khai báo.

Sửa như sau:

$ld -o HelloWorld HelloWorld.o -lc --entry main

Câu lệnh thành công, file HelloWorld được tạo ra.

Tuy nhiên, khi chạy thì:

./HelloWorld
bash: ./HelloWorld: No such file or directory

Lỗi trên là không có file nào như thế. WTF, lỗi gì lạ vậy, rõ ràng là có mà.

Lần 3: Sau một hồi hỏi thầy GG. Nguyên nhân có vẻ là do dynamic loader linker mà HelloWorld yêu cầu không có trong hệ thống.

Kiểm tra như sau:

$ readelf -l HelloWorld|grep interpreter
      [Requesting program interpreter: /lib/ld64.so.1]
$ ls /lib/ld64.so.1
ls: cannot access '/lib/ld64.so.1': No such file or directory

Kiểm tra dynamic loader linker từ file kết quả được build “không manual”.

Tức là bằng câu lệnh:

$gcc -o HelloWorld_auto HelloWorld.c
$ readelf -l HelloWorld_auto |grep interpreter
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Ta thử “ép buộc” sử dụng dynamic loader linker hiện có thì sao.

$ /lib64/ld-linux-x86-64.so.2 ./HelloWorld
Hello World
Segmentation fault (core dumped)

Chạy được nhưng bị Segmentation fault.

Để hiểu kĩ tại sao xảy ra lỗi này, chắc có vẻ mất thời gian.

Lần 4: Bắt chước câu lệnh biên dịch auto thì sao nhỉ? GCC đã thực hiện quá trình linking khi tạo ra file HelloWorld_auto ở trên như thế nào? Thật may, sau một hồi hỏi thầy GG. Ta có thể thấy được toàn bộ tham số của câu lệnh biên dịch ở trên bằng tham số -v vào câu lệnh biên dịch.

$gcc -v -o HelloWorld_auto HelloWorld.c

Kết quả từ câu lệnh trên khá rắc rối, (có lẽ cần 1 bài khác để nói kĩ hơn về nó).

Tuy nhiên ta chỉ quan tâm đến đoạn tham số của collect2 (chính là Linker mà GCC sử dụng cho ngôn ngữ C) mà thôi.

Nó như thế này:

COLLECT_GCC_OPTIONS='-v' '-o' 'HelloWorld_auto' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccy1PInh.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o HelloWorld_auto /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. /tmp/ccocGwHc.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

Nhìn nản luôn, edit lại chút cho “rắc rối hơn”

COLLECT_GCC_OPTIONS='-v' '-o' 'HelloWorld_auto' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/5/collect2 
-plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so 
-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper 
-plugin-opt=-fresolution=/tmp/ccy1PInh.res 
-plugin-opt=-pass-through=-lgcc 
-plugin-opt=-pass-through=-lgcc_s 
-plugin-opt=-pass-through=-lc 
-plugin-opt=-pass-through=-lgcc 
-plugin-opt=-pass-through=-lgcc_s 
--sysroot=/ 
--build-id 
--eh-frame-hdr 
-m elf_x86_64 
--hash-style=gnu 
--as-needed 
-dynamic-linker /lib64/ld-linux-x86-64.so.2 
-z relro 
-o HelloWorld_auto 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o 
/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o 
-L/usr/lib/gcc/x86_64-linux-gnu/5 
-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu 
-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu 
-L/lib/../lib -L/usr/lib/x86_64-linux-gnu 
-L/usr/lib/../lib 
-L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. /tmp/ccocGwHc.o 
-lgcc 
--as-needed -lgcc_s --no-as-needed 
-lc -lgcc 
--as-needed -lgcc_s --no-as-needed 
/usr/lib/gcc/x86_64-linux-gnu/5/crtend.o 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

Ồ, dù không thể hiểu hết các tham số nhưng ta cũng thấy một số tham số sau:

  1. -dynamic-linker /lib64/ld-linux-x86-64.so.2: chỉ ra dynamic linker nào được được sử dụng để ghi vào file kết quả.
  2. -L<đường dẫn> : chỉ định các đường dẫn chứa thư viện mặc đinh hay chúng ta vẫn nói là chuẩn.
  3. –sysroot=/ : là thông số cực kì quan trọng trong cross-compling. Nó sẽ chỉ ra dường dẫn mà các đường dẫn trong qua trình biên dịch lấy đó là thư mục root.

Ok, ta thử chạy manual Linker với mớ tham số ở trên xem sao (nhớ xóa tham số -o HelloWorld_auto nữa.

ld -o HelloWorld HelloWorld.o -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

Và đây là HelloWorld:

$./HelloWorld
Hello World

Đến đây, muốn để hiểu rõ hơn tại sao lại chạy thì cần thêm thời gian và cao thủ. :))

5. Tham số cho GCC

Nếu muốn xem các file kết quả trung gian từ 3 Stage đầu, ta có thể thêm tham số –save-temps khi biên dịch.

$gcc --save-temps -o HelloWorld HelloWorld.c 
$ls -lia
total 52
5097125 drwxrwxr-x 2 oedev oedev  4096  1月  8 15:09 .
5097103 drwxrwxr-x 3 oedev oedev  4096  1月  8 15:09 ..
4990864 -rwxrwxr-x 1 oedev oedev  8608  1月  8 15:09 HelloWorld
4990859 -rw-rw-r-- 1 oedev oedev    70  1月  8 15:09 HelloWorld.c
4990861 -rw-rw-r-- 1 oedev oedev 17121  1月  8 15:09 HelloWorld.i
4990863 -rw-rw-r-- 1 oedev oedev  1504  1月  8 15:09 HelloWorld.o
4990862 -rw-rw-r-- 1 oedev oedev   460  1月  8 15:09 HelloWorld.s

Nguồn: Techtalk

7 điểm chung của những người phụ nữ “cân cả thế giới”

Anna Eleanor Roosevelt – người được mệnh danh là Đệ nhất phu nhân của thế giới là người nổi tiếng với tài năng đàm phán và khả năng lãnh đạo của mình. Marie Curie là người phụ nữ đầu tiên trong lịch sử đạt giải Nobel. Sự kiên trì, bền bỉ và không sợ thất bại của bà đã đưa bà đến thành công. Vậy đặc điểm chung của những người phụ nữ làm thay đổi thế giới là gì?

Trong khi bất bình đảng giới vẫn xảy ra hàng ngày ở nơi công sở, trong gian bếp, phụ nữ còn phải đối mặt với nhiều khó khăn. Từng vận hành hãng Boomerang suốt 4 năm qua, Katy Cowan chia sẻ hầu như cô không nghĩ về giới tính của mình nhiều trong khi làm việc, nhưng đôi khi điều đó khiến cô đau đầu. Có lần, một khách hàng tiềm năng từng hỏi cô rằng liệu cô có ý định sinh con hay không. Cô cho rằng đó không còn là chuyện cá nhân mà còn liên quan trực tiếp đến việc anh ta có hợp tác với cô nữa hay không.

Mặc dù phải đối mặt với những tình huống kỳ quặc mà một người đàn ông sẽ không bao giờ phải đối mặt. Nếu phụ nữ có những đặc điểm tính cách sau, họ sẽ dễ dàng đánh bại được những khó khăn, phát huy ưu điểm của mình để trở thành những nhà lãnh đạo hàng đầu, những người phụ nữ “cân” cả thế giới.

1. Tự tin

Ngay cả trong suy nghĩ bạn cũng không dám nghĩ rằng mình có thể đi xa, thì bạn sẽ mãi mãi dậm chân tại chỗ. Tự tin là tính cách quan trọng nhất đối với mọi doanh nhân thành đạt. Muốn là một phụ nữ thành đạt thì càng cần phải tự tin.

“Đối với phụ nữ, tự tin là một loại cơ bắp, sử dụng nó càng nhiều, bạn càng trở nên mạnh mẽ” – Viết bởi 1 ai đó

2. Nắm bắt cơ hội

Khi đối mặt với một thách thức, một người phụ nữ thành công sẽ biết cách nhìn thấy cơ hội trong đó. Họ nhìn thấy một cốc nước chưa đầy, hơn là một cốc nước vơi. Họ biết cách gạt bỏ những rào cản và đối mặt với những hoàn cảnh trái nghịch, họ học được từ những khó khăn có khi thất bại từ đó.

Estée Laude – đồng sáng lập thương hiệu mỹ phẩm nổi tiếng danh giá toàn cầu là con gái thứ 2 của một gia đình gốc Do Thái di cư từ Hungary sang Mỹ. Bà cũng là một người phụ nữ biết cách nắm bắt cơ hội. Trong suốt cuộc khủng hoảng mua sắm sau chiến tranh, phụ nữ thường muốn mua các gói mỹ phẩm dùng thử trước khi quyết định mua chính thức. Bà Lauder đã nhận ra điều đó và nhanh chóng áp dụng vào thương hiệu mỹ phẩm của mình.

3. Tính toán

Người ta vẫn thường nói, phụ nữ là đại diện cho một “giống loài” bất ổn và phức tạp nhất trên trái đất. Họ thường bất chợt đưa ra một ý tưởng mà không có sự tính toán. Tuy nhiên, để trở thành một nữ lãnh đạo thành đạt, người phụ nữ thường phải luôn tính toán, có kế hoạch và tiên liệu những điều bất ngờ có thể xảy ra.

Coco Chanel – nữ vương bất tử của thời trang xa xỉ, chiến sĩ giải phóng phụ nữ – đã từng có một câu nói bất hủ về phụ nữ: “Cuộc đời tôi không mấy vui vẻ, vì vậy tôi đành phải tự tạo cuộc sống cho mình“.

4. Đam mê

Phụ nữ thường vin vào những lý do hoàn cảnh mà chọn cho mình một công việc ổn định mà để dành đam mê như một thú vui, không dám tiến tới nó như một sự nghiệp chính. Vì vậy, họ thường không đạt vị trí cao trong công việc.

Điểm khác biệt lớn nhất giữa người phụ nữ thành đạt và người phụ nữ bình thường là họ không mất thời gian băn khoăn có nên đi theo đam mê hay không vì họ luôn xác định rõ họ thích và muốn gì. Những công việc họ làm luôn đi kèm với đam mê và định hướng.

5. Không so sánh, ghen tị

Nếu bạn có một tấm gương để học hỏi và vươn lên thì điều đó thật tuyệt vời. Nhưng nếu không tỉnh táo, luôn lấy mình ra so sánh để mà rơi vào hố sâu ghen tị, người phụ nữ sẽ không thể nghĩ xa và thậm chí là đánh mất chính bản thân mình. Họ sẽ mãi cảm thấy bất an và không hài lòng với bản thân.

6. Khiêm tốn và sẵn sàng học hỏi

Thế giới luôn vận động và không ngừng thay đổi. Những người phụ nữ thành đạt nhận thức được điều này và luôn có tinh thần cầu thị, học hỏi để tiến bộ. Họ sẽ đọc sách, tham dự hội thảo và lắng nghe chia sẻ của tất cả mọi người. Họ không sợ thừa nhận những sai sót của bản thân và không bao giờ phóng đại về những gì mình đang có, vì họ biết chỉ có thay đổi là luôn không thay đổi.

7. Thông minh cảm xúc

Những nhà lãnh đạo cực kỳ thành công đều phải trải qua khó khăn và trở ngại trên con đường dẫn tới thành công của họ. Khi đối mặt với vấn đề, họ phát huy sức đề kháng, sự kiên trì, và ý chí mạnh mẽ không chỉ cho sự sống còn của bản thân họ mà còn là rất nhiều những người khác. Có nhiều người thất bại trước khó khăn, có nhiều người thành công bởi họ có trí thông minh cảm xúc. Các nhà lãnh đạo thành công biết cách đối phó với cảm xúc của họ, làm cho họ trưởng thành về mặt tình cảm và thông minh.

Bill Gates, Elon Musk và Stephen Hawking cảnh báo về việc làm trong tương lai

“Tự động hóa trong nhà máy đã dần dần thay thế con người các công việc sản xuất truyền thống và sự trỗi dậy của trí tuệ nhân tạo có khả năng lấn sang những công việc trung lưu chỉ còn lại công việc bảo dưỡng, sáng tạo hoặc giám sát.”-Stephen Hawking
“Khúc hành ca” quan ngại về việc robot đang nhanh chóng chiếm mất công việc của con người.
Dưới đây là lời của Elon Musk tại Hội nghị cao cấp Chính phủ thế giới diễn ra tại Dubai:
“Đối phó với thất nghiệp hàng loạt? Đây là thách thức lớn của xã hội. Sẽ ngày càng ít công việc mà robot làm không tốt bằng con người. Đây không phải là điều mà tôi mong muốn xảy ra. Chỉ đơn giản là tôi nghĩ nó sẽ đến sớm thôi.”Elon Musk
Và hôm nay, Bill Gates đã đề xuất với chính phủ nên bắt đầu đánh thuế robot giống như cách chúng ta đánh thuế người lao động bình thường:
“Chúng ta đang bước qua giai đoạn thay đổi chớp nhoáng, rất nhiều công việc truyền thống đều bị thay thế cùng một lúc. Vì vậy, bạn biết đấy, công việc dọn kho, lái xe, dọn phòng và các công việc tương tự, chắc chắn sẽ biến mất trong 20 năm tới.”– ​​Bill Gates
Công việc đang biến mất nhanh hơn nhiều so với những gì mà bạn có thể tưởng tượng.
Trong năm 2013, các nhà hoạch định chính sách lờ đi lời cảnh báo của hai nhà kinh tế học Oxford rằng 45% của tất cả việc làm ở Mỹ có thể được tự động biến mất trong vòng 20 năm tới. Nhưng ngày hôm nay điều đó đã trở thành sự thật mà không thể tránh khỏi.

Nhân lực ngành vận tải và kho vận lên đến 5 triệu (Mỹ)

Những chiếc xe không người lái sẽ tiếp tục thay thế những tài xế.

Tình trạng hiện tại ở Mỹ, đó là:

  • 600,000 tài xế Uber
  • 181,000 tài xế taxi
  • 168,000 tài xế phương tiện công cộng
  • 505,000 tài xế xe bus trường học

Ngoài ra còn có khoảng 1 triệu tài xế xe tải ở Mỹ. Và Uber vừa mua một công ty xe tải tự lái.

Xe tự lái hợp pháp tại nhiều tiểu bang, chúng ta sẽ thấy cuộc cách mạng tự động hóa nhanh chóng trong công việc lái xe. Nếu chỉ với 30.000$ để trang bị xe tải tự động mà có thể thay thế cho tài xế xe tải với lương 40.000$ mỗi năm, thì sớm thôi một triệu tài xế xe tải sẽ bị thay thế.

Và robot không chỉ thay thế trong ngàng vận tải mà cả ngành kho vận cũng sẽ tự động hoá.

Tôi nên bạn nên bỏ ra 3 phút xem video này. Nó cho thấy thế nào mà một đội robot nhỏ có thể thay thế một số lượng lớn các công nhân kho vận.

Hiện vẫn còn một số người làm việc trong những nhà kho, nhưng nó cũng chỉ là vấn đề thời gian trước khi hệ thống tự động thay thế họ nốt.

8 triệu người Mỹ làm nhân viên bán hàng và thủ quỹ.

Nhiều lĩnh vực trong hai ngành này cũng sẽ sớm tự động hoá.

Amazon đang thử nghiệm một loại cửa hàng hầu như không có nhân viên. Bạn chỉ cần đi vào, lấy những gì bạn muốn và đi ra.

Phần lớn của kế hoạch bán hàng là tìm ra hoặc thậm chí dự đoán những gì khách hàng sẽ muốn.  Và, Amazon đạt doanh thu 136 tỷ $ năm ngoái, và “nhân viên bán hàng” của họ là thuật toán giới thiệu trên web. Hãy tưởng tượng tác động của Amazon trong bán lẻ khi họ áp dụng trí tuệ nhân tạo vào các cửa hàng sản nghiệp.

Nhân sự trong ngành nhà hàng ở Mỹ là 14 triệu

Nhật bản đã tự động hoá các hoạt động nhà hàng trong nhiều thập niên như dùng đặt đơn hàng, phục vụ thực phẩm, rửa chén, và thậm chí chuẩn bị bữa chính.

Và Mỹ hiện đang sở hữu một số nhà hàng tự động rất tốt.

Thậm chí có một công ty mà làm xe tải giao hàng mà trên đường đi vừa làm pizza để bánh luôn còn mới.

Tự động hóa là điều không thể tránh khỏi. Nhưng chúng tôi vẫn có thời gian để hành động và giúp người lao động chuyển đổi.

Tự động hóa đang được đẩy nhanh. Phần mềm của các robot trở nên mạnh mẽ hơn mỗi ngày. Chúng ta không thể thể ngăn cản nó. Nhưng chúng ta có thể thích ứng với nó.

Bill Gates đề nghị chúng ta đánh thuế “công nhân” robot để có thể thu lại khoản thuế của những người thất nghiệp.

Elon Musk khuyến cáo chúng ta áp dụng hỗ trợ thu nhập cơ bản và cung cấp cho tất cả mọi người một số tiền nhất định mỗi năm nhờ vậy chúng tôi có thể giữ cho nền kinh tế ổn định thậm chí là hàng triệu người lao động thất nghiệp do tự động hóa.
Tôi đề nghị chúng ta dùng một phần tiền của người đóng thuế để trợ cấp công nhân của ngành công nghiệp mà bây giờ chủ yếu là robot và thay vì đầu tư trong đào tạo công nhân cho các công việc kỹ thuật đang nổi lên.
Câu trả lời cho vấn đề tự động hóa có thể bao gồm việc ràng buộc với bên thứ ba. Nhưng chúng ta cần phải có hành động bây giờ, trước khi chúng tôi phải đối mặt với những thảm họa tồi tệ nhất của thất nghiệp kể từ cuộc Đại khủng hoảng.
Tôi chân thành khuyên bạn làm 3 điều:
  1. Tự học về tự động hóa và tác động kinh tế của nó. Đây là cuốn sách hay nhất về đề tài này.
  2. Nói chuyện với bạn bè và gia đình về tự động hóa. Chúng tôi không thể bỏ qua nó chỉ vì nó là đáng sợ và không thể đoán trước.Chúng ta cần phải có một tiếng nói chung để thống nhất sẽ làm gì trước khi công ty quyết định cuộc sống của chúng ta.
  3. Liên hệ với đại diện của bạn, yêu cầu họ trình bày cách giải quyết vấn đề về tự động hóa và thất nghiệp. Nói với họ, chúng ta cần đánh thuế robot, hỗ trợ thu nhập hoặc nhiều tiền đầu tư vào công nghệ giáo dục, những điều phù hợp với quan điểm chính trị của bạn.

Nếu chúng ta hành động bây giờ, chúng ta vẫn có thể giải quyết những thách thức tự động hóa và giúp hàng triệu người Mỹ thoát khỏi khó khăn.

Cảm ơn bạn đã đọc bài viết và quan tâm về việc này. Giúp tôi truyền tải về vấn đề quan trọng này mà các chính trị gia của chúng ta không ai lên tiếng. Chia sẻ bài viết này trên Facebook hoặc tweet trên Twitter.

Nguồn: topdev via Medium

Web Scalability 101: Biết giới hạn của hệ thống

Sau mấy tuần vật lộn với công việc sau Tết thì cũng có thời gian viết lách. Đây là bài viết về kỹ thuật đầu tiên của năm và là bài đầu tiên trong loạt bài chia sẻ về các chiến thuật scaling hệ thống web có tên là “Web scalability 101 (vỡ lòng)”.

Nếu quan tâm đến scale hệ thống, bạn có thể google những từ khóa liên quan đến scale, ngôn ngữ, công nghệ mà hệ thống bạn đang sử dụng, và phần lớn là các bài viết chỉ về các cài đặt, cấu hình cụ thể của một công nghệ nào đó như tùy chỉnh PHP thế nào, tùy chỉnh nginx, tùy chỉnh mysql ra sao…và có thể bạn sẽ lạc trong một mớ hỗn độn các kiến thức cấu hình này.

Mình không nói cách tiếp cận này là sai, nhưng nếu chỉ theo hướng này thì bạn sẽ không thể nào lường trước được khi tiếp cận công nghệ mới, hướng này là chưa đủ. Bạn cần một cách tiếp cận ở mức căn bản, nền tảng hơn và khi nắm được các kiến thức nền tảng thì mình nghĩ việc vì sao mình cấu hình php, mysql, nginx hoặc thay đổi kiến trúc sang microservice sẽ trông có vẻ rõ ràng và cụ thể hơn trước khi bắt tay vào triển khai. Và đó là mục tiêu của loạt bài “vỡ lòng” này.

Nội dung đầu tiên mà mình muốn chia sẻ và cực kỳ quan trọng khi bạn muốn bắt tay vào scale hệ thống, đó là phải biết được giới hạn của hệ thống hiện tại. Bởi vì chỉ khi bạn biết được giới hạn của hiện tại thì các nâng cấp, cải tiến sẽ mở rộng được giới hạn này và lượng hóa được khả năng của hệ thống trong tương lai. Có 2 loại giới hạn rõ ràng đó là giới hạn công nghệ và giới hạn của stack mà bạn đang sử dụng.

Giới hạn công nghệ

Nhóm này mình chia thành một số nhánh rõ ràng như là giới hạn của dung lương lưu trữ dữ liệu, tốc độ đọc ghi dữ liệu, tốc độ truyền dẫn dữ liệu và tốc độc xử lý dữ liệu. Biết được các giới hạn này sẽ giúp bạn dễ dàng tính toán được các giới hạn trần khi sử dụng một công nghệ nào đó. Ví dụ khi ghi dữ liệu vào ổ SSD của hãng X thì không thể nào nhanh hơn tốc độ A/s…

Giới hạn của công nghệ là thông tin khá dễ biết vì nó là các tiêu chuẩn của ngành hoặc 1 nhà sản xuất…Tùy theo nhu cầu của hệ thống bạn mà bạn sẽ quan tâm đến các số liệu nào. Mình không bàn nhiều về giới hạn này vì hầu như bạn không thể thay đổi các giới hạn này, trừ khi bạn là nhà chế tạo hoặc cải tiến các công nghệ hiện tại.

Bạn có thể tham khảo link sau với nội dung “Latency Numbers Every Programmer Should Know” (https://gist.github.com/jboner/2841832)

Giới hạn của stack

Các giới hạn này liên quan trực tiếp đến hệ thống mà bạn đang xây dựng. Ví dụ hệ thống của bạn một giây phục vụ được bao nhiêu request và có thể cải tiến được hơn nữa không. Áp dụng công nghệ X,Y,Z vào sẽ cải tiến được bao nhiêu…Việc đo đếm các giới hạn này không đơn giản và nếu một action của bạn lệ thuộc vào nhiều công nghệ, phần mềm thì việc cải tiến sẽ phức tạp hơn rất nhiều. Ví dụ 1 web request bạn có xử lý đụng đến đọc ghi dữ liệu database, đọc ghi file, gọi web service khác, tính toán thì việc cải thiện giới hạn bằng cách xem xét các thành phần cụ thể.

Tính toán giới hạn của web server

Ở đây mình sẽ lấy một ví dụ cụ thể về việc tính toán được giới hạn của web server sử dụng PHP và nginx để hình dung được bức tranh và có thể giúp ra quyết định scale. Cho đề bài sau:
– Bạn đang có 1 server có 2GB Ram
– Chạy 4 PHP worker process (xử lý đồng thời 4 request 1 thời điểm)
– Mỗi PHP worker process tốn 20MB Ram
– Mỗi request trung bình xử lý 100ms.
Câu hỏi: Mỗi giây server này phục vụ được tối đa bao nhiêu request. Và có thể nâng lên tối đa bao nhiêu request nếu không muốn đầu tư server cấu hình mạnh hơn.

Nếu mỗi request chiếm 100ms của process thì 1 giây mỗi process có thể phục vụ 10 request. Chúng ta có 4 process có nghĩa là mỗi giây chúng ta có 4×10 request có nghĩa là với cấu hình hiện tại, server này phục vụ tối đa 40 request. Nếu quá con số request này truy cập vào server thì các request sau sẽ chờ cho đến khi các request trước đó xử lý xong. Và tùy theo “ứng xử” của hệ thống, nếu chờ quá lâu thì sẽ bỏ/hủy request này và thông báo lại cho người dùng.

Để cải tiến được giới hạn này, chúng ta cần xem xét các thông tin tham gia vào bài toán. Hiện tại có 3 tham số khả dụng sẽ giúp cải tiến. Đó là số process có thể tăng thêm để tận dụng ram trống, vì hiện tại ram của server là 2G, giả sử dành 200M cho các xử lý khác của hệ thống thì còn thừa 1.8G (~1800MB Ram), như vậy, ta có thể tăng lên 1800/20=90 process. Theo như phần trước thì mỗi process xử lý được 10 request thì nếu có 90 process thì xử lý được 900req/s. Như vậy tăng gấp 22.5 lần so với cấu hình đầu.

Ở đây bạn sẽ thấy chưa cần làm gì, chỉ với việc thay đổi cấu hình là đã tăng khả năng phục vụ của hệ thống lên 20 lần. Giả sử team của bạn thấy mình hoàn toàn có khả năng giảm thời gian xử lý trung bình xuống còn 50ms/req, tức là tăng khả năng thêm gấp đôi nữa. Hoặc team bạn sử dụng công nghệ khác giúp tối ưu bộ nhớ của 1 process xuống trung bình còn 10MB Ram, tức là tăng thêm gấp đôi 1 lần nữa.

Lưu ý 1: để biết được dung lượng của 1 process, bạn có thể google để tìm câu lệnh trên linux để biết hoặc có thể đơn giản chạy câu lệnh top để xem process của bạn chiếm bao nhiêu memory.

Lưu ý 2: trong ví dụ trên giả sử bạn đang sử dụng MySQL để truy cập dữ liệu. Giả sử ở 40 req/s thì mysql hỗ trợ OK, nhưng khi lên 900req/s thì Mysql của bạn sẽ quá tải và có thể đã ngưng phục vụ ở 200req/s. Có nghĩa là con số 900 bạn không đạt được do giới hạn của mysql. Như vậy, bạn sẽ thấy bài toán sẽ cần giải thêm 1 cách khác để mở rộng hệ thống vượt ra ngoài con số 200req/s.

Lưu ý 3: đề bài trong ngữ cảnh là các con số trung bình (ram trung bình, thời gian trung bình), trong thực tế có thể có những request tốn nhiều ram hơn nhiều (vd: 500MB), xử lý lâu hơn trung bình rất nhiều (2000-3000ms/req) khiến cho các con số bị sai lệch cũng như treo hệ thống vì với cấu hình 90 process, nếu memory không cấp đủ thì xảy ra tình trạng swap ổ cứng, khiến cho hệ thống bị đơ đơ, nên không phải dùng hết ram cấp cho process là hiệu quả vì nó cũng đi kèm rủi ro hết ram. Đây là nguyên nhân chính vì sao mình phải cần nhiều server để chia tải cho toàn hệ thống.

Như vậy, với việc biết được các phụ thuộc của request thì mình sẽ có những hướng thay đổi, cải tiến phù hợp cho hệ thống. Bài viết này sẽ không đi sâu vào các cấu hình và các giả thuyết mình đặt ra nhằm giúp những bạn nào chưa có kinh nghiệm scale hệ thống hiểu được một phần câu chuyện. Việc đo đạc này sẽ giúp bạn biết được giới hạn của hệ thống, và bạn sẽ có các chiến lược scale khi hệ thống của bạn lên tới ngưỡng phục vụ cảnh báo (vd 80% giới hạn).

Bài tiếp theo mình sẽ nói về kiến trúc microservice sẽ giúp giải bài toán scale mysql như thế nào vì mysql là một trong những thành phần rất khó scale.

Nguồn: blog.topdev.vn via Techtalk via bloghoctap

Google AMP là gì ? Cài đặt AMP cho website asp.net mvc

Tìm hiểu AMP là gì?

APM viết tắt của Accelerated Mobile Pages là trang cho thiết bị di động được tăng tốc. Trang cho thiết bị di động được tăng tốc (AMP) là một sáng kiến mã nguồn mở để làm các web tải nhanh và có giao diện đẹp trên thiết bị di động, thậm chí khi mạng chậm.

Khi cấu trúc website của bạn thỏa điều kiện của AMP project, nó sẽ được tối ưu, từ đó tăng tốc độ load trang trên các thiết bị di động.

Các website đã tích hợp responsive hoặc có phiên bản dành cho mobile thì có cần tích hợp Google AMP nữa không? Website responsive chỉ thay đổi giao diện ở các màn hình khác nhau thôi nhưng bản chất cấu trúc HTML, dung lượng HTML, Javascript, Image đều không thay đổi. Để xem những kỹ thuật amp sử dụng bên dưới để có câu trả lời có nên tích hợp cho website của bạn không

Phân tích kỹ thuật của Google AMP

  • Google AMP sử dụng kỹ thuật lazyload hình ảnh
  • Google AMP sử dụng kỹ thuật tải javascript bất đồng bộ async
  • Google AMP sử dụng kỹ thuật cdn để javascript nhanh chóng

Để xem website mình có APM chưa thì vào Google Master Tool

screen-shot-2016-12-28-at-2-22-47-pm

Cách kiểm tra Google AMP:

screen-shot-2016-12-28-at-2-25-47-pm

Công cụ Web Interface https://validator.ampproject.org

screen-shot-2016-12-28-at-2-28-26-pm

Sử dụng trình duyệt Chrome: gõ link thêm “#development=1” vào đường link cần kiểm tra và ấn F12 chọn Tab Console

screen-shot-2016-12-28-at-2-28-55-pm

Hướng dẫn cài đặt cấu hình cho website amp:

Làm thế nào Google sẽ tìm các trang AMP của bạn? Google sẽ index trang AMP được định nghĩa như sau:

  • Không phải là AMP: phải khai báo cho google nhận dạng thông qua cấu trúc sau
  • Là trang AMP: phải khai báo cho google nhận dạng thông qua cấu trúc sau

The AMP HTML format Sample:

<!doctype html>
<html ⚡>
  <head>
    <meta charset="utf-8">
    <title>Sample document</title>
    <link rel="canonical" href="./regular-html-version.html">
    <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
    <style amp-custom>
      h1 {color: red}
    </style>
    <script type="application/ld+json">
    {
      "@context": "http://schema.org",
      "@type": "NewsArticle",
      "headline": "Article headline",
      "image": [
        "thumbnail1.jpg"
      ],
      "datePublished": "2015-02-05T08:00:00+08:00"
    }
    </script>
    <script async custom-element="amp-carousel" src="https://cdn.ampproject.org/v0/amp-carousel-0.1.js"></script>
    <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
    <script async src="https://cdn.ampproject.org/v0.js"></script>
  </head>
  <body>
    <h1>Sample document</h1>
    <p>
      Some text
      <amp-img src=sample.jpg width=300 height=300></amp-img>
    </p>
    <amp-ad width=300 height=250
        type="a9"
        data-aax_size="300x250"
        data-aax_pubname="test123"
        data-aax_src="302">
    </amp-ad>
  </body>
</html>

Các bạn có thể đọc thêm cách làm đầy đủ tại đây. Và xem thêm các theme về amp địa chỉ sau https://ampbyexample.com/

Xong khi làm xong những yêu cầu của google đặt ra thì cùng trải nghiệm xem kết quả đạt được

screen-shot-2016-12-28-at-2-29-56-pm

Kết quả tìm kiếm

screen-shot-2016-12-28-at-2-43-18-pm

Còn đây là màn hình sau khi click vào kết quả tìm kiếm

So sánh tốc độ google amp

Các bạn có thể tham khảo bài viết đo tốc độ website như thế nào. Hình ảnh bên dưới lần lượt là page bình thường và page sử dụng google amp

screen-shot-2016-12-28-at-2-43-49-pm

Ưu điểm:

  • Website sử dụng AMP sẽ được ưu tiên tăng thứ hạng trong kết quả tìm kiếm của Google trên thiết bị di động
  • AMP giúp tăng tốc độ tải trang so với trang web không cài AMP
  • Tốc độ tải trang nhanh hơn đồng nghĩa với việc tăng lượt truy cập trang web và kiếm được tiền quảng cáo nhiều hơn

Facebook cũng có tính năng tương tự là Facebook Instant Articles giúp việc đọc tin trên thiết bị di dộng nhanh như chớp.

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

Techtalk via Matercode.vn

Sử dụng Google Assistant để tạo ra các Interactive Games

Sử dụng Google Assistant để tạo ra các Interactive Games

Thông qua chủ đề này, bạn sẽ biết được cách Google Assistant có thể giúp lập trình viên build các Interactive Games như thế nào? Hiện tại, Google Assistant có thể hỗ trợ làm việc với 19 ngôn ngữ và hơn 80 quốc gia, có mặt trên hơn 1 tỷ thiết bị do đó bạn sẽ dễ dàng hơn cũng như có nhiều cách để làm việc với các thiết bị hơn.

interactive games
Sự phổ biến của Google Assistant giúp công việc thuận lợi hơn

Tổng quan về Google Assistant và Interactive Games

Mỗi ngày chúng ta sử dụng và tương tác với nhiều thiết bị thông minh khác nhau với nhiều cách khác nhau. Dựa vào kết quả nghiên cứu được thực hiện bởi AoGDevs, phần lớn người dùng sử dụng các thiết bị thông minh cho âm nhạc và các hoạt động thường nhật như cập nhật thông tin thời tiết,… Nhưng cũng có một lượng lớn người dùng sử dụng các thông tin này cho những trò đố vui hay để chơi game. Trong đó, 55% người dùng sử dụng Google Assistant cho những câu hỏi vui và 20% người dùng chơi games.

  Vừa học vừa chơi! Top 15+ game lập trình miễn phí
  7 game miễn phí giúp bạn nâng cao kỹ năng lập trình

Google Assistant tạo ra hướng đi mới cho Interactive Games

Smart Display ra mắt năm 2019 và trong suốt năm này, tỷ lệ những gia đình có ít nhất một thiết bị smart display đã tăng lên gấp 4 lần. Vậy có những games gì trên Assistant ngày nay? 2 năm trước chúng ta tiếp cận với voice game trên Assistant. Nó giúp tạo ra những trải nghiệm mang tính tương tác cao hơn, bằng cách tận dụng các lợi thế mà Google Assistant mang lại nhờ hiểu được những gì mà người dùng nói. Sự hấp dẫn và thú vị chính là cách mà những games này tạo được sự thành công trên thị trường.

Nhờ sự phổ biến của smart display, các lập trình viên cũng bắt đầu build những game mới như Guess the Drawing, Trivia Crack, Who wants to be a Millionaire,…

Xem thêm Một ngày làm việc của Google Product Manager

Với Guess the Drawing, bạn có thể chơi game với hàng trăm bức ảnh động đầy hấp dẫn ở chế độ xem chậm. Trong khi đó nhờ Trivia Crack, bạn có thể chơi game mà vẫn có thêm kiến thức với bộ câu hỏi và câu trả lời về các chủ đề như lịch sử, mỹ thuật, giải trí và khoa học. Với Who wants to be a Millionaire, người tham gia sẽ trả lời một bộ câu hỏi để chinh phục mức giải thưởng cao nhất là 1 triệu USD, đồng thời bạn cũng có thể sử dụng các quyền trợ giúp để tham gia cuộc chơi này.

Interactive Canvas là gì và hoạt động như thế nào?

Interactive Canvas là một API đóng vai trò quan trọng trong việc tạo ra các flood animation và tối ưu hóa trải nghiệm người dùng khi chơi game, bằng cách kiểm soát mức độ hiển thị khi làm việc với các ngôn ngữ HTML, CSS, JavaScript và web assembly. Dựa vào khả năng và sự hiểu biết sâu sắc bản chất vấn đề, các lập trình viên có thể phát triển các interactive games hay ho hơn với âm thanh và hình ảnh sinh động.

Interactive Canvas làm việc ra sao?

  • Lifecycle of a conversational action: Web service có thể được sử dụng để cung cấp để tạo ra các API calls hoặc kiểm tra database.
  • Web service yêu cầu thiết bị tìm nạp web app. Khi bạn nói chuyện trên thiết bị, thiết bị sẽ gửi qua âm thanh với những gì bạn đã nói và xử lý để trả về yêu cầu. Dữ liệu sẽ được sử dụng để phân tích và phản hồi yêu cầu.
  • Update web app ngay trên thiết bị: Trong web app, Interactive Canvas API sẽ được phân tích và sau đó website hiển thị trên thiết bị. Vì user có thể tương tác trực tiếp trong quá trình sử dụng nên bạn có thể update and request data giữa server và khách hàng. Đây cũng là mức độ cao nhất mà nó có thể làm được.
  • Fulfillment và web app logic: Hiện tại, Canvas đang hỗ trợ trên các thiết bị smart display và điện thoại android. Do đó, trước khi bạn gửi một phản hồi về thiết bị, hãy kiểm tra xem thiết bị của khách hàng có được Canvas hỗ trợ hay không. Khi dùng bạn phải sử dụng một thư viện mới là Node.js Client library. Class này có 2 thuộc tính: URL và data. Nếu bạn muốn gửi một Canvas response lần đầu tiên cần phải có một URL. Điểm hay ho của nó là giúp bạn giải quyết được tình trạng của web app và đảm bảo về các vấn đề bảo mật.

Chuyện gì xảy ra với khách hàng sau khi nhận được phản hồi từ Canvas?

Web app là 1 trang web hiển thị trên thiết bị của khách hàng. Nó được build chủ yếu bằng 2 ngôn ngữ là HTML và JavaScript. Khi web app closed cũng đồng nghĩa với việc nó đang khởi tạo một thư viện Canvas JavaScript. Thư viện Canvas JavaScript xử lý các phản hồi từ server và cũng tạo ra các request đến thiết bị. Bạn cũng có thể build web app bằng cách sử dụng các JavaScript framework phổ biến như React.

Cá nhân tôi đề xuất các dev nên sử dụng Single Page Application (SPA) vì nó có thể tránh được sự phức tạp và vẫn đảm bảo một giao diện đơn giản cho người dùng. Là một phần của web app, interactive canvas library sẽ được nhập and khởi tạo trong web app. Sau đó, bạn sẽ được truy cập vào phiên bản interactive canvas, cho phép giải quyết các Canvas response bằng cách sử dụng bản update callbacks ở những phương thức đã có sẵn.

interactive games
SPA giúp hỗ trợ tạo giao diện dễ dàng hơn

Làm cách nào để xử lý các phản hồi từ server ở phía khách hàng?

Điều này có thể được thực hiện thông qua lệnh calling send text query trên interactive canvas object. sendtextQuery giúp chuỗi giá trị của người dùng có kết quả chính xác hơn. Đây được xem là cách rất hiệu quả trong quá trình làm việc với server cũng như giải quyết các vấn đề phát sinh.

Thêm vào đó, để gửi data từ server bằng cách sử dụng send text query, chúng ta cũng có thể gửi thêm state đến server bằng lệnh setCanvasState vào JSON object. Nó cực kỳ hiệu quả khi bạn muốn xem trạng thái của yêu cầu trên web app to fulfillment.

Client và server sẽ tương tác với nhau ra sao?

Design Principles

Voice forward

Khi build các interactive games, bạn cần phải đảm bảo các tin nhắn có nội dung tương tự một cuộc trò chuyện chứ không phải là những câu mệnh lệnh. Hãy nghĩ về trải nghiệm của chính bạn khi chơi game khi phải đọc những dòng yêu cầu xem? Chắc chắn người xem sẽ có thể thấy khó chịu và nó không phù hợp với nhiều đối tượng khác nhau.

Tận dụng hình ảnh

Sử dụng nhiều hình ảnh sẽ khiến cho interactive game trở nên thú vị và hấp dẫn hơn. Các hình ảnh sẽ khiến game trông sinh động hơn và cho khách hàng thấy được đâu là tâm điểm trong giao diện người dùng. Họ sẽ biết được mục đích tương tác của mình là gì. Với các voice game, bạn nên tận dụng lợi thế hình ảnh có thể giúp trải nghiệm của người dùng trở nên đa dạng hơn.

  10 Add-on Google Sheets phải có dành cho các Recruiters

Optimize Display

Tối ưu hóa hiển thị và thiết kế giao diện cũng là một phần quan trọng. Sử dụng kích thước phông chữ tối thiểu là 32pt cho văn bản chính như tiêu đề và kích thước 24pt cho văn bản phụ như đoạn mô tả hay các đoạn văn bổ sung được xem là lựa chọn hợp lí.

Local Multiplayer

Đối với các trò chơi nhiều người chơi, sáng tạo các icons hay những chức năng cho nhiều người cùng tương tác chắc chắn sẽ giúp game được yêu thích hơn.

Xử lý lỗi

Sử dụng các đề xuất về âm thanh hoặc hình ảnh rõ ràng nếu người dùng gặp khó khăn

Tận dụng SSML và thư viện âm thanh được cung cấp bởi Google

SSML hay còn được gọi là Speech Synthesis Markup Language. Nếu bạn là một web developer, bạn chỉ cần xem SSML là một text, thực tế SSML còn có thể chuyển đổi âm thanh bằng cách chuyển các đoạn văn bản thành giọng nói. Nhờ đó nó cũng cho phép bạn cung cấp phụ đề cho các video,…

Tìm hiểu thêm về Parallel Media Tag bằng link dưới đây: developers.google.com/assistant/conversational/ssml

Sound Library hiện nay cũng là một open source được cung cấp bởi Google mà bạn có thể tận dụng: developers.google.com/assistant/tools/sound-library

Hiện đang có những loại games nào được build?

World Games được sáng tạo dưới dạng các câu hỏi đố và người chơi có thể trả lời trực tiếp bằng giọng nói.

Multiplayer Games là các loại game cho phép nhiều người chơi cùng lúc hiện cũng đang được phát triển khá phổ biến.

Persistent Games cho phép các người chơi chơi nối tiếp nhau một cách liên tục và được xây dựng dựa trên tình hình thực tế của mỗi khu vực, mỗi quốc gia.

Trên đây là giới thiệu một cách tổng quan về tất cả những gì có thể làm để phát triển game với Google Assistant. Hãy tự cởi bỏ giới hạn của bản thân và sáng tạo thêm thật nhiều những games hấp dẫn nhất.

Bài viết được trích dẫn từ phần trình bày của Ms Mandy Chan tại sự kiện Vietnam Web Summit 2020 LIVE do TopDev tổ chức


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

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

7 Công Cụ Hay Dành Để Thực Hiện Devops

Trước đây, các nhà lập trình và các hoạt động thường hay mâu thuẫn với nhau. Việc tạo ra code thì chưa bao giờ được cập nhật đủ nhanh cho các nhà lập trình, các nhà quản lý có nhiệm vụ đảm bảo cho các server hoạt động một cách êm ả đã bực mình vì sự khẳng định vội vàng của các nhà lập trình về các quá trình theo đường tắt và chồng chất các yêu cầu xử lý.

Tuy nhiên, kể từ khi devops xuất hiện, thì các trận tuyến này đã không còn, nhờ có các công cụ mà đã nảy sinh khoảng cách, devops cung cấp các dịch vụ đa dạng từ quản lý cấu hình cho đến tính di chuyển được của các ứng dụng. Dưới đây là một vài công cụ nổi bật giúp thực hiện devops gây ấn tượng ngày nay.

Tìm việc làm DevOps lương cao trên TopDev

Atlas

techtalk-devops

HashiCorp đã giới thiệu Atlas mới nhất, Atlas cung cấp tầm nhìn về cơ sở hạ tầng, bao gồm các server, các container, và các máy ảo, ngoài việc quản lý cấu hình và khám phá dịch vụ. Việc xây dựng dựa trên các dự án mã nguồn mở phổ biến của công ty như Vagrant, Packer, Serf, Consul, và Terraform, Atlas – mã nguồn đóng riêng làm cho devops có khả năng qua các dịch vụ đám mây đa dạng, bao gồm AWS, Google Compute Engine, Azure và OpenStack, và cung cấp một bảng điều khiển dành cho lập trình, triển khai và bảo trì các ứng dụng.

Người dùng không có công việc thường xuyên đang xem xét Atlas cho nền tảng gắn kết khách hàng của công ty. Franks là người nói về Lithium Technologies, đã nhập vào Atlas, ông đang quan sát Atlas để tích hợp và triển khai liên tục. Franks nói rằng: “Hiện nay có nhiều công cụ như Jenkins, Travis và Bamboo.” “Dặm cuối cùng là phần triển khai, thì họ không xử lý.”

Các cài đặt tại chỗ cho khách hàng của Atlas được mong chờ vào đầu năm nay.

  DevOps – Giải pháp phát hành phần mềm nhanh chóng
Ơn giời, DevOps Engineer đây rồi!!!!

Bạn là DevOps Engineer kinh nghiệm và đang có mức thu nhập đáng mơ ước. Nhưng cuộc sống luôn chuyển động, và bạn, đôi khi cần một “level cao hơn” để trình của mình ngày càng khẳng định.

goGame có thể trở thành một điểm đến lí tưởng cho bạn. Vì sao ư?

  • Mức lương có thể lên đến $2000, hoặc cao hơn nếu năng lực của bạn khiến chúng tôi “choáng ngợp”
  • Được trang bị thiết bị chuyên dụng cấu hình cao dành riêng cho dân Game
  • Tuần làm việc chỉ 5 ngày, từ 9h sáng đến 6h tối, tha hồ “thư giãn” vào buổi sáng
  • Cơ hội làm việc với khách hàng trong và ngoài nước với môi trường chuyên nghiệp và “chất”

Tìm hiểu và ứng tuyển ngay tại đây!

Chef

techtalk-devops2

Chef là một hệ thống và framework cơ sở hạ tầng đám mây mà tự động hóa việc xây dựng, triển khai và quản lý cơ sở hạ tầng qua các script ngắn, lặp lại được gọi là “recipes.” Nhưng sức mạnh thật sự của Chef có lẽ nằm trong cách sử dụng các modun cấu hình nối được (hay còn gọi là cookbooks) của nó, có gần 2000 cookbooks có sẵn qua cộng đồng Chef. Gần đây Facebook của người dùng nổi bật đã có mã nguồn mở của một vài Chef cookbooks của riêng nó, quan sát một repo (nhà kho) của mã nguồn, chẳng hạn như Git và giữ server của Chef nội vùng ăn khớp.

Đại học Wharton School cũng là người dùng Chef. “Chef tự động hóa các nhiệm vụ phức tạp mà khác thời gian và nguồn – thì chuyên sâu, nhưng điều quan trọng hơn cả là nó cho phép chúng ta tập trung mọi nỗ lực của chúng ta vào sáng tạo và nâng cao chất lượng dịch vụ,” ông Sanjay Modi, giám đốc kỹ thuật của trường cho biết. “Nó cũng mở ra cánh cửa để thêm sự cộng tác và hiệu quả hơn nữa trong tổ chức.” Chef đã được sử dụng bởi Wharton để tự động hóa quản lý cấu hình cho các nguồn Amazon EC2, Linux nodes và máy ảo cục bộ

  Renoleap DevOps Bootcamp - Khóa Học Miễn Phí Trong 13 Tuần Tại Việt Nam.

Docker

techtalk-devops3

Docker mang lại tính khả chuyển cho các ứng dụng qua công nghệ Containerization của nó, do đó các ứng dụng hoạt động cho chính nó – các đơn vị được chứa đựng có thể được di chuyển trong toàn thể các nền tảng. Nó bao gồm Docker Engine, có thời gian chạy nhẹ và công cụ đóng gói, và Docker Hub là một dịch vụ đám mây dành cho ứng dụng trong việc chia sẻ và sự tự động hóa quy trình.

“Docker là một phần quan trọng của cơ sở hạ tầng dịch vụ quản lý và thử nghiệm thế hệ tiếp theo của Yelp,” Sam Eaton, giám đốc bộ phận kỹ sư tại Yelp cho biết. “Việc tách riêng các phần phụ thuộc và quay các container mau lẹ đã cho phép chúng ta rút ngắn lại chu trình phát triển và tăng tốc độ thử nghiệm nhiều hơn bốn lần.”

Puppet

techtalk-puppet

Puppet Enterprise xuất phát từ Puppet Labs, cung cấp quy trình xử lý trung tâm dữ liệu bằng cấu hình tự động hóa và quản lý máy móc và phần mềm. Phiên bản mới nhất 3.7 đã được công bố, đề cao các ứng dụng của Puppet, các ứng dụng được xây dựng cho một mục đích nhất định cho sự tự động hóa IT, bao gồm Node Manager dành cho quản lý với một lượng lớn các hệ thống được thay đổi thường xuyên. Một phiên bản mã nguồn mở của Puppet cũng có sẵn.

Đại học Stanford sử dụng phiên bản mã nguồn mở của Puppet “để nối khoảng cách giữa phát triển phần mềm mà chúng ta cần tạo ra các loại dịch vụ thư viện số và sự quản lý hệ thống mà chúng ta cần giữ cho các dịch vụ đó hoạt động với hiệu quả cao và an toàn,” Bess Sadler đến từ đại học Stanford cho biết. Các nhà lập trình đã bị thu hút vào sự quản lý hệ thống, trong khi các admin của hệ thống đã làm tăng thêm sự liên quan của mình vào phát triển phần mềm, làm cho các ứng dụng có khả năng phát triển nhanh hơn.

SaltStack

techtalk-devops22

SaltStack cung cấp sự tự động hóa dữ liệu dành cho quản lý các hệ thống, xây dựng đám mây, dự liệu server, và cấu hình ứng dụng. Một công cụ tự động hóa cơ sở hạ tầng đám mây được điều khiển theo sự kiện, nó có thể tự động hóa các nhiệm vụ trong quy trình devops. Deseret Digital Media đã sử dụng SaltStack khoảng hai năm để tự động hóa môi trường của nó, đề cao xấp xỉ 200 máy ảo đang chạy một môi trường sản phẩm và dịch chuyển.

SaltStack “tạo ra các sự hoạt động nhiều hơn việc có thể tới gần được cho các nhà lập trình,” Justin Carmony, giám đốc phát triển của Deseret Digital cho biết. Công ty có ba nhà điều khiển và 30 nhà lập trình; SaltStack để họ đóng góp vào sự hoạt động, chẳng hạn như dự liệu các server mới. “Theo truyền thống các sự hoạt động và các nhà lập trình luôn bất đồng với nhau.” Carmony nói. SaltStack cung cấp một phương thức và một ngôn ngữ bình thường để quản lý các server, theo cách ấy để nối khoảng cách giữa hai bên.

ScriptRock GuardRail

techtalk-202

GuardRail cung cấp theo dõi cấu hình, với sự quan sát liên tục trạng thái cấu hình máy. Nó có thể giúp người dùng đảm bảo môi trường sản phẩm của họ là đồng nhất với QA, kiểm tra và các môi trường lập trình. VersionOne, nhà tạo ra nền tảng quản lý dự án agile, đã bắt gặp các thử thách với sự kéo theo cấu hình và sự tự động hóa, do đó VersionOne đã chuyển sang GuardRail.

“Các nhà lập trình đang có các biểu tượng tắt để tạo ta sự tự động hóa dễ dàng hơn. Để mà có các bản build chạy trên các chương trình đại lý mới, thì họ đang thay đổi những gì đang hoạt động trước đây cho các bản build khác. Sự không ổn định của cơ sở hạ tầng đang làm suy yếu những gì có khả năng bằng nhiều bản build chương trình đại lý,” Ian Buchanan, giám đốc sản phẩm của VersionOne. “Nhờ GuardRail, bây giờ chúng tôi có thể hiểu được cách mà bất kỳ build agent được thiết lập cấu hình để chúng tôi có thể có nhiều agent đáng tin cậy như chúng tôi muốn.” VersionOne đã tăng thêm tầm nhìn vào việc kéo theo cấu hình và có thể dẫn chứng các kỳ vọng bằng tài liệu và cũng đã tạo ra được các thử nghiệm human-readable (người đọc cũng hiểu được), như vậy ngoại trừ sự tương đương của một tester trọn thời gian.

Splunk

techtalk-s29

Splunk là một công cụ dùng để tìm kiếm và sửa chữa các vấn đề theo thời gian thực qua chu kỳ đời sống của ứng dụng, nó cho phép các nhà lập trình hình dung dữ liệu từ các môi trường sản phẩm mà không phải truy cập máy sản xuất. Splunk giúp người dùng bao quát các quá trình devops, bao gồm sự triển khai và tích hợp liên tiếp.

User EnerNOC cung cấp phần mềm năng lượng thông minh dành cho các nhà điều hành mạng lưới điện và các lĩnh vực khác, User EnerNOC là người dùng của Splunk được khoảng năm năm. “Về cơ bản, Splunk đã thay đổi phương thức mà chúng ta điều hành hệ thống sản xuất,” James Nichol, kỹ sư trưởng tại EnerNOC nói. “Nó đã làm cho những người dùng kỹ thuật và phi kỹ thuật có khả năng đi sâu vào bản chất của một hệ thống rất phức tạp mà mặt khác sẽ không rõ ràng với họ. Chúng ta đã có các máy chủ ảo, các nhà quản lý phát triển, và quản lý chăm sóc khách hàng cài đặt các bảng điều khiển, hệ thống cảnh báo, và tìm tòi dữ liệu mà không thể không cần Splunk.”

Nguồn: topdev

Xem thêm các tin tuyển dụng việc làm IT trên TopDev

Hướng dẫn: JavaScript Modules

javascript

Nếu bạn mới học JavaScript, những thuật ngữ như “module bundlers vs. module loaders,” “Webpack vs. Browserify” và “AMD vs. CommonJS” có thể làm các bạn ‘bội thực’.

Hệ thống module của JavaScript tỏ ra khá đáng sợ, nhưng lại là những kiến thức cơ bản thiết yếu cho bất cứ web developer nào.

Trong bài viết, ta sẽ giải mã những thuật ngữ thông dụng này (kèm theo một vài đoạn code mẫu nữa). Hy vọng các bạn sẽ gặt hái được nhiều kiến thức từ bài viết.

Việc làm Javascript không yêu cầu kinh nghiệm

Part 1: Ông nào giải thích hộ module là gì lần nữa được không?

Tác giả giỏi sẽ chia sách thành chương và phần; lập trình viên giỏi sẽ chia chương trình thành module.

Giống như một chương truyện, module đơn giản chỉ là một loạt từ (hoặc code, tùy theo trường hợp).

Tuy nhiên, module tốt thì lại cực kỳ khép kín với chức năng riêng biệt, cho phép chúng được xáo trộn, xóa bỏ, hoặc thêm vào nếu cần, mà không gây gián đoạn cho hệ thống.

Tại sao phải dùng module?

Có rất nhiều lợi ích đến từ việc sử dụng module so với codebase phân nhánh phức tạp, liên quan đến nhau. Một số lợi ích lớn nhất, theo tôi là:

  • Khả năng duy trì: Theo định nghĩa, module thì khép kín. Một module được thiết kế đúng chuẩn sẽ có mục đích làm giải bớt dependency ở các phần trên codebase càng nhiều càng tốt, từ đó module có thể phát triển và cải thiện độc lập. Khi module được tách bạch khỏi những đoạn code khác, module này sẽ dễ cập nhật hơn rất nhiều.

Quay lại ví dụ cuốn sách, khi bạn muốn thay đổi một chương trong sách, nếu một thay đổi nhỏ trong chương cần phải chỉnh luôn trong các chương khác nữa, đây sẽ nhanh chóng trở thành một cơn ác mộng. Thay vào đó, bạn sẽ muốn viết mỗi chương làm sao để ít (hoặc không) phải động đến các chương khác khi muốn thay đổi gì đó.

  • Namespacing: Trong JavaScript, biến nằm ngoài hàm cấp cao sẽ là global (mọi người đều có thể truy cập). Bởi lẽ này, thường sẽ có “ô nhiễm vùng tên”, tại đây code (hoàn toàn không liên quan) chia sẻ các biến global.

Chia sẻ biến global giữa code không liên quan là thứ cực kỳ không nên xảy ra trong lập trình.

Sâu vào bài viết ta sẽ thấy rằng, module cho phép chúng ta tránh ô nhiễm vùng tên bằng cách tạo không gian riêng cho biến của chúng ta.

  • khả năng tái sử dụng: thành thật mà nói: bằng cách này hay cách khác, tất cả chúng ta ai cũng đã từng copy code đã viết trước đó vào project mới của mình. Ví dụ, hãy tưởng tượng bạn copy một vài method đa dụng bạn đã viết từ project trước đến project hiện nay.

Tốt đẹp cả thôi, nhưng nếu bạn nếu bạn tìm được cách hay hơn để viết một vài phần của code đó, bạn sẽ phải đi lại từ đầu đến cuối và phải nhớ mình đã viết ở chỗ nào để update.

Cách làm này lãng phí rất nhiều thời gian. Nếu ta có một… module có thể dùng đi dùng lại thì tốt biết mấy nhỉ?

Bạn kết hợp module như thế nào?

Có nhiều cách để liên kết module vào chương trình. Hãy cùng xem qua một số phương pháp thường thấy nhé:

Module pattern

Module pattern được sử dụng để mô phỏng khái niệm của class (vì JavaScript vốn không hỗ trợ class) từ đó chúng ta có thể lưu trữ cả các method public lẫn private và các biến trong một object duy nhất – tương tự với cách class được sử dụng trong các ngôn ngữ lập trình khác (như Java hay Python). Từ đó cho phép chúng ta tạo API đại chúng cho các method mà ta muốn tung ra global, mà vẫn kèm theo biến private và các method trong một phạm vi khép kín (closure scope).

Có nhiều cách thực hiện module pattern. Trong ví dụ đầu tiên, tôi sẽ sử dụng gói kín nặc danh (anonymous closure), đặt tất cả code của ta vào hàm ẩn danh (Nên nhớ: trong JavaScript, hàm là cách duy nhất tạo scope mới.)

Ví dụ 1: Gói kín ẩn danh (Anonymous closure)

(function () {
  // Chúng ta để các biến này ở private trong closure scope
  
  var myGrades = [93, 95, 88, 0, 55, 91];
  
  var average = function() {
    var total = myGrades.reduce(function(accumulator, item) {
      return accumulator + item}, 0);
    
      return 'Your average grade is ' + total / myGrades.length + '.';
  }

  var failing = function(){
    var failingGrades = myGrades.filter(function(item) {
      return item < 70;});
      
    return 'You failed ' + failingGrades.length + ' times.';
  }

  console.log(failing());

}());

// ‘You failed 2 times.’

Với cấu trúc này, hàm ẩn danh của chúng ta sẽ có môi trường đánh giá riêng hoặc “gói kín” (closure), và sau đó chúng ta sẽ đánh giá hàm ngay. Như vậy, chúng ta có thể giấu biến khỏi vùng tên mẹ (global namespace).

Cách này có một cái hay là bạn có thể sử dụng biến cục bộ trong hàm này mà không phải vô tình viết chồng lên các biến global đã có, mà vẫn truy cập được biến global, như sau:

var global = 'Hello, I am a global variable :)';

(function () {
  //  Chúng ta để các biến này ở private trong closure scope
  
  var myGrades = [93, 95, 88, 0, 55, 91];
  
  var average = function() {
    var total = myGrades.reduce(function(accumulator, item) {
      return accumulator + item}, 0);
    
    return 'Your average grade is ' + total / myGrades.length + '.';
  }

  var failing = function(){
    var failingGrades = myGrades.filter(function(item) {
      return item < 70;});
      
    return 'You failed ' + failingGrades.length + ' times.';
  }

  console.log(failing());
  console.log(global);
}());

// 'You failed 2 times.'
// 'Hello, I am a global variable :)'

Nên nhớ rằng dấu ngoặc tròn quanh hàm ẩn danh là bắt buộc, vì các câu lệnh (statement) bắt đầu với keyword function luôn được xem là khai báo hàm (nên nhớ, bạn không thể có khai báo hàm không tên trong JavaScript.) Do đó, các dầu ngoặc tròn xung quanh, thay vào đó sẽ tạo biểu thức hàm. Nếu muốn tìm hiểu thêm, bạn có thể đọc ở đây.

Example 2: Global import

global import là một phương pháp nữa khá nổi tiếng, được các thư viện như jQuery sử dụng. Tương tự với gói bao kín ẩn danh ta vừa thấy, nhưng sẽ không chuyển vào global như tham số (parameters):

(function (globalVariable) {

  //  Chúng ta để các biến này ở private trong closure scope
  var privateFunction = function() {
    console.log('Shhhh, this is private!');
  }

  // Expose các methods dưới đây qua giao diện globalVariable interface, đồng thời
  // giấu implementation của method trong 
  // function() block

  globalVariable.each = function(collection, iterator) {
    if (Array.isArray(collection)) {
      for (var i = 0; i < collection.length; i++) {
        iterator(collection[i], i, collection);
      }
    } else {
      for (var key in collection) {
        iterator(collection[key], key, collection);
      }
    }
  };

  globalVariable.filter = function(collection, test) {
    var filtered = [];
    globalVariable.each(collection, function(item) {
      if (test(item)) {
        filtered.push(item);
      }
    });
    return filtered;
  };

  globalVariable.map = function(collection, iterator) {
    var mapped = [];
    globalUtils.each(collection, function(value, key, collection) {
      mapped.push(iterator(value));
    });
    return mapped;
  };

  globalVariable.reduce = function(collection, iterator, accumulator) {
    var startingValueMissing = accumulator === undefined;

    globalVariable.each(collection, function(item) {
      if(startingValueMissing) {
        accumulator = item;
        startingValueMissing = false;
      } else {
        accumulator = iterator(accumulator, item);
      }
    });

    return accumulator;

  };

 }(globalVariable));

Trong ví dụ này, globalVariable là biến global duy nhất. Cách thức này có lợi thế so với gói kín ẩn danh là, bạn có thể khai biến global ngay từ đầu, giúp người đọc code hiểu rõ hơn.

Example 3: Object interface

Còn một cách tạo module khác là với object interface độc lập, như sau:

var myGradesCalculate = (function () {
    
  // Chúng ta để các biến này ở private trong closure scope
  var myGrades = [93, 95, 88, 0, 55, 91];

  // Expose những hàm này thông qua an interface while hiding
  // the implementation of the module within the function() block

  return {
    average: function() {
      var total = myGrades.reduce(function(accumulator, item) {
        return accumulator + item;
        }, 0);
        
      return'Your average grade is ' + total / myGrades.length + '.';
    },

    failing: function() {
      var failingGrades = myGrades.filter(function(item) {
          return item < 70;
        });

      return 'You failed ' + failingGrades.length + ' times.';
    }
  }
})();

myGradesCalculate.failing(); // 'You failed 2 times.' 
myGradesCalculate.average(); // 'Your average grade is 70.33333333333333.'

Như bạn thấy đấy, phương pháp cho phép chúng ta quyết định biến/method nào để giữ private (e.g. myGrades) và biến/method nào chúng ta muốn expose, bằng cách đặt vào câu lệnh trả về (e.g. average & failing).

Example 4: Revealing module pattern

Rất giống với cách làm đã nêu ở trên, ngoại trừ tất cả method và biến sẽ được giữ private cho đến khi được expose dứt khoát:

var myGradesCalculate = (function () {
    
  // Chúng ta để các biến này ở private trong closure scope
  var myGrades = [93, 95, 88, 0, 55, 91];
  
  var average = function() {
    var total = myGrades.reduce(function(accumulator, item) {
      return accumulator + item;
      }, 0);
      
    return'Your average grade is ' + total / myGrades.length + '.';
  };

  var failing = function() {
    var failingGrades = myGrades.filter(function(item) {
        return item < 70;
      });

    return 'You failed ' + failingGrades.length + ' times.';
  };

  // Dứt khoát expose public pointers đến các private functions 
  // mà ta muốn expose công khai

  return {
    average: average,
    failing: failing
  }
})();

myGradesCalculate.failing(); // 'You failed 2 times.' 
myGradesCalculate.average(); // 'Your average grade is 70.33333333333333.'

Nhìn thì nhiều như vậy đấy, nhưng “không may” đây mới chỉ là phần nổi của tảng băng trôi module pattern mà thôi.

CommonJS và AMD

Có một điểm chung ở tất cả các phương pháp trên: sử dụng một biến global duy nhất để gói code trong một hàm, từ đó tạo vùng tên private cho chính nó với phạm vi khép kín (closure scope).

Tuy mỗi phương pháp đều có hiệu quả riêng, nhưng khuyết điểm vẫn không thể tránh khỏi.

Ví dụ như, với cương vị lập trình viên, bạn cần phải biết đúng thứ tự của dependency để load file vào đó. Giả sử, cho là bạn đang dùng Backbone cho project của mình, nên bạn sẽ thêm kèm script tag cho mã nguồn của Backbone trong file.

Tuy nhiên, kể từ khi Backbone có dependency cứng trên Underscore.js, sript tag cho file Backbone không thể được thay thế trước file Underscore.js được.

Là lập trình viên, việc quản lý dependencies song song với xử lý tốt những công việc này đôi khi tỏ ra quá sức.

Một thiếu sót khác là chúng vẫn có thể dẫn đến xung đột vùng tên. Ví dụ, Nếu như có hai module bị trùng tên thì sao? Hoặc nếu như bạn có hai phiên bản của cùng một module, mà bạn lại cần cả hai?

Có lẽ bạn đang tự hỏi: chúng ta có thể thiết kế ra cách yêu cầu interface của module mà không phải đi qua phạm vi toàn thể (global scope).

Thật may mắn, câu trả lời là “có”. Và chúng ta có hai giải phép khá nổi tiếng và tối ưu: CommonJS và AMD.

CommonJS

CommonJS là một nhóm làm việc tình nguyện, thiết kế và tích hợp JavaScript APIs để khai biến.

Một module CommonJS thực ra là một đoạn JavaScript tái sử dụng được, có khả năng export một số object nhất định, giúp các module khác có thể require trong chương trình của chúng. Nếu đã từng lập trình với Node.js, bạn hẳn sẽ rất quen thuộc với format này.

Với CommonJS, mỗi file JavaScript lưu trữ module trong bối cảnh module của riêng nó (cũng giống như gói vào gói kín vậy). Trong phạm vi (scope) này, chúng ta sẽ sử dụng object module.exports để expose module, và require để import.

Khi bạn xác định một module CommonJS, bạn sẽ thường thấy:

function myModule() {
  this.hello = function() {
    return 'hello!';
  }

  this.goodbye = function() {
    return 'goodbye!';
  }
}

module.exports = myModule;

Chúng ta sẽ sử dụng module object đặc biệt và đặt reference của hàm vào module.exports. Từ đó cho phép hệ thống module CommonJS biết được chúng ta muốn expose cái nào, để các file khác có thể tiêu thụ.

Sau đó nếu có người muốn dùng myModule, họ có thể require ngay trong file của họ, như sau:

var myModule = require('myModule');

var myModuleInstance = new myModule();
myModuleInstance.hello(); // 'hello!'
myModuleInstance.goodbye(); // 'goodbye!'

Giải pháp này có hai ích lợi rõ rệt so với các module pattern ta đã bàn đến:

  1. Tránh ô nhiễm vùng tên toàn phần (global namespace pollution)
  2. Để dependencies ở explicit

Hơn nữa, cú pháp cũng rất gọn gàng, tôi rất thích điểm này.

Một đặc điểm nữa cần lưu ý, rằng CommonJS đi theo hướng server-first (server trước) và load module đồng bộ. Lý do ta cần lưu ý là vì nếu ta có ba module khác cần require, thì chỉ load được từng module một mà thôi.

Đến đây, server thì tuyệt rồi, nhưng thật xúi quẩy, ta sẽ gặp khó khăn khi viết JavaScript cho trình duyệt, đọc module từ web sẽ mất rất nhiều thời gian hơn so với đọc từ ổ cứng. Miễng là đoạn script để load module đang chạy, script sẽ chặn trình duyệt không cho chạy bất cứ thừ giì khác cho đến khi module load xong. Chúng ta thấy hành vi này vì thread trong JavaScript sẽ dừng cho đến khi code load xong hết.

AMD

CommonJS rất hay và mượt, nhưng nếu chúng ta muốn load module không đồng bộ thì sao? Câu trả lời là Asynchronous Module Definition (ADM).

Load module bằng ADM sẽ trông như sau:

define(['myModule', 'myOtherModule'], function(myModule, myOtherModule) {
  console.log(myModule.hello());
});

Chúng ta có thể thấy rằng hàm define tiếp nhận một array của dependencies của module làm tham số đầu tiên. Những dependencies này được load trong background (theo hướng không block), và khi đã load, define sẽ call hàm callback nó đã được chỉ định.

Tiếp theo, hàm callback sẽ lấy các dependencies đã được load làm tham số – trong trường hợp của chúng ta, myModulemyOtherModule  cho phép hàm sử dụng những dependencies. Cuối cùng, bản thân dependencies cũng phải được xác định bằng từ khóa define.

Ví dụ, myModule có thể trông như sau:

define([], function() {

  return {
    hello: function() {
      console.log('hello');
    },
    goodbye: function() {
      console.log('goodbye');
    }
  };
});

Vậy, một lần nữa, khác với CommonJS, AMD đi theo hướng browser-first cùng với hành vi không đồng bộ để xử lý công việc. Bên cạnh tính chất không đồng bộ, module của bạn còn có thể là object, hàm, hàm dựng, string, JSON và nhiều kiểu dữ liệu khác, trong khi CommonJS chỉ hỗ trợ object làm module.

Như vậy, AMD không tương thích với io, filesystem, và các tính năng hướng server khác có ở trong CommonJS, và cú pháp gói hàm dài dòng hơn, nếu so với chỉ một câu lệnh require đơn giản.

UMD

Với các project yêu cầu hỗ trợ cả các tính năng của AMD và CommonJS, ta còn một format nữa: Universal Module Definition (UMD).

UMD là hướng dùng một trong hai phương pháp trên, đồng thời hỗ trợ xác định biến global. Từ đó, module trong UMD có thể làm việc trên cả client và server.

Sau đây là một ví dụ ngắn về cách UMD:

(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
      // AMD
    define(['myModule', 'myOtherModule'], factory);
  } else if (typeof exports === 'object') {
      // CommonJS
    module.exports = factory(require('myModule'), require('myOtherModule'));
  } else {
    // Browser globals (Chú ý: root là window)
    root.returnExports = factory(root.myModule, root.myOtherModule);
  }
}(this, function (myModule, myOtherModule) {
  // Methods
  function notHelloOrGoodbye(){}; // A private method
  function hello(){}; // Là public method vì được trả kết quả (xem bên dưới)
  function goodbye(){}; // Là public method vì được trả kết quả (xem bên dưới)

  // Các public methods được expose
  return {
      hello: hello,
      goodbye: goodbye
  }
}));

Để dọc thêm ví dụ của UMD format, bạn có thể đọc tại đây.

Native JS

Nhiều quá đúng không, nhưng vẫn chưa hết đâu. Vì chúng ta vẫn còn một kiểu module nữa.

Chắc các bạn cũng đã nhận ra, không có kiểu module nào bên trên có sẵn trong JavaScript cả. Thay vào đó, chúng ta đã tìm cách emulate một hệ thống module thông qua việc sử dụng module pattern, CommonJS hoặc AMD.

May thay, những chuyên gia tại TC39 đã giới thiệu module built-in với ECMAScript 6 (ES6).

ES6 đưa ra một loạt khả năng import và export module đa dạng, sau đây là một số tài nguyên các bạn có thể xem thử:

So với CommonJS và AMD, ES6 module tỏ ra vượt trội hơn: cú pháp gọn gàng và rõ ràng, cùng khả năng load không đồng bộ, và các lợi thế như hỗ trợ cyclic dependencies tốt hơn.

Có lẽ tính năng ưa thích nhất của tôi với ES6 module là: xem trước trực tiếp exort dưới dạng read-only. (So với CommonJS, imports là bản sao của export và vì vậy sẽ không ‘sống’).

Sau đây là một ví dụ minh họa:

// lib/counter.js

var counter = 1;

function increment() {
  counter++;
}

function decrement() {
  counter--;
}

module.exports = {
  counter: counter,
  increment: increment,
  decrement: decrement
};


// src/main.js

var counter = require('../../lib/counter');

counter.increment();
console.log(counter.counter); // 1

Trong ví dụ này, chúng ta về cơ bản tạo hai bản sao module: một bản sao khi export, và một bản sao khi require.

Hơn nữa, bản sao trong main.js hiện đã bị ngắt kết nối khỏi module ban đầu. Đó là lý do ngay cả khi chúng ta gia tăng số counter, nó sẽ vẫn trả về 1 – vì biến counter mà ta import là bản sao đã disconnet của biến counter từ module.

Như vậy, việc tăng counter sẽ tăng số trong module, nhưng sẽ không tăng số version bản sao. Cách duy nhất để điều chỉnh version bản sao của biến counter, là làm thủ công:

counter.counter++;
console.log(counter.counter); // 2

Mặt khác, ES6 tạo xem trước trực tiếp (read-only) của module ta import:

// lib/counter.js
export let counter = 1;

export function increment() {
  counter++;
}

export function decrement() {
  counter--;
}


// src/main.js
import * as counter from '../../counter';

console.log(counter.counter); // 1
counter.increment();
console.log(counter.counter); // 2

Cool nhỉ? Một điểm rất hay của tính năng xem trước trực tiếp là bạn có thể tách module thành nhiều mảnh nhỏ mà không làm mất tính năng nào.

Sau đó bạn có thể quay lại và merge lần nữa. Không có bất cứ sự cố nào cả, nên bạn cứ yên tâm.

Ở phần sau: bundling modules

Như vậy, vừa rồi ta đã tìm hiểu sơ bộ về module. Trong phần tới, chúng ta sẽ khám phá sâu hơn nữa về module trong JavaScript, cụ thể hơn là module bundling (gói module):

  • Tại sao ta phải gói module
  • Các phương pháp gói khác nhau
  • API load module của ECMAScript

Nguồn: topdev.vn via Techtalk via Medium

Tham khảo các vị trí tuyển nhân viên IT hấp dẫn tại đây

Lời khuyên cho các bạn thiết kế web

AMA (Ask Me Everything) là sự kiện Hỏi – đáp diễn ra thường kì trên fanpage Topdev nhằm tạo cơ hội để các bạn lập trình viên tiếp cận được những kiến thức, kinh nghiệm thực tế từ các chuyên gia trong ngành thông qua những màn hỏi đáp trực tuyến nóng hổi. Bắt đầu từ đầu năm 2017, sự kiện AMA sẽ kéo dài nguyên tuần từ 8h sáng thứ 3 đến 24h thứ 6 hằng tuần để cộng đồng dev có nhiều thời gian trao đổi với các chuyên gia hơn.

Tuần rồi, AMA đón chào thêm 1 gương mặt quen thuộc khác là anh Nguyễn Thanh TùngTrưởng bộ phận phát triển sản phẩm Web – App thuộc công ty cổ phần Thế Giới Di Động và Điện Máy Xanh.

Anh Tùng đã có trên 10 năm kinh nghiệm làm Product ManagementUI/UX, cùng những kinh nghiệm xương máu và vốn kiến thức sâu rộng được anh đúc kết qua rất nhiều dự án ở các công ty lớn như Baamboo MP3 (VCcorp), Anhso.net (Moore corp), Thegioididong.com,Dienmayxanh.com, Ứng dụng TGDD.

Cùng xem thử các câu hỏi được đặt ra cho anh Tùng là gì nhé!

Q: Em chưa có kinh nghiệm nhưng muốn hướng theo lĩnh vực thiết kế website. Anh có thể chia sẻ cho em biết làm thế nào có thể thiết kế hay phát triển một website với giao diện tối ưu nhât, không khiến người dùng cảm thấy bối rối khi có quá nhiều sản phẩm được đưa ra trong cùng một trang website?

A: Mỗi lĩnh vực sẽ có những đặc thù riêng về trải nghiệm người dùng để tối ưu. Một UX designer nhiều kinh nghiệm về TMĐT thì khi dấn thân vào một lĩnh vực mới (VD ngân hàng, bất động sản) thì họ cũng sẽ phải bắt đầu một quá trình nghiên cứu mới để thấu hiểu nhu cầu của user trong lĩnh vực đó. Khó có câu trả lời tuyệt đối cho câu hỏi “Đâu là website với giao diện tối ưu nhất”, mặc dù các website tốt sẽ chia sẻ một số nguyên tắc chung như “Don’t make me think” (Em có thể search thông tin về cuốn sách này trên Google)

Với những bạn trẻ muốn học thiết kế website, anh xin chia sẻ mấy ý
1. Tìm một môi trường để cọ xát và có một người thầy tốt/sếp giỏi: em có thể chọn startup/studio/agency hoặc một công ty lớn, mỗi thứ đều có những điểm mạnh riêng. Tốt nhất nên làm qua cả 2 để biết mình phù hợp với môi trường nào.
2. Nỗ lực tự học tiếng Anh ít nhất ở mức đọc hiểu tốt và tìm môi trường có thể giúp mình cọ xát tiếng Anh (VD các outsource studio/agency) : những người giỏi mà anh quen (Dev, Designer, các chuyên gia..) đa phần đều đi lên nhờ tự học, và mọi thứ kiến thức hữu ích đều có thể tự tìm ra bằng Google và tiếng Anh. Ko biết tiếng Anh sẽ cản trở em khá nhiều trong việc phát triển kỹ năng của bản thân.
3. Việc còn lại là follow những người giỏi mà em biết (có thể bắt đầu với những diễn giả tham gia AMA trước đó của TopDev) , từ đó quan sát và học hỏi từ những gì họ chia sẻ và bắt tay vào thực hành ngay nhé

Q: Anh Tùng có thể chia sẻ kinh nghiệm trong quá trình thiết kế Website của mình là làm thế nào để website được tải với tốc độ nhanh, có khả năng tương thích với hầu hết các trình duyệt web phổ biến nhất hiện nay?

A: Các kỹ thuật về Cache, HTML/CSS… giúp tối ưu tốc độ tải trang web thì cũng có đầy rẫy trên mạng rồi, em có thể search google/Stackoverflow để tham khảo thêm, hoặc một cách khác là em mở công cụ PageSpeed của Google ra đo tốc độ trang web của em và làm theo các khuyến nghị mà công cụ này tư vấn, làm sao đạt trên 90 điểm cho cả 2 version Mobile và Desktop là okie. Tuy nhiên, cái quan trọng để việc tối ưu tốc độ trở thành mindset đó là tìm cách lôi cuốn và đưa nó vào như một KPI bắt buộc đối với team lập trình (front and back end) và team leader thì việc này mới được triển khai mạnh mẽ. VD trong năm 2015 KPI bên anh là yêu cầu mọi trang web có tốc độ load dưới 4 giây (đo bằng Google Analytics), sau đó năm 2016 là nhỏ hơn hoặc bằng 3 giây. Khi đó IT sẽ tìm mọi cách để giải bài toán này, mình ko cần nghĩ thay cho họ

Q: Anh có thể chia sẻ sơ lược về quy trình ux design đang được áp dụng tại TGDD. Anh có thể chia sẻ về đội ngũ team Ux hiện tại của công ty? Anh có nghĩ những công ty nhỏ, startup có thể học tập gì từ quy trình đó không? Cảm ơn anh và chúc anh năm mới mạnh khoẻ và thành công.

A: UX design là một phần của quy trình phát triển sản phẩm, bên anh ko có người chuyên cho vị trí UX designer mà chỉ có một bạn Product Manager (PM) kiêm nhiệm luôn vài trò UI/UX. Mindset của bọn anh là “Mọi người đều là UX designer”, “Hãy đi hỏi khách hàng”. Quy trình bên anh nếu đẩy đủ thì như thế này:

1. Request: các bộ phận yêu cầu một tính năng có thể là từ team Content, Phát triển bán hàng online, Ngành hàng, marketing, các đối tác. PM sẽ là người tiếp nhận các yêu cầu này
2. Analyse: PM đặt câu hỏi “Why should we do that” Sau bước này PM có thể approve/deny một yêu cầu và đặt thứ tự ưu tiên cho việc đó
3. (Validate ideas) Design + prototype + interview: bạn PM wireframe trên giấy/bảng và thảo luận nhóm + UX audit (optional, nếu đó là một tính năng cũ cần cải tiến), sau khi chốt sơ bộ bắt đầu đi vào UI Design luôn (trên Sketch), sau đó chuyển thiết kế qua Marvelapp.com và sau đó mang prototype (nằm trên điện thoại) đi mời khách vãng lai xem họ cách họ sử dụng (vì sản phẩm của bọn anh dành cho mass market). Kỹ thuật này gọi là hallway testing, và thường chỉ cần gặp và nói chuyện với khoảng 5 Khách hàng là tạm đủ insight và vấn đề cần fix. Sau đó lại tiếp tục quay về tối ưu giao diện và lặp lại chu trình trên sau khoảng 2 – 3 vòng là ra final design
Ở khâu design, có 3 điểm bọn anh lưu tâm, đó là Design for mobile first (Làm mobile xong mới làm Desktop. Đây là một điểm rất khác biệt của bên anh vì UX trên mobile thường khó xử lý hơn Desktop) + Design for worst case scenarios + Lúa hóa cho bà ngoại cũng dùng được
4. Development: Ở bước này, ngoài khâu coding thì một phần thường thấy đó là làm việc tiếp với nhóm content và có một checklist các công việc cần các bạn hoàn thiện, vì một trang web muốn có UX tốt nội dung phụ thuộc rất nhiều vào content tốt (đặc biệt là website TMĐT). UX trong content cũng là một điểm tạo nên sự khác biệt và anh nghĩ yếu tố này chưa nhiều website Việt Nam làm chỉn chu. Có dịp anh sẽ viết sâu hơn về phần này
5. Measure and improve: Sau khi launch web, bọn anh sẽ cài Crazyegg để đo tương tác trên site mới và thiết lập một số goal đo lường. Trong quá trình đó, tiếp tục quan sát và fix các lỗi. Bọn anh cũng có một đội gọi là “Super soi”, đó là những CTV ko nằm trong nhóm web và như những user bình thường, họ có nhiệm vụ detect ra các UI/UX/Function bugs và báo cho nhóm anh fix.

Có 2 điểm đáng chú ý trong quy trình này:
1. Bọn anh invite Developer vào dự án nhiều khi rất sớm, từ khi Analyse hoặc Validate ideas để họ tư vấn cho mình. Các bạn thường cho nhiều góc nhìn sâu sắc có thể mình bỏ lỡ
2. Xây dựng một cơ chế communicate trong team nhấn mạnh yếu tố: Kịp thời, minh bạch, lôi cuốn. Anh nghĩ cách giao tiếp qua lại thường xuyên sẽ giúp dự án tránh được nhiều rủi ro về mặt tiến độ, và tạo động lực cho cả team

Q: Anh có thể cho em biết những tính năng nổi trội mà một website thương mại điện tử cần có là gì không ạ ?

A:  Chào em, một website TMĐT nên chú ý những điểm sau:
1. Speed: load nhanh. KPI của nhóm lập trình bên anh là phải bảo đảm tốc độ load full trang nhỏ hơn hoặc bằng 3 giây. Đừng vì những hiệu ứng phù phiếm mà làm ảnh hưởng đến tốc độ load trang
2. Easy to use: hay nôm na là “Lúa hóa”. Đừng làm theo trend, mà hãy đi hỏi khách hàng thật sự của bạn.
3. Content is king: Phát triển nội dung sao cho người dùng cần gì cũng có, thỏa mãn với việc xem từng nội dung. Thực tế thì việc thiết kế đẹp hay xấu ko quyết định nhiều đến việc bán được hàng hay ko mà nằm ở content. Content viết tốt thì dù trình bày có chưa okie vẫn “chất” và giúp user dễ mua hàng hơn. Có thể nói Content là một điểm nổi bật nhất ở hệ thống website bên anh và để làm được như vậy cần đầu tư lâu dài.
4. SEO is queen: Có một danh sách dài để nói về Design for SEO, và mindset SEO cần thấm nhuần cho từng thành viên kể cả designer chứ ko chỉ PM, content. Một website SEO tốt sẽ tiết kiệm một đống tiền thay vì làm SEM, và thực tế việc làm SEO bên TGDD gần như có một công thức thành công = SEO on site chứ ko cần dùng chiêu trò blackhat hay seeding, link building ở đâu cả
5. Tạo được mối tương tác qua lại với User: Phản hồi nhanh chóng mọi câu hỏi của user trong phần bình luận (VD trong vòng 30p), Live chat, invite đánh giá sản phẩm đã mua v.v… —> tạo điểm tín dụng và uy tín cho nội dung của website đó —> Top destination để tham khảo thông tin

Q: Chào anh Tùng, em rất ngưỡng mộ cách mà Điện máy xanh làm marketing và thấy độ viral của các ấn phẩm bên anh thật khủng, anh có thể cho em được biết bí quyết để làm nên những cú hit như vậy không ạ.

A: Với trường hợp của Điện Máy Xanh, đã có nhiều bài phân tích về việc tại sao nó lại viral rồi. Tuy nhiên để chốt lại thì có mấy yếu tố chính: 1. Sự đầu tư mạnh từ công ty với mục tiêu tạo Top of mind (chi phí quảng cáo trên truyền hình vài trăm tỉ), 2. Sự dũng cảm (quá trình chọn ý tưởng cho clip này khá gây tranh cãi trong nội bộ), 3. Đội ngũ in house follow trend khá tốt, 4. Sự may mắn (bài hát gây ám ảnh và kiếm được earned media mạnh, rất nhiều meme về bài hát này thực sự do các KOL chủ động làm chứ bọn anh ko seeding hay mua)

Q: Hi anh, đã làm công việc này 10 năm, sao anh có thể giữ mãi cảm hứng với nghề vậy ạ? Anh có thể chia sẻ các website hữu ích nếu em muốn tìm hiểu về công việc ux và ui design dc ko? Ngoài ra em thấy 1 số công ty ko có PM cho dự án mà người làm ux thường là bộ phận kinh doanh (trực tiếp đưa yêu cầu) hoạc development (trực tiếp làm). Anh thấy quy trình này có phù hợp ko ạ?

A: Cảm hứng đến từ 2 thứ:
1. Mình tự đặt ra những giới hạn mới muốn vươn tới hoặc được làm cho công ty có tầm nhìn lớn, sếp đặt target năm sau cao hơn năm trước —> từ đó tạo động lực phát triển bản thân
2. Nghề ko phụ người, nếu em cứ kiên trì với một nghề và thành chuyên gia trong lĩnh vực đó, anh tin là thu nhập cũng sẽ tới lúc đủ để em lo cho gia đình + mua những thứ giúp trải nghiệm cuộc sống phong phú hơn. Việc đó sẽ giúp tạo năng lượng cho em tiếp tục theo đuổi công việc đó

Với các công ty nhỏ với cấu trúc phòng ban tinh gọn hoặc các dự án đơn giản (VD làm landing page, site giới thiệu công ty…) thì có thể ko cần PM mà chỉ cần sự kết hợp của một Project owner (Boss, MKT lead, Trưởng phòng kinh doanh…) + 1 Designer (có thể biết chút ít UX) + Developer.

Ở Việt Nam hiện cũng có một số bạn tổ chức các khóa học về UX, em có thể tham khảo UX Design 101 hoặc Scott Experience Design hoặc gia nhập các nhóm active như Team Marquee trên Slack

Cảm ơn anh Nguyễn Thanh Tùng với những câu trả lời rất nhiệt tình và tâm huyết. AMA tuần này đã lên sóng, truy cập ngay TẠI ĐÂY để “chất vấn” anh Bùi Huy Thắng – CEO & Co-Founder đến từ BraveBits nếu bạn có những thắc mắc liên quan đến cách thức để sản phẩm fit với nhu cầu thị trường, kiến thức về UX và kinh nghiệm điều hành công ty nhé!

Nguồn: Topdev

Nên đặt câu hỏi gì khi phỏng vấn vào 1 công ty công nghệ?

Khi tôi, ở vị trí senior, ứng tuyển vào MIT cho vị trí full-time đầu tiên, phần khiến tôi lo sợ nhất không phải là thiết kế thuật toán hay phân tích phức tạp gì, mà chính là khoảnh khắc vào cuối buổi phỏng vấn – khi được hỏi: “Bạn có câu hỏi gì với công ty không?”

Tôi thực sự rất lo, không biết liệu nếu mình đặt ra câu hỏi khó có khiến họ có cái nhìn thiếu thiện cảm với mình và làm giảm khả năng nhận được offer hay không. Tôi càng không muốn thể hiện mình là 1 người khó làm việc cùng. Trên tất cả, tôi không chắc mình nên hỏi cái gì để thực sự hiểu rõ về công ty đó.

2 năm rưỡi sau, tôi giờ đây đã là software engineer full-time tại Quora và đã trải qua hơn 150 giờ phỏng vấn các ứng viên. Cuối mỗi buổi phỏng vấn, tôi luôn dành ra 5-10 phút để cho phép các ứng viên đặt bất kì câu hỏi nào họ muốn. Vào khoảng thời gian đó, tôi thực sự đánh giá rất cao nếu ai đó đặt ra những câu hỏi đúng trọng tâm. Câu hỏi của họ giúp tôi tập trung vào những yếu tố mà họ thực sự hứng thú, thay vì chỉ nói chung chung về công việc.

Dù bạn xin vào vị trí thực tập hay full time, việc đặt cho người phỏng vấn câu hỏi là 1 trong những việc quan trọng nhất mà bạn có thể làm. Lý do là vì:

  1. Có những chuyện về 1 công ty mà bạn chỉ có thể biết được bằng cách thực sự nói chuyện với những người làm việc tại đó. Rất nhiều khía cạnh liên quan đến công ty – như quy mô và sứ mệnh – dễ dàng tìm kiếm được trên online. Nhưng văn hóa và quy trình là những thứ bạn chỉ biết được bằng cách nói chuyện với người trong team.
  2. Đặt ra những câu hỏi khó trả lời chứng tỏ bạn đã suy nghĩ về kiểu môi trường làm việc mà bản thân mong muốn. Là 1 người phỏng vấn, tôi thực sự rất ấn tượng khi các ứng viên hỏi những câu hỏi có chiều sâu và nếu ứng viên đó tỏ ra không hứng thú tìm hiểu thêm về khả năng làm việc tại công ty của tôi, đây sẽ là dấu hiệu không tốt cần cân nhắc.
  3. Để giải quyết nỗi sợ rằng nếu đặt ra những câu hỏi khó sẽ thể hiện hình ảnh tiêu cực, để tôi cho bạn biết: khi bắt đầu phỏng vấn, tôi chưa từng 1 lần cảm thấy bị xúc phạm bởi bất kì câu hỏi nào mà ứng viên đặt ra – và tôi cũng chưa nghe nói ai có cảm giác đó tại Quora. Rõ ràng, nếu người phỏng vấn của bạn dễ cảm thấy phật lòng bởi những câu hỏi nhạy cảm, thì bạn nhiều khả năng sẽ chẳng còn hứng thú làm việc cùng họ nữa.

5 câu hỏi mà bạn nên bắt đầu sử dụng

1. Hãy kể cho tôi về 1 project mà bạn đã từng làm việc trong 6 tháng qua

Câu này sẽ khiến người được hỏi kể về những gì đã thực sự xảy ra – chứ không phải mô tả lại 1 tình huống lý tưởng nào đó.

Đừng quên đào sâu vào những khía cạnh khác để bạn hiểu được chính xác những chi tiết nhỏ nhặt nhất.

  • Ai đã đề xuất dự án này?
  • Làm sao để dự án được ưu tiên hơn?
  • Ai là người chịu trách nhiệm cho dự án này và làm cách nào để quyết định được điều đó?
  • Làm cách nào để bạn giải quyết những bất đồng trong team project?
  • Manager của bạn chịu trách nhiệm như thế nào với project?
  • Quy trình review dự án như thế nào?
  • Nếu phải thực hiện lại project lần nữa, bạn sẽ làm khác đi chuyện gì?

2. Các quyết định về sản phẩm được đưa ra như thế nào?

Đây là 1 câu hỏi mở có chủ đích. Từ đây, bạn có thể khai thác được những điều sau:

  1. hiểu sâu hơn về sứ mệnh và tầm nhìn liên quan đến product của công ty
  2. liệu sứ mệnh và tầm nhìn đó có thực sự gắng liền với các dự án mà công ty đang triển khai hay không

Theo sau đó, bạn có thể hỏi:

  • Sứ mệnh và năng lực cốt lõi của công ty là gì?
  • Làm thế nào để việc ra mắt sản phẩm hiện tại đáp ứng được những điều đó?
  • Có những thách thức nào mà công ty cần vượt qua để đạt được sứ mệnh của mình?
  • Làm thế nào để công ty ưu tiên các khoản đầu tư kĩ thuật hay các khoản đầu tư sản phẩm?

3. Công ty đã giúp bạn đạt được mục tiêu nghề nghiệp ra sao?

Công ty mà bạn đang muốn gia nhập chắc chắn phải tương đồng với các dự định nghề nghiệp của bạn. Lý tưởng nhất là khi gia nhập công ty, bạn sẽ làm những loại công việc đáp ứng chính xác kế hoạch, dự định đó.

Những câu hỏi bạn có thể đặt ra với người phỏng vấn bao gồm:

  • Bạn và quản lý của mình có trao đổi về mục tiêu nghề nghiệp của bạn?
  • Quản lý giúp bạn xác định và thực hiện những mục tiêu đó như thế nào?
  • Điều gì sẽ xảy ra khi mục tiêu cá nhân của bạn không phù hợp với công việc mà bạn đang làm mà công việc đó lại có sức ảnh hưởng lớn nhất đến công ty?
  • Làm thế nào để mọi người phát triển và tiến bộ trong nghề nghiệp của họ tại công ty?
  • Nhân viên mới sẽ được giao trách nhiệm ở chừng mực nào?

4. Văn hóa công ty khác gì với các công ty công nghệ khác?

Rất nhiều công ty Tech có chính sách đãi ngộ tốt, những nhân tài kiệt xuất, văn phòng đẹp, vậy bạn nên xác định được điều gì phân biệt công ty này với các công ty khác.

Những điểm mà bạn có thể cân nhắc chính là:

  • Tỷ lệ giữa những người có kinh nghiệm với những nhân viên mới tuyển dụng
  • Mức độ mọi người giao lưu với nhau ngoài công việc
  • Tính linh hoạt về địa điểm và thời gian làm việc
  • Mức độ trân trọng sự khác biệt

Những con người khác biệt sẽ phát triển tốt tại những môi trường và văn hóa làm việc khác biệt, và việc tìm kiếm 1 nơi giúp bạn làm việc năng suất nhất, cảm thấy thoải mái nhất là 1 yếu tố rất quan trọng.

5. Cơ hội nào cho nhân viên để học hỏi những điều mới?

Học hỏi là 1 trong những thứ có tỷ lệ ROI (Return on Investment) cao nhất về lâu dài. Hầu hết các công ty đều phát triển những quy trình nhập môn và hướng dẫn người mới khá bài bản, nhưng tôi lại đặc biệt đánh giá cao những công ty liên tục đầu tư vào việc phát triển con người trong những tháng đầu tiên.

Ví dụ:

  • Liệu có dễ dàng không nếu mọi người muốn chuyển sang những teams khác và thử nghiệm những vai trò mà họ chưa từng làm trước đây?
  • Có cách nào để học hỏi 1 lĩnh vực kĩ thuật khác so với những gì mà bạn đang làm?
  • Làm cách nào để mọi người chia sẻ những kiến thức có được từ những projects cũ và giúp đỡ nhau phát triển kiến thức chung?

TẠO CV ONLINE MIỄN PHÍ

Hãy hỏi những gì mà bạn quan tâm nhiều nhất

Như bạn thấy, với mỗi câu hỏi tôi lại liệt kê những câu hỏi đi kèm. Hãy hỏi chúng dựa trên những câu trả lời mà bạn nhận được. Tôi cá là những gì bạn thu hoạch được sẽ rất thú vị dựa trên những câu hỏi đi kèm.

Cuối cùng, điều bạn muốn hỏi nhất phải phụ thuộc vào những gì bạn cho là quan trọng nhất trên nấc thang tiếp theo trong nghề nghiệp của mình. Liệu bạn có muốn làm việc với những công nghệ và frameworks Javascript mới nhất, thịnh hành nhất? Bạn có quan tâm đến phát triển khả năng networking và trở thành leader trong lĩnh vực này? Bạn có hứng thú với việc khám phá những vai trò mới như quản lý dự án? Hãy tự mình đặt ra danh sách những câu hỏi mà bạn quan tâm nhất và đảm bảo rằng bạn có cơ hội để hỏi chúng trong buổi phỏng vấn của mình.

Nguồn: medium.freecodecamp.com

Học lập trình có cần quá thông minh?

Như tiêu đề, một vấn đề nan giải và cũng là câu hỏi của nhiều người mới bước chân vào học lập trình. Có nhất thiết bạn cần phải quá thông minh để có thể học lập trình? Câu trả lời là “Hoàn toàn không!”. Nguyên nhân vì sao thì hãy cùng nhau đọc tiếp bên dưới.

Theo mình tìm hiểu thì cho đến nay trong ngành lập trình không có khái niệm nào nói rằng người học phải đạt được sự thông minh ở cấp độ nào thì mới có thể hiểu được. Để học lập trình thì chỉ cần bạn là một người bình thường (IQ >= 85), có một chiếc máy tính (kết nối mạng càng tốt), một vài cuốn sách và một quyết tâm sắt đá.

Có phải đơn giản quá không, thực sự là không đơn giản vậy. Nói ngắn gọn để cho các bạn khỏi hoang mang chứ học lập trình thì cũng có những cái khó của nó. Đầu tiên hãy tìm hiểu vì sao bạn thấy nó khó.

Những điều cản trở bạn học lập trình

Lập trình thật là khô khan và khó hiểu

Mình chắc có tới 96,69% các bạn mới tiếp xúc với ngôn ngữ lập trình sẽ thấy tá hỏa khi đọc một file code chứa khoảng vài trăm dòng trở lên (bản thân mình cũng vậy). Thật dễ hiểu là vì sao mấy bạn sợ, đó là vì bạn chưa quen, chưa hiểu từng thành phần của thứ bạn đang đọc, hoặc chưa hiểu được luồng, quy tắc đặt tên, quy tắc gọi hàm,… nên không thể hiểu hết được code viết để làm gì, chạy ra làm sao. Từ đó cảm giác sợ hãi sẽ xâm lấn khiến cho bạn nản và suy nghĩ rằng bạn không có khả năng học lập trình.

Kể một kỷ niệm nho nhỏ của mình vào năm 2015, có đi phỏng vấn vị trí back-end developer tại một công ty game, bị đưa optimize một file code đâu đến hơn 300 dòng (cũng không nhớ chính xác). Mà lúc đó ngáo ngơ mới ra trường, cũng chưa có kinh nghiệm gì nhiều nên rất choáng khi đụng phải mớ hỗn độn như vậy, cuối cùng mình bỏ bài đó và kết quả thì mấy bạn biết rồi đó. Điều đó sẽ không có gì to tát, rớt thì về học lại thôi, nhưng khi về nhà mình ngồi suy nghĩ lại, hiểu được và cũng thấy được cái chỗ cần optimize đó. Có lẽ lúc đó quá áp lực về tâm lý khi lần đầu tiên thấy nhiều code đến vậy!

afraid-code

Tôi đã từng một thời sợ code

Các thuật toán phức tạp cần người thông minh để giải quyết

Không biết từ bao giờ, nhưng khi nói về các giải thuật thì người ta đều nghĩ ngay đến những lập trình viên với bộ óc siêu phàm. Đừng thần thánh hóa vậy, vì bản thân mình thấy được rằng các giải thuật thường dùng thì không cần đến những bộ óc phải thật xuất sắc mới có thể hiểu được, học ngu như mình cũng đọc và cũng hiểu mà. Tất nhiên sự thông minh sẽ giúp bạn đọc, hiểu và nắm bắt vấn đề nhanh hơn người khác, nhưng đó không phải vấn đề quan trọng nhất, vấn đề thật sự là bạn có muốn hiểu nó không, có quyết tâm đi đến cùng khi gặp khó khăn không? Lúc gặp khó khăn thì bạn làm gì?

Bản thân những người lập trình giỏi không giỏi ngay từ lúc ban đầu, nhưng họ khác biệt bằng thái độ làm việc và suy nghĩ tích cực cộng với sự chăm chỉ không gì sánh nổi.

Malcolm Gladwell nói “Để trở thành chuyên gia trong một lĩnh vực nào đó cần tới 10.000 giờ thực hành”. Vậy bạn đã thực hành bao nhiêu giờ rồi?

Một người anh đã từng chia sẻ với mình rằng: “Khi gặp một khó khăn nếu bạn nói không thể thì nó mãi mãi là không thể, nhưng nếu bạn nói có thể thì cơ hội, cơ may thành công chắc chắn sẽ lớn hơn khi nói không. Đó có lẽ là câu nói hay nhất mình từng được nghe.

Tham khảo các việc làm ngành cnttt hot:

Bạn không tin vào chính con người mình

Đây chính là điều quan trọng nhất giết chết bạn. Mình từng có một thời gian trầy trật với môn lập trình căn bản, có thể vì thời gian đầu khi mới tiếp xúc mình đã đi không đúng cách nên rất khó nuốt mớ kiến thức đó. Nhưng nếu ngay tại thời điểm đó tự chọn cách từ bỏ và phó mặc số phận thì bây giờ đã không thể ngồi đây viết bài chia sẻ, và tất nhiên mình cũng không thể trở thành một lập trình viên… ahihi. Mỗi người sinh ra không ai giống ai cả, và cũng không ai biết được khả năng tiềm tàng trong mỗi chúng ta cho đến lúc bạn làm cho nó bộc phát.

Niềm tin chính là thứ khiến mọi việc dễ dàng hơn rất nhiều, nếu muốn trở thành một người lập trình viên giỏi thì bước đầu tiên phải làm là tin điều đó, là bạn chắc chắn sẽ làm được. Sau đó thì bước những bước đi vững vàng kế tiếp.

Nói rất tốt! Thế bây giờ thì phải làm sao?

Tìm kiếm một nguồn động lực

Động lực thì mỗi người mỗi khác, nhưng thôi để mình kể một câu chuyện điển hình về chuyện tình cay đắng của thằng bạn mình.

Hồi xưa mình có thằng bạn tên (tạm gọi nó là A) sống trong khu chung cư tráng lệ mới xây bên bờ sông Sài Gòn. Đối diện nhà A có em hàng xóm rất là xinh đẹp cùng tuổi tên là B. Hàng ngày A nhìn thấy B với da thịt đầy đặn phô ra trước nhà thì trong lòng vô cùng hoan hỉ và đêm về tốn không biết bao nhiêu là giấy (A chỉ dùng An An và Sài Gòn Extra). Nhưng một hôm thằng A đang nhìn trộm em B thì để ý thấy thằng C nhà bên cạnh cũng đang làm cái hành động y chang mình. A biết rằng B không thể thuộc về mình nếu có cảm tình với C nên cố gắng suy nghĩ cách để lấy lòng em nó. Với niềm tin sắt đá, A quyết tâm học lập trình để làm cho B một website khoe hình ảnh đú đỡn của em ấy và tất nhiên cũng để chiếm trọn lấy tình cảm của em.

Nhưng lập trình không dễ như A tưởng. Lúc mới tiếp cận với ngôn ngữ lập trình thì A luôn bị nhức đầu và buồn ngủ. Nhưng vì muốn chén được con B ngon và múp này, A không thể bỏ cuộc như thế được. Thay vì ngồi học theo các tuts chia sẻ nhan nhản trên mạng, A quyết tâm lập ra con đường sự nghiệp cua gái cho mình mà điển hình là học một ngôn ngữ từ bước cơ bản nhất. Sau vài lần tiếp xúc A quyết tâm chọn PHP để làm nền tảng. Dần dần website khoe hình của A hoàn thiện và chạy mượt mà, nó vội vàng khoe với em B. Sau một hồi nhìn tới ngó lui upload vài hình thử nghiệm thì em B lại muốn phải có thêm chức năng phóng to thu nhỏ để có thể xem rõ hơn những vùng …. nhạy cảm.

Biết giới hạn trình độ của mình, và cũng không muốn làm em B giận. A cày ngày cày đêm học hỏi, mò mẫm kiến thức trên mạng để làm cho xong những chức năng mà em ấy yêu cầu. Ông trời không phụ lòng người, sau vài lần xong trước tiến độ, cái website khoe ảnh nude của em B đã hoàn thiện. Tuy nhiên chỉ sau vài tháng chạy thử với số lượng người truy cập quá đông nên website bị sập và A nghiễm nhiên trở thành một người bạn thân, một người anh trai tốt của em B mà chưa kịp nói lời tỏ tình.

Đấy các bạn thấy chưa, chỉ cần tin vào chính mình thì việc gì cũng có thể thành công. A đã tin vào bản thân, nói đúng hơn là A có động lực lớn để học tập.

Không ngừng thử thách bản thân

Hãy luôn thử thách bản thân khi học lập trình, ngày càng nâng cao skills của bản thân bằng cách học nhiều hơn, học tất cả những gì cảm thấy cần thiết. Tự tìm kiếm những vấn đề còn tồn tại của mình để khắc phục và phát triển. Cách mà mình hay dùng là tự làm những project nhỏ để nâng cao skills những lúc rảnh rỗi, ngoài ra lên mạng tìm đọc những bài viết hay ho của người khác và làm theo cũng là một cách tốt.

Nếu vẫn không biết cần học gì thì có thể đọc bài viết để lập trình được sau 1 năm.

Kết giao và học hỏi với người giỏi hơn mình

Nếu đi với một người giỏi hơn mình, không bao lâu sau mình cũng sẽ giỏi như người đó. Đó là một điều được rút ra bởi….. chủ nhân blog Jusfunny. Tất nhiên, nếu kết bạn với người ta mà chỉ chăm chăm để học hỏi, chỉ để tìm kiếm cái giá trị gì đó cho bản thân thì thật là bỉ ổi và vụ lợi, có ngày nó nổi giận quánh đập, xài xể thì lúc đó mình không chịu trách nhiệm. Hãy làm bạn tự nhiên nhất, thân thiện và chân thành với tất cả mọi người, giúp đỡ lẫn nhau hết sức có thể, học hỏi từ người khác rồi sẽ đến lúc bạn sẽ cùng trình độ với họ.

Mạnh dạn lên, hồi xưa mình toàn vậy! Gặp ai cũng xởi lởi nhảy vô làm quen này nọ đủ kiểu, trong công ty ai cũng biết mặt. Giữa giờ thì rủ nhau pha cà phê, lấy nước (công ty có hệ thống nước và cà phê), cuối tuần rủ nhậu với hy vọng ngày đêm là thu lại chút gì đó kiến thức gì đó. Cũng được một thời gian lên bờ xuống ruộng, hai bên có tình cảm lẫn nhau thì anh kia mới nhắn tin rủ vô hotel bắt pokemon gì đó quý hiếm lắm…. mọi chuyện diễn ra thế nào thì tự tưởng tượng đi, mỏi tay quá.

Lập trình viên giỏi ngoài biết code thì cần có thêm nhiều kỹ năng khác. Trong một team, bạn có thể code tốt nhưng chưa chắc người ta nể bạn, ngoài kỹ năng code bạn còn cần rất nhiều kỹ năng khác để người ta nể phục mình. Có lẽ vài bữa sẽ viết riêng một series bài viết “để trở thành một team member được mọi người nể phục” luôn cho nó máu.

Tham khảo thêm các nhà tuyển dụng HOT như:

Đừng quên giúp đỡ người mới khi đã có kiến thức

Người mới ở đây là lập trình viên mới vô nghề, có thể còn trinh đầu óc. Họ có thể thua bạn về kinh nghiệm và kiến thức. Nhưng chắc chắn họ sẽ có khá nhiều cái hay ho để học hỏi. Ngoài ra dạy lại cho người khác cũng là cách bị động để ta ôn lại kiến thức, khám phá ra những cái mới mà mình chưa có cơ hội đi sâu.

Đó là toàn bộ cách mà mình đang dùng, vì mình không được thông minh mà. Ít nhất là cho tới thời điểm này mình cảm thấy nó hiệu quả với bản thân và tất nhiên là sẽ tiếp tục cố gắng theo đuổi đến cùng ngành lập trình hay ho này.

Thực hành, thực hành và thực hành

Với mốc 10.000 giờ đã nói ở trên, ta cần tới 10 năm để thực hành với 3h/ngày trừ những ngày ốm đau, mệt mỏi vì con bồ có chồng, con vợ có bồ. Càng thực hành nhiều, bộ não sẽ quen dần với việc code mà không thấy sợ hãi. Nó sẽ suy nghĩ logic hơn, càng ngày càng biết được nhiều kiến thức hơn. Hãy thực hành hằng ngày nếu có thể, hãy tìm những vấn đề random và giải quyết nó theo cách của bạn, cố gắng càng nhanh càng tốt. Một khi đã thực hành nhiều, bạn sẽ tự tin vào đôi tay của mình và mọi khó khăn gặp phải cũng sẽ có hướng giải quyết.

Một số nguồn hay nên đọc lúc rảnh rỗi:

Codefights: quánh lộn với code, có một số bài toán lập trình khá chua đấy. Trang này dành để luyện não khá hay, bạn sẽ được code thi với máy. Giải quyết các bài toán do chương trình đưa ra, đặc biệt ở đây có khá nhiều công ty cho đề, nếu bạn giải quyết tốt thì có thể có cơ hội hợp tác với họ.

Quora: nơi rất nhiều người có đầu óc viết những bài viết chất lượng về đủ thứ chủ đề, trong đó có chủ đề về phần mềm và các thứ liên quan đến lập trình viên.

Medium: tương tự quora, được sáng lập bởi co-founder của mạng xã hội twitter.

Simple programmer: trang blog khá hay nói tất tần tật về lập trình, tuy nhiên chú ý một điều là mặc dù hay nhưng vẫn không qua Jusfunny, ahihi.

Stackoverflow: trang giải đáp về lập trình lớn nhất thế giới hiện nay, search bugs trên google chỉ ra trang này, SEO bá ghê.

Techtalk via justfunny

Các resources mới dành cho web dev

Các công cụ lập trình web cứ vài tháng lại thay đổi 1 lần. Bài viết dưới đây cập nhật các công cụ mới trong tháng 1/2017 gồm các thư viện JavaScript, 1 plugin Sketch cho UI design responsive và 1 cặp frameworks CSS.

iTyped

Thư viện Javascript cho phép bạn hiển thị các hiệu ứng typing của danh sách text; 1 dãy hiệu ứng mà bạn đã thấy gần đây. Rất dễ thực hiện thư viện Javascript này với khá nhiều lựa chọn để tối ưu effects. Bạn có thể cài đặt thư viện này thông qua NPM hoặc tải nó bằng CDN tại https://unpkg.com/ityped@0.0.7.

https://github.com/luisvinicius167/ityped

Opera Neon

Opera từng được biết đến là công ty đầu tiên giới thiệu hệ điều hành theo tab, và từ đó, chúng ta có được các hệ điều hành với tên gọi Tabs và Speed Dial. Opera gần đây cho ra mắt chức năng mới là Opera Neon. Một hệ điều hành mới với giao diện tươi mới hơn như các lựa chọn omnibox, split-screen mode và wallpaper đẹp. Vậy liệu Opera Neon có thể thay đổi môi trường hệ điều hành 1 lần nữa?

http://www.hongkiat.com/blog/opera-neon/

At.js

At.js là 1 thư viện Javascript mới, cho phép thêm các biểu tượng mặt cười, mention bạn bè hoặc tag – những tính năng chúng ta từng thấy trên Slack, Twitter và Facebook. Plugin này hoạt động được trên Internet Explore 7 và cả Internet Explorer 6. Thật tuyệt vời!

https://github.com/ichord/At.js

Release

Release sẽ giúp tạo release phiên bản mới của phần mềm trong Github thuận tiện hơn. Một release mới thường đi kèm với 1 changelog, và module này để bạn điền changelog tự động lấy từ Git commit messages.

https://github.com/zeit/release

Prettier

Một beautifier Javascript đảm bảo code Javascript được format 1 cách thống nhất. Prettier hỗ trợ ES2017 và JSX.

https://github.com/jlongster/prettier

Ayu

Ayu là theme Sublime Text mới và hiện đại, đi kèm 2 tông tối và sáng. Ayu, trong tiếng Indonesia nghĩa là đẹp, nên có thể hiểu là Ayu giúp Sublime Text UI trông đẹp mắt hơn.

https://github.com/dempfi/ayu

JSON Splora

Một ứng dụng nhẹ dùng để chỉnh sửa, visualize dữ liệu JSON. Ứng dụng tương thích với Windows, Linux và MacOS.

https://github.com/wellsjo/JSON-Splora

Zooming

Nguồn JavaScript để zoom hình ảnh. Zooming được tối ưu hóa trên mobile, hoạt động hiệu quả trên màn hình hi-def và rất dễ tùy chỉnh.

https://github.com/kingdido999/zooming

Ramme

Ramme là 1 client của desktop Instagram. Dù chưa chính thức, nhưng bạn có thể học được kha khá thứ hay ho từ source code này.

https://github.com/terkelg/ramme

Change Username

Một plugin WordPress đã từng được activate, thêm link “change” bên cạnh username input và cho phép bạn thay đổi username. 

https://github.com/dannyvankooten/change-username

NodeifyWP

NodeifyWP là 1 plugin WordPress độc lạ, để bạn sử dụng WordPress như bình thường, sau đó output content sử dụng module Node.js. Tôi chưa từng thử plugin này trong dự án nào hết. Nhưng bài thuyết trình tôi xem tại WordCamp Denpasar 2016, plugin này hứa hẹn sẽ hiện đại hóa công việc lập trình WordPress.

https://github.com/10up/nodeifywp

ColorMe

ColorMe khá khác biệt so với các ứng dụng generator color khá. Ngoại trừ các code generating color, ứng dụng này sẽ điều chỉnh độ sáng, độ bóng, độ sắc, độ bão hòa, độ tương phản… của màu sắc. 

https://colorme.io/

Các packages WP-CLI

Tập hợp các extensions của WP-CLI bổ sung các dòng lệnh và parameters để thực hiện thêm các tasks như triển khai WordPress với server ở xa, tích hợp site WordPress, xóa caches

http://wp-cli.org/package-index/

Tailor Page Builder

Một plugin WordPress tạo content non-linear với 1 giao diện drag-n-drop. Plugin này có thể mở rộng được với 1 component mới để thêm content type unique vào. Tailor Page Builder còn cung cấp WP-API để quản lý những nội dung này. Đây có thể xem là plugin tốt nhất trong lĩnh vực này.

Tailor Page Builder

XVG

XVG là 1 extension của Chrome hiển thị các outline và anchors graphic SVG, hỗ trợ debug dễ dàng các đối tượng SVG.

https://xvg.now.sh/

RibbonJS

RibbonJS là 1 thư viện JavaScript generate các dải lụa trảng trí trên trang web. Nó chỉ tốn 1kb nhưng lại rất dễ tùy chỉnh. 

http://git.hust.cc/ribbon.js/

Auto Layout

Auto-Layout là 1 plugin Sketch cung cấp 1 số lượng các kích cỡ màn hình preset để test thiết kế UI của bạn. Nhờ đó, bạn có thể đảm bảo giao diện thiết kế đẹp mắt dù user xem trên iPhone 5 hay iPhone 6… Plugin này cũng cho phép bạn define các kích thước tùy chỉnh trong trường hợp không hiển thị trên preset. Xem thêm video này

https://animaapp.github.io/Auto-Layout/

Funcssions

Funcssion tập hợp các classes CSS hoạt động theo nguyên tắc Pure Function. Mỗi class CSS xác định 1 mục đích styling duy nhất. Framework CSS này hiện đang được cải tiến với nhiều tính năng hơn như Grid, Buttons responsive…

https://funcssion.com/

Webslides

Một framework nhẹ, dễ dùng để xây dựng các slide thuyết trình. Thư viện này chỉ sử dụng HTML và CSS. Các websites hiện tại đang cung cấp các bộ slide templates giúp bạn bắt đầu xây dựng slide thuyết trình của mình ngay lập tức.

https://webslides.tv/

Resilient Web Design

Resilient Web Design là 1 quyển sách online. Quyển sách này không liên quan gì đến kĩ thuật mà tập trung nói về lịch sử, nguyên tắc và những phát minh định hình nên Web như chúng ta đang có hiện tại. Một quyển sách tuyệt vời để đọc vào dịp cuối tuần.

https://resilientwebdesign.com/

Nguồn Hongkiat