Home Blog Page 198

RabbitMQ là gì? Hướng dẫn sử dụng RabbitMQ chi tiết

rabbitmq-la-gi

RabbitMG là gì? Để hiểu được khái niệm về RabbitMG, trước hết bạn cần nắm rõ về Message Broker và các thuật ngữ liên quan. Hãy theo dõi bài viết dưới đây của đội ngũ TopDev để tìm hiểu chi tiết về RabbitMG và cách sử dụng nó hiệu quả.

RabbitMQ là gì?

RabbitMQ là một AMQP message broker hay còn gọi là phần mềm quản lý hàng đợi message. Nói đơn giản, đây là phần mềm định nghĩa hàng đợi một ứng dụng khác có thể kết nối đến để bỏ message vào và gửi message dựa trên nó.

Bạn có thể coi nó như một hộp thư nơi bạn xếp chồng các bức thư của mình. RabbitMQ sau đó lấy từng bức thư và đưa nó đến đích của nó.

Message broker là gì?

Message broker là một chương trình trung gian được thiết kế để validating, transforming và routing messages. Chúng phục vụ các nhu cầu giao tiếp giữa các ứng dụng với nhau.

Với Message broker, ứng dụng nguồn (producer) gửi một message đến một server process mà nó có thể cung cấp việc sắp xếp dữ liệu, routing (Định tuyến), message translation, persistence và delivery tất cả các điểm đến thích hợp (consumer).

Có 2 hình thức giao tiếp cơ bản với một Message Broker:

  • Publish và Subscribe (Topics)
  • Point-to-Point (Queues)

Khi nào và tại sao dùng RabbitMQ

RabbitMQ giúp các web server gửi các reponse cho các request rất nhanh thay vì bị ép buộc chạy một procedure ngốn tài nguyên trên một hệ thống. Việc đưa message vào hàng đợi là một giải pháp hay khi ta muốn phân tán message cho nhiều người nhận giúp giảm tải cho các worker xử lý.

VD như user được phép tạo file PDF cho mẫu cv it từ phần mềm tạo CV Online của TopDev, bài toán là khi hàng nghìn user cùng nhấp vào nút tạo PDF, lúc này server nhận rất nhiều request sẽ gây ra vài vấn đề như chậm, quá tải, thậm chí không tạo được file PDF do nghẽn…lúc này chúng ta cần dùng RabbitMQ để đẩy các request này vào hàng chờ. Cơ chế như sau:

Một consumer lấy message từ hàng đợi và bắt đầu xử lý PDF trong lúc với một producer đang bỏ thêm những message mới vào trong hàng đợi. Một request có thể được tạo bằng ngôn ngữ này và xử lý bằng một ngôn ngữ khác. Hai ứng dụng trao đổi với nhau qua các message. Do đó, hai ứng dụng gửi và nhận sẽ có độ ràng buộc thấp.

  1. User gửi yêu cầu tạo PDF lên ứng dụng web
  2. Ứng dụng web (producer) gửi message đến RabbitMQ, có chứa thông tin dữ liệu mà user yêu cầu, như tên, email, số điện thoại…
  3. Một exchange được đồng ý từ ứng dụng producer và dẫn chúng đến đúng hàng đợi tạo PDF
  4. Một worker xử lý PDF (consumer) nhận một task và bắt đầu xử lý tạo PDF.

rabbitmq

Cài đặt RabbitMQ

Trong Ubuntu và hệ điều hành debian khác, bạn có thể cài đặt RabbitMQ bằng cách thực hiện các lệnh sau trên terminal của bạn:

echo "deb http://www.rabbitmq.com/debian/ testing main"  | sudo tee  /etc/apt/sources.list.d/rabbitmq.list > /dev/null
sudo wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc
sudo apt-get update
sudo apt-get install rabbitmq-server -y
sudo service rabbitmq-server start
sudo rabbitmq-plugins enable rabbitmq_management
sudo service rabbitmq-server restart

Lệnh đầu tiên là nối thêm nguồn rabbitmq vào danh sách nguồn phần mềm. Tiếp theo, chúng ta tải về khóa đăng ký rabbitmq bằng wget .

Sau đó thêm khóa vào Ubuntu. Tiếp theo chúng ta gọi apt-get update để cập nhật danh sách các nguồn phần mềm. Tiếp theo, chúng ta cài đặt máy chủ RabbitMQ, khởi động nó sau đó kích hoạt plugin quản lý RabbitMQ.

Điều này cung cấp quản lý API dựa trên HTTP để theo dõi máy chủ RabbitMQ của bạn. Cuối cùng, chúng ta khởi động lại máy chủ RabbitMQ để thay đổi sẽ có hiệu lực. Tên người dùng và mật khẩu mặc định là guest . Và cổng mặc định trong đó nó chạy là 5672 .

Nếu bạn đang sử dụng hệ điều hành khác, bạn có thể tìm cách cài đặt RabbitMQ cho hệ điều hành cụ thể của bạn tại đây: http://www.rabbitmq.com/download.html .

Làm việc với RabbitMQ

Khi bạn đã cài đặt xong RabbitMQ, chúng ta có thể cài đặt thư viện AMQP cho PHP. Điều này thực hiện giao thức AMQP (Giao thức hàng đợi thông điệp nâng cao). Như tên cho thấy nó là một giao thức được sử dụng để gửi thông điệp.

Bắt đầu bằng cách tạo một danh mục mới, đây là nơi chúng tôi sẽ đặt tất cả các tệp để thử nghiệm RabbitMQ. Tiếp theo, tạo một tệp composer.json (đọc thêm composer là gì?) và thêm các phần sau:

{
  "require": {
      "videlalvaro/php-amqplib": "2.2.*"
  }
}

Tiếp theo, mở terminal và cd của bạn vào thư mục bạn đã tạo trước đó, sau đó thực hiện composer install để cài đặt thư viện AMQP.

Trước khi chúng ta tiếp tục, hãy cài đặt Swiftmailer . Bạn có thể làm điều đó bằng cách thực hiện lệnh sau từ terminal của bạn. Thao tác này cũng thêm mục nhập vào Swiftmailer vào composer.json của bạn:

composer require swiftmailer/swiftmailer @stable

Gửi message

Đầu tiên cho phép tạo biểu mẫu được sử dụng để gửi email. Điều này sẽ chấp nhận tên và địa chỉ email của người gửi, địa chỉ email của người nhận và sau đó là chủ đề và thông điệp. Đặt tên cho tệp form.php :

<?php
if(!empty($_GET['sent'])){
?>
<div>
    Your message was sent!
</div>
<?php
}
?>
<form action="mailer.php" method="POST">
    <div>
        <label for="from">From</label>
        <input type="text" name="from" id="from">
    </div>
    <div>
        <label for="from_email">From Email</label>
        <input type="text" name="from_email" id="from_email">
    </div>
    <div>
        <label for="to_email">To Email</label>
        <input type="text" name="to_email" id="to_email">
    </div>
    <div>
        <label for="subject">Subject</label>
        <input type="text" name="subject" id="subject">
    </div>
    <div>
        <label for="message">Message</label>
        <textarea name="message" id="message" cols="30" rows="10"></textarea>
    </div>
    <div>
        <button type="submit">Send</button>
    </div>
</form>

Tiếp theo, tạo tệp sẽ đẩy thư vào hàng đợi. Đặt tên cho tệp tin sender.php . Yêu cầu tệp autoload.php để các phụ thuộc của chúng sẽ được tự động tải bởi PHP. Sau đó sử dụng AMQPConnection và AMQPMessage từ thư viện AMQP.

AMQPConnection cho phép chúng ta tạo một kết nối mới đến máy chủ RabbitMQ và AMQPMessage cho phép chúng ta tạo các thông điệp mà chúng ta có thể đẩy vào hàng đợi.

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('email_queue', false, false, false, false);

$data = json_encode($_POST);

$msg = new AMQPMessage($data, array('delivery_mode' => 2));
$channel->basic_publish($msg, '', 'email_queue');

header('Location: form.php?sent=true');
?>

Chia nhỏ nó, trước tiên chúng ta tạo một kết nối mới bằng cách tạo một thể hiện mới của lớp AMQPConnection . Điều này đòi hỏi các đối số sau đây:

  • host – máy chủ mà máy chủ RabbitMQ đang chạy. Trong trường hợp này, chúng ta đã cài đặt RabbitMQ trên cùng một máy tính, chúng ta đang chạy tập lệnh. Vì vậy, nó phải là localhost .

Lưu ý rằng trong thế giới thực, chúng ta cài đặt RabbitMQ trên một máy chủ khác, khác với máy chủ đang sử dụng để phục vụ trang web của chúng ta. Vì vậy, thay vì localhost chúng ta sử dụng địa chỉ IP công cộng của máy chủ đó.

  • port – cổng mà máy chủ RabbitMQ đang chạy.
  • user – tên người dùng để sử dụng để đăng nhập vào máy chủ. Theo mặc định, tên người dùng được đặt thành guest .
  • password – mật khẩu của người dùng. Theo mặc định, mật khẩu được đặt thành guest .

Tiếp theo chúng ta tạo một kênh. Chúng ta có thể làm điều đó bằng cách gọi phương thức channel() từ kết nối mà chúng ta vừa khai báo.

<?php
$channel = $connection->channel();
?>

Tiếp theo, chúng ta khai báo hàng đợi sẽ được sử dụng bằng cách gọi phương thức queue_declare.

<?php
$channel->queue_declare('email_queue', false, false, false, false);
?>

Phương thức queue_declare chiếm các đối số sau:

  • queue name – tên mà bạn muốn sử dụng cho hàng đợi, bạn có thể cung cấp bất kỳ thứ gì cho điều này.
  • passive – một giá trị boolean để xác định xem có nên kiểm tra một trao đổi hiện có hay không.
  • durable – một giá trị boolean để xác định xem RabbitMQ giữ trên một hàng đợi khi máy chủ bị treo.
  • exclusive – một giá trị boolean để xác định xem hàng đợi có được sử dụng bởi chỉ một kết nối hay không.
  • auto-delete – giá trị boolean để xác định xem hàng đợi có bị xóa khi người đăng ký hủy đăng ký cuối cùng hay không.

Tiếp theo, chúng ta chuyển đổi dữ liệu POST mà chúng tôi nhận được từ biểu mẫu thành chuỗi JSON. Chúng ta chỉ có thể truyền các chuỗi như một thông báo, vì vậy chúng ta sẽ phải chuyển đổi chuỗi này sau này thành một mảng trên đầu của người nhận.

<?php
$data = json_encode($_POST);
?>

Tiếp theo chúng ta tạo một tin nhắn mới. Điều này chấp nhận 2 đối số: dữ liệu và một loạt các tùy chọn. Đối với mảng các tùy chọn, chúng tôi chỉ định delivery_mode là 2 có nghĩa là thông báo vẫn tồn tại. Điều này có nghĩa là nó không bị mất khi máy chủ bị lỗi hoặc xảy ra lỗi.

<?php
$msg = new AMQPMessage($data, array('delivery_mode' => 2));
?>

Tiếp theo, chúng ta xuất bản thông điệp bằng cách gọi phương thức basic_publish() trên kênh. Điều này chấp nhận 3 đối số: thông điệp, trao đổi và tên của hàng đợi.

Nếu bạn đang tự hỏi tại sao chúng ta đặt giá trị trao đổi thành một chuỗi rỗng, đó là bởi vì chúng ta không thực sự cần nó. Việc trao đổi thường được sử dụng cho các mẫu pub-sub. Những gì đang sử dụng ở đây chỉ là xuất bản cơ bản.

<?php
$channel->basic_publish($msg, '', 'email_queue');
?>

Cuối cùng, chúng tôi chỉ chuyển hướng người dùng đến biểu mẫu.

<?php
header('Location: form.php?sent=true');
?>

Nhận thông điệp

Bây giờ đã sẵn sàng để viết lệnh sẽ nhận được các thông điệp được gửi bởi người dùng. Đặt tên cho tệp tin là file receiver.php. Đây là nội dung đầy đủ của tệp:

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPConnection;

$connection = new AMQPConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('email_queue', false, false, false, false);

echo ' * Waiting for messages. To exit press CTRL+C', "\n";

$callback = function($msg){

    echo " * Message received", "\n";
    $data = json_decode($msg->body, true);

    $from = $data['from'];
    $from_email = $data['from_email'];
    $to_email = $data['to_email'];
    $subject = $data['subject'];
    $message = $data['message'];

    $transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
      ->setUsername('YOUR_GMAIL_EMAIL')
      ->setPassword('YOUR_GMAIL_PASSWORD');

    $mailer = Swift_Mailer::newInstance($transporter);

    $message = Swift_Message::newInstance($transporter)
        ->setSubject($subject)
        ->setFrom(array($from_email => $from))
        ->setTo(array($to_email))
        ->setBody($message);

    $mailer->send($message);

    echo " * Message was sent", "\n";
    $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('email_queue', '', false, false, false, false, $callback);

while(count($channel->callbacks)) {
    $channel->wait();
}
?>

Chia nhỏ nó, 5 dòng mã đầu tiên về cơ bản giống với dòng chúng ta có trong tệp sender.php. Sau đó, chúng ta chỉ xuất một thông báo cho biết cách chúng ta có thể ngừng chạy tệp. Chúng ta cần chạy file này từ terminal để dừng nó, chúng ta chỉ cần nhấn CTRL + C

Tiếp theo, chúng ta khai báo một hàm được đặt tên. Điều này sẽ được sử dụng để xử lý thông điệp mà chúng ta đã chuyển từ người gửi. Điều đầu tiên nó làm là đầu ra tin nhắn đã được nhận. Sau đó, chúng ta sử dụng json_decode() để chuyển đổi chuỗi JSON trở lại một mảng.

<?php
$callback = function($msg){
    echo " * Message received", "\n";
    $data = json_decode($msg->body, true);
};
?>

Tiếp theo, chúng ta trích xuất dữ liệu và gán chúng cho từng biến của riêng chúng:

<?php
$from = $data['from'];
$from_email = $data['from_email'];
$to_email = $data['to_email'];
$subject = $data['subject'];
$message = $data['message'];
?>

Tiếp theo chúng ta khai báo một Transporter mới sẽ được sử dụng bởi Swiftmailer. Điều này cho phép chúng ta sử dụng tài khoản gmail để gửi email. Khai báo một cá thể mới chấp nhận 3 đối số: máy chủ, cổng và mã hóa. Sau đó, chúng ta đặt tên người dùng và mật khẩu.

<?php
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
      ->setUsername('YOUR_GMAIL_EMAIL')
      ->setPassword('YOUR_GMAIL_PASSWORD');
?>

Tiếp theo chúng ta khai báo một cá thể mailer mới và cung cấp transporter làm đối số.

<?php
$mailer = Swift_Mailer::newInstance($transporter);
?>

Tiếp theo tạo một tin nhắn mới, điều này cũng chiếm transporter như đối số của nó. Sau đó chúng tôi đặt chủ đề, từ đâu, đến đâu và nội dung của thông báo.

<?php
$message = Swift_Message::newInstance($transporter)
        ->setSubject($subject)
        ->setFrom(array($from_email => $from))
        ->setTo(array($to_email))
        ->setBody($message);
?>

Cuối cùng chúng ta sẽ gửi thông điệp và xuất thống điệp đã gửi. Dòng cuối hiển thị cho RabbitMQ thấy rằng việc gửi đã thành công.

<?php
$mailer->send($message);
echo " * Message was sent", "\n";

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
?>

Chạy chương trình

Bây giờ bạn có thể chạy bộ nhận thông điệp bằng cách vào terminal và thực hiện lệnh sau:

php receiver.php

Khi chạy, hãy truy cập trình duyệt của bạn và truy cập tệp sender.php . Nhập chi tiết tin nhắn của bạn và nhấp vào gửi. Bạn ngay lập tức được chào đón bởi một ‘Tin nhắn của bạn đã được gửi!’ văn bản nhưng nếu bạn ngay lập tức kiểm tra tài khoản email của mình thì chưa có.

Nếu nó không có thì hàng đợi vẫn đang xử lý nó. Kiểm tra đầu ra được hiển thị trên cửa sổ đầu cuối nơi bạn đã thực thi bộ thu. Bạn sẽ thấy thông báo ‘Đã gửi thư’ nếu email đã được gửi.

Kết luận RabbitMQ

RabbitMQ là một cách hay để triển khai các ứng dụng nhắn tin như ứng dụng chúng ta đã tạo trong hướng dẫn này. Chúng ta chỉ vừa mới làm đơn giản với hướng dẫn này. Tôi khuyên bạn nên kiểm tra http://www.rabbitmq.com/getstarted.html  để tìm hiểu thêm.

Nguồn: Wern Ancheta Blog

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

Xem thêm tuyển dụng ngành công nghệ thông tin hàng đầu tại TopDev

10 mẹo nhỏ cho bạn để coding hiệu quả hơn!

  1. Cố gắng có một giấc ngủ đàng hoàng. Dù cho nó có obvious cỡ nào đi nữa, thì cũng phải ngủ được 1 giấc đàng hoàng, vì coding cực kì – cực kì tốn sức.
  2. Vận động tẹo nào. Ngồi ghế 8 tiếng dai dẳng là một cực hình đối với cơ thể bạn;
  3. Đừng cố code quá sức. Code kiểu chạy đua thì chỉ cho ra shit code mà thôi, và nó sẽ ám bạn suốt đời.  
  4. Hãy cảnh giác với The Zone – một trạng thái mà trong đầu bạn chẳng có gì ngoài code. Tức là bạn tập trung cực kì cao độ và cảm thấy như đang chạy đua với chính mình. Đừng như thế! Cũng giống như một con ngựa đua, bạn đang bị tấm vải da che mắt, ngăn bạn nhìn thấy mọi thứ đang diễn ra xung quanh mình đấy. Điều này dẫn đến ý tiếp theo.
  5. Hãy thường xuyên rời khỏi ghế và đi đi lại lại (theo kinh nghiệm cá nhân của tôi). Tôi thích mổ xẻ vấn đề cho đến khi nó được giải quyết mới thôi. Nếu bỏ giữa chừng thì cảm thấy hụt hẫng như mình vừa bỏ cuộc vậy. Chẳng khác nào một kẻ thất bại. Điều đáng nói là khi tôi đi lại trong phòng, phần não đang im của tôi có cơ hội để pop-up một vài ý tưởng thực sự tốt – những ý tưởng mà có thể giải quyết ngon lành vấn đề mà không cần đập code đi xây lại. Điều này thường xảy ra sau khi tôi rơi vào trạng thái ‘The Zone’ và bước ra;
  6. Hãy giữ cân bằng và sống hoà thuận với vợ/chồng và con cái của bạn. Không gì giết chết sự sáng tạo nhanh hơn việc lo lắng liệu người ấy có bao giờ rời bỏ bạn hay không, hay những đứa trẻ của mình lớn lên có ghét mình hay không. Code đòi hỏi rất khắt khe, và cũng có thể gây nghiện nữa. Bạn sẽ bị ám ảnh đến mức dành hàng tiếng đồng hồ sau khi thức dậy để nghĩ về nó hoặc lãng phí thời gian với những ý tưởng “trên mây”. Yên tâm đi, sẽ có thời gian và địa điểm riêng cho code, nhưng ắt nó phải được xếp SAU gia đình – nền móng để xây dựng mọi thứ cho bạn;
  7. Ngoài giờ làm việc, hãy dành chút thời gian cho tinh thần của bạn, cho “lập trình” của riêng bạn. Làm cái gì đó vui vẻ. Làm cái gì đó nhảm shit. Thoải mái làm những gì bạn thích. Không có áp lực phải hoàn thành bất cứ việc gì ngoài áp lực bạn tự tạo ra cho chính mình;
  8. Bạn không bao giờ biết được tất cả mọi thứ, vì vậy đừng cố quá để rồi quá cố. Bắt kịp tốc độ phát triển của công nghệ là điều gần như ko thể. Vì thế, chỉ biết những gì bạn cần biết và biết thật rõ chúng trước. Sau đó, dần dần đào sâu hơn;
  9. Tìm một nơi làm việc yên tĩnh. Đeo tai nghe vào nếu văn phòng của bạn quá ồn. Cá nhân tôi không bao giờ nghe nhạc vì tôi thấy nó khiến tôi mất tập trung hơn;
  10. Đừng phụ thuộc vào cà phê hay những thức uống bổ sung năng lượng để duy trì cảm giác năng động kích thích. Rõ ràng đó là một dấu hiệu cho thấy bạn quá mệt mỏi để tiếp tục làm tốt công việc rồi.

Bạn thấy đấy, top 10 tips của tôi chả liên quan gì đến việc code hay luyện tập code cả. Bởi vì cảm xúc tích cực mới là điều kiện tiên quyết để bạn code hiệu quả.

Happy coding!

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

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

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

[Recap] ReactJS & ReactNative thực chiến

Tối ngày 23/08 tại Workyos Co-working Space sự kiện ReactJS & ReactNative: Optimizing Application in Real World do TopDev phối hợp cùng ShopBack đã diễn ra thành công tốt đẹp với sự tham gia của hơn 200 lượt người tham dự.

React là một thư viện UI được phát triển bởi Facebook nhằm mục đích hỗ trợ việc xây dựng những components UI có tính tương tác cao, có trạng thái và có thể sử dụng lại được.

React được sử dụng trong rất nhiều dự án lớn như Facebook Ads cũng như nhiều dự án khác Instagram, Netflix hay Airbnb…. Theo số liệu từ Github repo của React hiện có: 67k stars, duy trì bởi Facebook và Instagram, hơn 1,200 contributors là các lập trình viên giỏi. Không còn nghi ngờ gì về mức độ phổ biến của thư viện này.

Điểm hấp dẫn của React là thư viện này không chỉ hoạt động trên phía client, mà còn được render trên server và có thể kết nối với nhau. React so sánh sự thay đổi giữa các lần render này với lần render trước và cập nhật ít thay đổi nhất trên DOM.

Tuy nhiên, làm thế nào để có thể tận dụng được những ưu điểm của React thì không phải ai cũng biết. Làm thế nào để tối ưu hóa tốc độ của React Application? React Native sinh ra là dành cho Mobile, liệu bạn đã từng có suy nghĩ sẽ mang platform-agnostic và APIs của nó và sử dụng với Web?

Tất cả những thắc mắc đã được được giải đáp bởi các diễn giả nhiều năm kinh nghiệm đến từ ShopBack ngay tại sự kiện ReactJS & ReactNative: Optimizing Application in Real World
Trong suốt 3 tiếng diễn ra sự kiện 200 khán giả tham dự đã đồng hành cùng 2 diễn giả đến từ ShopBack là anh Hoàng Nguyễn và anh Hiếu Văn đi qua rất nhiều vấn đề xoay quanh 2 Topic chính:

  • Topic 1: Optimizing React Application in Real World
  • Topic 2: React Native for Web

Cùng điểm lại những khoảnh khắc đáng nhớ từ sự kiện ReactJS & ReactNative Optimizing React Application in Real World

Tối ngày 23/08 tại Workyos Co-working Space sự kiện ReactJS & ReactNative: Optimizing Application in Real World đã diễn ra
Sự kiện thu hút hơn 200 lượt người tham dự
Diễn giả Hoàng Nguyễn mang đến sự kiện Topic: Optimizing React Application in Real World
Diễn giả HIếu Văn mang đến sự kiện Topic: React Native for Web
Rất nhiều câu hỏi xoay quanh chủ đề React được người tham dự đặt ra trao đổi thẳng thắng cùng 2 diễn giả

TopDev

Tham khảo thêm việc làm React Native hấp dẫn, việc làm ReactJS tại đây

Thời cơ tuyển dụng ngành CNTT đã đến cơ hội hoàn thành KPI

Tháng 10 đã đến, cuộc chạy đua tìm kiếm ứng viên ngành CNTT đang vào giai đoạn nước rút, nhằm chuẩn bị cho những tháng cuối năm, khi mà thị trường nhân sự bước vào chu kỳ ảm đạm ít có biến động. Đây cũng chính là cơ hội cuối cùng trong năm nay để nhà tuyển dụng thu hút được những ứng viên tài năng.

Từ trước đến nay, nhân lực ngành CNTT chưa bao giờ hết hot. Theo nhận định từ chuyên gia, với tốc độ tăng trưởng như hiện nay dự báo đến cuối năm 2022 cần khoảng 300,000 – 350,000 nhân lực, Nhưng cho đến hiện tại, chỉ có khoảng 200,000 nhân lực đủ sức đáp ứng yêu cầu công việc.

Điều này vô tình chung dẫn tới cuộc chiến thu hút nhân tài giữa các doanh nghiệp ngày càng trở nên căng thẳng. Các yếu tố được kỳ vọng sẽ thu hút ứng viên: mức lương cạnh tranh, đãi ngộ tốt, môi trường làm việc,… dường như không còn đủ sức hấp dẫn đối với các ứng viên trong lĩnh vực CNTT hiện nay. Nên chăng đã đến lúc nhà tuyển dụng nên cân nhắc và tận dụng yếu tố “thời điểm“. Đặc biệt khi mà vì “nhảy việc” đang trở thành văn hóa được ưa chuộng trong giới CNTT.

Tuyển dụng đúng người, đúng thời điểm

Càng về những tháng cuối năm kéo dài cho đến tận đầu năm sau sẽ là thời điểm rất khó khăn cho nhà tuyển dụng. Khi mà tâm lý chung người đi làm sẽ là đợi thưởng tết nên sẽ không muốn nhảy việc. Bước sang đầu năm sau, thị trường tuyển dụng sẽ bắt đầu sôi động trở lại, thế nhưng đây cũng là mùa mà “Nhà nhà đều tuyển, người người cũng tuyển”, cuộc chiến giành người này thêm phần khó khăn và quyết liệt hơn rất nhiều. Vây khi nào mới là thời điểm “vàng” để tuyển dụng?

 

Theo Báo cáo tình hình, những dự báo và xu hướng của ngành CNTT do TopDev thực hiện với hơn 10,000 ứng viên CNTT, Có đến 14.1% các ứng viên đang muốn nhảy việc vào thời điểm nhạy cảm này. Nhiều chuyên gia trong ngành tuyển dụng chỉ ra rằng, đây là thời điểm tốt tuyển những ứng viên tốt, đến tháng 11 và tháng 12 thì mọi thứ sẽ dần ổn định, cơ hội tuyển thành công sẽ giảm đi nhiều.

Đối với doanh nghiệp, đây là cũng là mùa nhu cầu tuyển dụng tăng cao, khi mà có rất nhiều việc phải làm cộng thêm nhiều chỉ tiêu áp lực. Còn đối với người lao động, thì đây là thời điểm không quá sớm, cũng không quá muộn để nhảy việc trong năm, nhảy việc vào thời điểm này thì sẽ có ít đối thủ cạnh tranh cho các vị trí hấp dẫn mà mình đang nhắm tới. Nếu nắm bắt cơ hội tốt, họ hoàn toàn có thể lấy được vị trí mình mong muốn.

Bên cạnh đó, đây cũng sẽ là 2 tháng sôi động cuối cùng của nhân sự ngành IT, vì thị trường tuyển dụng này sang đến tháng 10 sẽ giảm nhiệt hẳn so với các tháng còn lại. Với tâm lý ngại nhảy việc vẫn còn phổ biến vào đúng cuối năm, điều này sẽ giữ chân LTV ở vị trí hiện tại và sẽ là một rào cản rất lớn cho các nhà tuyển dụng.

Nếu bỏ lỡ đợt tuyển dụng hiếm có gần cuối năm này, các nhà quản lý nhân sự sẽ phải đợi đến đầu năm và sau Tết, một cuộc chiến giành người không thể tránh khỏi nhưng sẽ tiêu hao nhiều thời gian và công sức hơn cho cả doanh nghiệp. Chính vì thế, nếu muốn săn người tài về cho mình thì đây chính là thời điểm lý tưởng mà các nhà tuyển dụng cần nắm bắt.

Lời kết

Để giải quyết nỗi đau trong việc kiếm tìm nhân lực cho những dự án dài hơi của công ty, các nhà tuyển dụng phải nắm được các cơ hội vàng chính là vào thời điểm tháng 8 và tháng 9 trước khi các nhân sự nghĩ đến việc “ổn định” cho đến khi qua kì nghỉ Tết nguyên Đán. Và vì vậy, việc tuyển dụng tổng lực kết hợp nhiều kênh tuyển dụng trong ngành, đặc biệt là các chuyên trang về tuyển dụng CNTT sẽ góp phần giúp doanh nghiệp có thể chốt sớm được những nhân tài trong thời điểm này.

Cách sử dụng Laravel với Socket.IO

Cách sử dụng Laravel với Socket.IO

Tác giả: Adnan Sabanovic

Websockets thật sự rất hữu ích nếu bạn muốn xem các hoạt động tại realtime của user (hoặc có một số queue job).

Đừng nên ngại từ “Websockets”. Tôi sẽ đưa ra một số hướng dẫn về cách sử dụng nó và sẽ giải đáp thắc mắc của bạn khi cần.

“Tại sao không dùng Pusher?”

Có một vấn đề, đó là trong Laravel đã có cả Pusher. Mặc dù Pusher là một giải pháp “Plug and Play” khá nhanh nhạy, bản thân nó cũng có khá nhiều giới hạn. Check https://pusher.com/pricing.

Và hầu hết các tutorial đều lừa bạn bằng thumbnail “Ứng dụng Websockets” nhưng thật ra cũng chỉ quăng cho bạn Pusher mà thôi. (Và phần mà tôi thấy buồn cười nhất là khi họ nói bạn có thể chuyển sang socket.io một cách dễ dàng).

“Chúng ta cần có lượng connection vô giới hạn.”

Đúng vậy, chúng ta hoàn toàn không muốn lo lắng về giới hạn.

Bắt đầu từ việc dùng vagrant / homestead.

Để có cái này bạn cần phải đọc về Event Broadcasting.

Có những thứ cần lưu ý ở đây (để tôi không phải nhắc lại phía sau nữa):

  1. Giao diện ShouldBroadcast cho các Event
  2. Kích hoạt các Broadcast routes và sử dụng routes/channels.php cho những user xác thực.
  3. Public Channel  — Ai cũng có thể nghe
  4. Private Channel  — User phải được xét duyệt nếu muốn join vào group
  5. Presence  — Tương tự như Private nhưng bạn có thể xem khá nhiều meta data ngoài trên đó và có một list những người đã tham gia bằng channel.broadcastOn() Event method.

Tạo Event

php artisan make:event MessagePushed

Bạn có thể xem các ví dụ cụ thể trong tài liệu về Event Broadcasting.

Cài Redis

Trước đó tôi đã setup các queue bằng Supervisor/Redis/Horizon. Horizon là một tool tuyệt vời và bạn có thể xem thêm info của nó tại đây https://laravel.com/docs/5.6/horizon

Sau khi các queue đã hoạt động, MessagePushed event sẽ dùng đến chúng.

Note: Nhớ edit .env file để đảm bảo mọi thứ hoạt động trơn tru nhé:

BROADCAST_DRIVER=redis
QUEUE_DRIVER=redis
(this is from the horizon setup actually, but we will need that for later)
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Cài Laravel Echo Server

Đây là phần chúng ta cài install socket.io server được bundle trong laravel-echo-server. Xem thêm tại đây: https://github.com/tlaverdure/laravel-echo-server

Note: Check các yêu cầu trên đầu trước!

Chạy như bên dưới đây (như trong document)

npm install -g laravel-echo-server

Rồi chạy init để tạo file laravel-echo-server.json file vào trong app root (cái này chúng ta sẽ phải configure).

laravel-echo-server init

Sau khi đã tạo được file laravel-echo-server.json thì nó sẽ trông như sau:

{
"authHost": "http://local-website.app",
"authEndpoint": "/broadcasting/auth",
"clients": [
{
"appId": "my-app-id",
"key": "my-key-generated-with-init-command"
}
],
"database": "redis",
"databaseConfig": {
"redis": {},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
},
"port": "6379",
"host": "127.0.0.1"
},
"devMode": false,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": ""
}

Note: Nếu bạn muốn push phần này vào public server, hãy đảm bảo có add laravel-echo-server.json vào .gitignore và tạo file này trên server nhé, nếu không bạn sẽ phải đổi authHost liên tục.

Run Laravel Echo Server

Bạn phải chạy phần này để khởi động websockets.

laravel-echo-server start

(nằm trong root — chỗ đặt laravel-echo-server.json)

Sau đó nó sẽ khởi động thành công. (Sau đó chúng ta sẽ muốn add nó vào server để nó tự khởi động và restart nếu bị bể).

Để phần này trong /etc/supervisor/conf.d/laravel-echo.conf của bạn (tạo file này trong folder conf.d):

[program:laravel-echo]
directory=/var/www/my-website-folder
process_name=%(program_name)s_%(process_num)02d
command=laravel-echo-server start
autostart=true
autorestart=true
user=your-linux-user
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/my-website-folder/storage/logs/echo.log

Một khi bạn đã sắp xếp trong laravel root, bạn có thể chạy

pwd

để lấy path của ‘directory’ ở trên và của prefix ‘stdout_logfile’.

User sẽ trở thành các linux user (vagrant hoặc ubuntu hoặc cái khác)

Lưu file và thoát ra.

(nếu bạn cần dùng vim laravel-echo.conf thì khi làm trong quá trình, nhấn I (như Istanbul) trên bàn phím để edit file bằng VIM rồi type ESC như sau :wq! để đóng và lưu file.

Sau đó chúng ta sẽ chạy các command:

sudo supervisorctl stop all
sudo supervisorctl reread
sudo supervisorctl reload

Rồi check xem laravel echo có đang chạy không

sudo supervisorctl status

Cài Laravel Echo và Socket IO client

npm install --save laravel-echo
npm install --save socket.io-client

Sau đó register Echo trong bootstrap.js (Bạn đang dùng Vue js)

import Echo from "laravel-echo"
window.io = require('socket.io-client');
// Have this in case you stop running your laravel echo server
if (typeof io !== 'undefined') {
  window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001',
  });
}

Hãy check lại lần nữa cách nghe event của bạn trên một số channel nhất định.

Theo Laravel Broadcasting mà tôi đã đề cập trước đó, nếu bạn dùng broadcastOn() method để return một PresenceChannel mới (Tôi sẽ giải thích kĩ hơn các casr tôi đã làm. Tôi thấy rằng phần này phức tạp hơn việc dùng public channel, vì thế chúng ta có thể giảm xuống không thành vấn đề) rồi chúng ta sẽ nghe lại channel trên diện Javascript (frontend).

Dưới đây là một số ví dụ điển hình:

  1. Tôi đã push một event vào presence channel (phần này đang làm với các khảo sát)
public function broadcastOn()
{
return new PresenceChannel('survey.' . $this->survey->id);
}
  1. Sau khi được push thì nó sẽ đi dọc channels.php và trong đó chúng ta sẽ tạo nên phần uỷ quyền cho user này (nhớ return array cho phần uỷ quyền presence channel chứ không phải một Boolean)
Broadcast::channel('survey.{survey_id}', function ($user, $survey_id) {
return [
'id' => $user->id,
'image' => $user->image(),
'full_name' => $user->full_name
];
});

3. Trong component VueJs của tôi có load trên page, tôi define một method bắt nguồn từ created() method đang load:

listenForBroadcast(survey_id) {
Echo.join('survey.' + survey_id)
.here((users) => {
this.users_viewing = users;
this.$forceUpdate();
})
.joining((user) => {
if (this.checkIfUserAlreadyViewingSurvey(user)) {
this.users_viewing.push(user);
this.$forceUpdate();
}
})
.leaving((user) => {
this.removeViewingUser(user);
this.$forceUpdate();
});
},

Tôi đã lấy một vài đoạn code ra khỏi ví dụ nhưng vẫn còn array ‘users_viewing’ để các user vẫn tham gia vào các channel được.  

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

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

Các thư viện web animation tốt nhất cho JavaScript

exploration

Biểu đồ miêu tả tình trạng web animation hiện nay với các thư viện, frameworks và plugins hay nhất dựa trên tính linh hoạt và hiệu suất hoạt động.

Infographic 1: Biểu đồ Web Animation

Infographic này được chia thành 3 phần.

Phần đầu tiên gồm 1 vài thư viện animation cung cấp tất cả công cụ từ các hàm easing và callbacks đến timing control, có cả animation functions chung. Chúng tôi đã tách riêng các thư viện sử dụng CSS3 transition để các elements sinh động hơn, thay vì dùng các thư viện sử dụng Javascript. Chúng tôi cũng tách các thư viện hướng tới các animations dành cho SVG, WebGL hoặc HTML5 Canvas.

Infographic 2: Danh sách các tools

Phần thứ 2 tập trung vào nhiều methods khác nhau để các yếu tố UI và các đối tượng khác trong DOM sinh động hơn như animation cuộn, parallax, sprites, 3D transformations, physics engines và transitions.

Infographic 3: Các mẹo hiệu suất

Infographic cuối chỉ ra vài mẹo cơ bản giúp bạn lựa chọn giữa animation dựa trên CSS hoặc dựa trên Javascript tùy theo yêu cầu của mỗi dự án như các phiên bản của mỗi hệ điều hành, thiết bị…

Bài viết tham khảo

Giới thiệu bạn 1 số bài viết và ý kiến thú vị có thể giúp bạn đưa ra quyết định chính xác.

Các tools nổi bật

Scrollreveal.js

Scrollreveal.js

Declarative on-scroll reveal animations – dự án nguồn mở của @JulianLloyd.

SVG.js

SVG.jsSVG.js là 1 thư viện JavaScript hoạt động (điều khiển và animate) với SVG.

Jquery Plugins

Jquery Plugins

Three.js là 1 thư viện/ API JavaScript gọn nhẹ dùng để tạo và hiển thị các computer graphics 3D diễn hoạt. Scripts của Three.js có thể được dùng song song với canvas element HTML5, SVG hoặc WebGL.

Agile CSS3 Engine

Agile CSS3 Engine

Agile sử dụng javascript để generate CSS3 thuần. Không canvas, không webGL, không svg. Trong các thiết bị mobile thì khả năng hoạt động của Agile gần như hoàn hảo và nó có thể cross platform được.

Jaguarjs (Collie)

Jaguarjs (Collie)

Collie là 1 thư viện Javascript hỗ trợ tạo các animations và games sử dụng HTML 5 được tối ưu hóa cao. Collie chạy trên cả desktop và mobile sử dụng HTML 5 canvas và DOM. Collie có method render được tối ưu hóa cho mỗi nền tảng.

Effeckt.js

Effeckt.js

Một thư viện animations và transitions hay. Các transitions dựa trên CSS sử dụng các properties tăng tốc phần cứng.

Skroll

SkrollrThư viện scrolling stand-alone parallax của JavaScript dành cho mobile (Android, iOS…) và desktop trong khoảng 12k minified.

Clickstream.js

Clickstream.js

Plugin jquery giúp bạn thêm 1 hiệu ứng vào chuyển đổi trang

Parallax.js

Parallax.js

Parallax Engine phản hồi với điều hướng của 1 thiết bị thông minh. Vào thời điểm chưa xuất hiện 1 phần cứng phát hiện motion hay gyroscope nào, bạn có thể sử dụng cursor thay thế.

Stellar.js

Stellar.js

Để thêm vài data attributes đơn giản vào markup, hãy chạy $.stellar(). Cuộn qua phải để xem Stellar.js hoạt động.

Physics.js

Physics.js

PhysicsJS là physics engine modular, dễ xài, extend được dành cho javascript

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

Animate.css

Animate.css

Animations CSS3 trên nhiều trình duyệt khác nhau

Matter.js

Matter.js

Physics engine Javascript HTML5 với khả năng implement physical properties, rigid bodies, collisions, canvas renderer, WebGL renderer, tương thích mobile và Original JavaScript physics.

Box2dweb

Box2D là 1 physics engine hoàn thiện được phát triển bởi Erin Catto

Box2dweb

Morf.js

Công cụ Javascript dành cho các chuyển động CSS3 tăng tốc phần cứng với easing functions tùy chỉnh.

Morf.js

Tham khảo thêm: Tuyển dụng 2d animation, tuyển dụng 3d animation lương cao

Snap.svg

Snap.svg là công cụ cực hay để tạo các vector graphics tương tác, độ phân giải độc lập, chạy tốt trên các kích thước màn hình bất kì.

Snap.svg

Impress.js

Một framework presentation dựa trên khả năng transforms và transitions của CSS3 trong các hệ điều hành hiện tại. Framework này lấy cảm hứng từ ý tưởng của prezi.com.

Impress.js

Transit

Transitions & transformations CSS cực mượt mà dành cho jQuery

Transit

Morpheus

Morpheus

Morpheus cho phép bạn “biến hình mọi yếu tố”: từ màu sắc đến integers của unit bất kì, các easing transitions và bezier curves, gồm cả các transforms CSS3 (xoay, scale, nghiêng & dịch thuật). Tất cả gói gọn trong 1 loop đơn sử dụng chuẩn requestAnimationFrame thân thiện với CPU.

Sly

Sly

Thư viên JavaScript hỗ trợ cuộn 1 hướng, hỗ trợ navigation dựa theo item

Superscrollorama

Plugin jQuery với animation cuộn siêu ngầu

SuperscrolloramaTopDev via awwwards

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

7 Tip tăng tương tác hiệu quả trên mobile

7 Tip tăng tương tác hiệu quả trên mobile

Tác giả: Tubik Studio

Chất lượng thiết kế mobile app được đánh giá rất đơn giản. Nếu quá trình sử dụng mượt mà và người dùng không phải tốn quá nhiều não để sử dụng, thì đây là dấu hiệu của một app được design chuyên nghiệp. Mặt khác, nếu có trục trặc trong hệ thống tương tác, thì chắc chắn sẽ bị user phát hiện ra và không hài lòng chút nào.

Mobile app cần phải rõ ràng và vận hành đơn giản để user có thể sử dụng nó mọi lúc – mọi nơi. Nhiệm vụ của designer là phải tạo ra được một giao diện thật linh hoạt để dẫn dắt user sử dụng app mà không gặp phải bất cứ trục trặc tính năng nào. Bài viết này sẽ đưa ra những khía cạnh mới cần thiết về một hệ thống tương tác mobile lý tưởng cùng với nhiều mẹo hữu ích giúp designer tạo nên một mẫu design linh hoạt.

7 Tip tăng tương tác hiệu quả trên mobile

Tăng khả năng tiếp thu 

Bất cứ designer nào cũng muốn tạo ra những sản phẩm thật độc lạ bằng những tương tác gốc và hệ thống định vị. Cách này sẽ giúp bạn nổi bật trong số đông và có tiếng trên thị trường nói chung. Tuy nhiên, khi tạo nên một môi trường hoàn toàn mới thì designer phải nghĩ cách làm sao để có thể thích nghi được với nó ngay.

Nếu hệ thống tương tác của mobile app không có logic hoặc nó đáp ứng nhu cầu của người dùng, thì sẽ không dễ chịu chút nào. Điều này đặc biệt quan trọng với UX, vì ngay khi thấy nó khó dùng thì người ta sẽ ngừng dùng ngay và bỏ đi.

Để hạn chế tối đa chuyện này, designer cần phải quan tâm nhiều hơn về khả năng tiếp thu các yếu tố tương tác của người dùng. Khả năng tiếp thu tức là khả năng người dùng có thể hiểu và thao tác đơn giản ngay từ lần đầu sử dụng và khả năng rút kinh nghiệm từ lần thử đầu tiên. Để tăng khả năng học hỏi này, designer nên giữ mọi thứ đơn giản và rõ ràng. Đồng thời, hệ thống phải thống nhất và có logic để user có thể nhận diện các pattern lặp lại và sử dụng mobile app trực quan hơn.

Tham khảo thêm các vị trí tuyển dụng thiết kế lương cao tại Topdev

Cân nhắc về nhiều cách giữ điện thoại 

Chúng ta khác nhau và đa dạng ở nhiều cách, kể cả cách cầm điện thoại. Nó phụ thuộc vào rất nhiều yếu tố khác nhau tuỳ trường hợp và điều kiện mà app được app cũng như task mà chúng ta cần hoàn thành.

Có 3 cách cầm điện thoại chính: Cách 1 là 1 tay giữ và tay còn lại lướt bằng ngón cái. Cách thứ 2 là 1 tay giữ và tay còn lại tương tác bằng ngón trỏ. Và cách cuối cùng là dùng cả 2 ngón trỏ để lướt tương tác. Dĩ nhiên là còn nhiều cách khác nữa, nhưng đây là 3 cách được cho là phổ biến nhất.

Các designer cần phải đặt các nhân tố trên layout ở những vị trí hiệu quả phù hợp vớ mỗi cách giữ. Cách giữ bằng 1 tay là khó nhất vì nó không cho quá nhiều không gian để tương tác. Để làm cho quá trình tương tác trong app dễ dàng thì bạn có thể để các  component chính ở dưới cùng màn hình để user có thể chạm nó dễ dàng. Ngoài ra, riêng các element tương tác cao thì phải đủ to để không gặp trường hợp tap hụt.

7 Tip tăng tương tác hiệu quả trên mobile

Apply các pattern nhận diện cao

Nếu một app mới được sử dụng trực quan ngay, tức là designer đã hoàn thành xuất sắc nhiệm vụ của mình. Để mang đến những tương tác trực quan nhất, UI design phải có các pattern nhận diện. Chúng là các element mà user đều biết và cho họ một ít hint về cách thức hoạt động của app. Quan trọng là khi sử dụng app thì bạn sẽ kì vọng thấy được một số thứ liên quan đến sản phẩm nhất định. Ví dụ, nếu sử dụng các app mua bán online thì bạn sẽ thấy quen thuộc với icon Cart (Giỏ hàng) đi kèm với nút CTA “Mua ngay”.  Các element phổ biến trong app mới toanh sẽ làm cho user tự tin hơn khi sử dụng/ thao tác.

User thích nghi với mọi thứ nhanh chóng và thay đổi/ thiếu nó sẽ làm họ cảm thấy bất an khó chịu.  Đó là lí do tại sao khi bạn lên plan custom các element tương tác, thì chớ đừng bỏ qua các component cơ bản. Điều này giúp cho user không bị choáng ngợp với 1 app hoàn toàn mới và giúp họ học nó nhanh hơn.

Tạo nên một UI gọn gàng

Một khó khăn quá lớn cho thiết kế UI cho mobile đó là độ nhỏ của màn hình thiết bị. Designer cần phải tìm ra cách thể hiện được hết content trong một không gian quá nhỏ mà không biến giao diện thành một bãi chứa. Một bản UI design gọn gàng sẽ tăng tương tác một cách hiệu quả vì khi đó các element chính dễ thấy hơn và dễ dùng hơn nhiều.

Để tạo nên một mobile UI, bạn nên dùng nhiều icon như các component tương tác. Các element chữ thường sẽ hơi nhiều so với màn hình, vì thế icon là một option thay thế hợp lí. Nó có thể giải thích function bằng cách thể hiện visual bằng các shape đơn giản để tiết kiệm space trên màn hình. Tuy nhiên, trong quá trình test khả năng sử dụng, nó có thể được check kĩ xem liệu các icon có truyền tải được nội dung đúng không.

Giảm số lượng thao tác

Có lẽ đa số chúng ta đều đã có kinh nghiệm với ít nhất một app phiền phức, bắt ta phải thao tác quá nhiều để hoàn thành được task. Thường là do hệ thống tương tác không hiệu quả gồm quá nhiều action và những tính năng không cần thiết.

Các mobile app thường sẽ hoạt động như một trợ lý giải quyết sự cố, vì thế việc thiết kế làm sao cho nó kĩ lưỡng. Đồng nghĩa là designer chỉ áp dụng các element tính năng chính đáp ứng ngay các nhu cầu của người dùng. Việc tối thiểu hoá các thao tác sẽ không làm cho sản phẩm của bạn trở nên sơ sài đi tí nào đâu. Nó làm cho mobile app hiệu quả và dễ sử dụng hơn mà thôi. Hãy nhớ rằng mọi người đều rate chất lượng app dựa trên mức độ hữu ích của nó chứ không phải dựa trên các feature siêu phàm nào đó đâu.

7 Tip tăng tương tác hiệu quả trên mobile

Add các cơ chế game

Từ những gì đã nói trên, ta có thể kết luận là một hệ thống tương tác trên mobile hiệu quả khi nó đơn gian và rõ ràng.

Tuy nhiên, việc đơn giản hoá giao diện app quan trọng ở chỗ là không làm nó trở nên nhàm chán. App sẽ “thường” đi nếu không thu hút được nhiều sự chú ý của user. Vì thế bên cạnh những component cơ bản thì cũng cần phải thêm một số tác nhân đánh động đến cảm xúc của người dùng từ cái nhìn đầu tiên nữa.

Để add thêm phần thú vị cho app, gamification là một gợi ý khá hấp dẫn cho bạn. Đây là một technique add thêm cơ chế game vào 1 app mobile không liên quan đến game. Sẽ có nhiều challenge và phần thưởng đi kèm để khuyến khích người chơi tương tác với sản phẩm nhiều hơn và quay lại app nhiều lần.

Hơn thế nữa, việc ứng dụng một cơ chế mang tên hành trình của người dùng, là một cách khá hiệu quả trong việc tạo nên được một layout rõ ràng và rành mạch. Nó là các giai đoạn tại những thời điểm sử dụng app của user. Designer nên tạo nên một UX như vậy để người dùng có thể từng bước thành thạo app thông qua các feature có thể linh hoạt thay đổi theo nhu cầu của đối tượng người dùng. Phương pháp này giúp tránh được nhiều trục trặc về tương tác và tính năng.

Cuối cùng, gamification sẽ thêm vào app nhiều Last but not least, gamification adds the element of fun. Users enjoy entertainment, challenges, and competitive spirit similar to video games, so they are encouraged to go back. People always need some kind of recreational activity so that they could escape from everyday routine for a bit. By adding the fun element into a casual application, you help to reduce some stress and relax for a moment.

Một cái không kém phần quan trọng, đó là gamification sẽ thêm vào app của bạn yếu tố thú vị. Người dùng bị thu hút hơn với giải trí, thử thách và có tính cạnh tranh giống như các trò chơi điện tử, từ đó khuyến khích họ quay lại app nhiều hơn. Mọi người luôn muốn có một số hoạt động giải trí tinh thần để họ có thể phần nào thoát ly các hoạt động sinh hoạt hàng ngày một chút. Bằng cách thêm yếu tố thú vị vào một ứng dụng thông thường mà user của bạn sẽ được giảm bớt căng thẳng và cảm thấy thư giãn hơn.

Chớ quên việc thử nghiệm

Tương tac trên mobile nhằm mục đích tạo nên một sản phẩm thân thiện với người dùng và khiến họ hài lòng trong nhiều trường hợp khác nhau. Nhưng làm thế nào một designer có thể xác định được một app có đủ tốt và linh hoạt được trong nhiều trường hợp hay không? Đây là lúc mà bạn cần đến thử nghiệm.

Thử nghiệm khả năng sử dụng là một giai đoạn hết sức quan trọng trong quá trình tạo nên mobile app bằng cách test nó đối với các đối tượng tiềm năng. Thường gian đoạn thử nghiệm sẽ nằm trong giai đoạn build UX trước khi project được chuyển đến team development, để những giải pháp nào không hiệu quả sẽ được thay đổi.

Có rất nhiều phương pháp thử nghiệm cho phép bạn tìm ra vấn đề và bug và nhanh chóng xử lý nó. Từ đó designer mới cải thiện được nhiều khía cạnh của UX để đem lại sự hài lòng tối đa cho user.

Vì thế, trước khi chuyển project đến team development để thử nghiệm, hãy tự mình test nó trước, hoặc nhờ đồng nghiệp, lên đối tượng hướng đến và bạn sẽ đạt được kết quả mà mình mong muốn.

7 Tip tăng tương tác hiệu quả trên mobile

A simple mobile interaction system is not that easy to create. It requires hard work, concentration and lots of practice before you receive sufficient results. Stay tuned!

Tạo nên một hệ thống tương tác đơn giản trên mobile không hề dễ dàng. Nó đòi hỏi rất nhiều sự tập trung, chăm chỉ và thực hành nhiều để có được kết quả mà bạn kì vọng. Kiên nhẫn nhé!

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

Cơ chế phối màu trong UX/UI (Phần 2)

Color in UI

Tiếp nối Phần 1

Các button, chip và phần quản lý selection

Button, chip và bảng quản lý selection sẽ nổi bật hơn nếu bạn apply màu chủ đạo hoặc màu phụ vào nó.

Bảng màu 

  • Màu baseline cho phần text và các nút ngoài sẽ là màu chủ đạo.
  • Màu baseline color cho các nút action nổi và các nút action nổi bản mở rộng sẽ là màu phụ.
  • Màu baseline color phần selection control sẽ là màu phụ.

Cơ chế màu cho app này bao gồm màu chủ đạo (Tím 500) kèm theo tông tối (Tím 600) và màu phụ (Xanh teal 200).

  1. Nó dùng màu chủ đạo (Tím 500) vào bottom app bar và màu phụ (Xanh teal 200) để tạo điểm nhấn cho nút action nổi floating và phần điều khiển selection.
  2. Nó dùng màu phụ (Xanh teal 200) cho phần Danh sách các item đã chọn.

Xem tin tuyển dụng UI UX designer lương cao trên TopDev

Các button, chip và phần quản lý selection

App dùng màu chủ đạo (Hồng 100) cho nút action nổi chính và chip. Còn phần thanh kéo thả thì dùng màu (Hồng 900).

 

Nên                                                              Không nên

Phần quản lý selection nên được apply            Không nên dùng một trong các màu content màu phụ.                                                     làm phần Lưu ý, sẽ không được nổi bật.

Floating action button (FAB)

Nút action button nổi (FAB) là phần cần được nổi bật nhất trên app của bạn.

Sử dụng thêm màu để tạo contrast giữa FAB và các yếu tố xung quanh, ví dụ như thanh app bar. Màu baseline cho FAB sẽ là màu phụ. Nếu canva của bạn sử dụng quá nhiều màu, thì FAB nên sử dụng màu đơn sắc để nổi bật hơn phần content.

FAB dùng màu phụ của app này (Cam 500), tương phản với UI ở ngoài.

App này sử dụng chủ yếu tông Trắng và Đen cho tất cả các nút, phần quản lý selection và icon. Các component sẽ nổi lên hẳn vì chúng tương phản với phần content nhiều màu.

Typography and iconography 

Màu có thể hiển thị cho text được lớn hơn, nhỏ hơn, tương ứng với các text khác. Màu sắc cũng đảm bảo việc text dễ đọc khi chèn trên ảnh hoặc trên background, những cái thuường làm cho text trở nên khá khó đọc.

Typographic hierarchy

Màu sắc giúp tăng độ rõ ràng cũng như độ nổi bật của text.

App này sử dụng màu chủ đạo (Tím 500) và màu ohuj (Cam 600). Màu cam làm nổi bật phần headline lên và màu tím được áp dụng cho các tab và button.

Headlines and tabs

Bạn nên dùng màu chủ đạo hoặc màu phụ cho những phần text quan trọng như tab và headline.

App này sử dụng mày phụ (Cam 800) làm nổi và thu hút sự chú ý vào các headline.

App này thì sử dụng màu chủ đạo (Xanh lá 800) cho các tab, có hiển thị sự khác biệt giữa phần được chọn và không được chọn.

NÊN.                                                                 NÊN. 

Dùng màu chủ đạo hoặc màu phụ để làm            Bạn cũng có thể dùng màu chủ đạo hoặc nổi phần text ngắn, ví dụ phần headline.             màu phụ cho phần có back link.

CẨN TRỌNG. 

Tránh sử dụng màu chủ đạo tone sáng hoặc màu phụ cho phần body text.

Độ dễ đọc của Text

Icon giúp định hướng được các action cũng như cung cấp thêm thông tin. Màu sắc của chúng thường nên tương phản với màu nền để đảm bảo rằng chúng dễ thấy và dễ đọc.

App này dùng cả màu chủ đạo (Xanh lá 800) và màu phụ (Cam 800) cho phần icon.

Shrine sử dụng màu chủ đạo tone tối (Hồng 900) cho phần icon.

TopDev via material.io

Xem thêm: Ux ui designer job mới nhất tại Topdev
  Cơ chế phối màu trong UX/UI (Phần 1)

Vì sao không nên bỏ lỡ cơ hội gia nhập EVOLABLE ASIA?

Evolalble tuyển dụng IT - Blog TopDev

Ở giai đoạn định hướng phát triển sự nghiệp, bất cứ lập trình viên nào cũng mong muốn được offer với mức lương tốt nhất, bên cạnh đó là một môi trường có thể mang lại cho họ thật nhiều cơ hội bứt phá. Và Evolable Asia – một công ty chuyên cung cấp dịch vụ phát triển Offshore và LPO/Coding với hình thức “các phòng Lab” đã mang lại những trải nghiệm làm việc rất độc đáo, thu hút đông đảo sự quan tâm của các lập trình viên muốn nâng cao năng lực bản thân. Vậy đó là những trải nghiệm gì?

Các “phòng Lab” riêng biệt cho mỗi dự án

Khác với hình thức uỷ thác thông thường, theo mô hình Lab, đội ngũ Evolable Asia chỉ tập trung phát triển những dự án dài hạn, nên mang tính ổn định cao. Các khách hàng tại đây mỗi người sẽ có một “phòng” riêng cùng với một đội ngũ kỹ sư riêng chuyên trách phát triển cho dự án đó. Nếu bạn đã trở thành một phần của đội ngũ của Evolable Asia thì hằng ngày bạn sẽ được ở trong môi trường các phòng Lab, làm việc trực tiếp với các Project Manager người Nhật, điều này giúp bạn học hỏi được nhiều kĩ thuật tiên tiến và các cách quản lý, văn hóa Nhật Bản/ Mỹ. Với trải nghiệm cách làm việc trên, bạn sẽ có thể:

  • Nâng cao được kỹ năng cũng như về các kiến thức chuyên môn;
  • Trau dồi khả năng giao tiếp về ngoại ngữ (tiếng Anh, tiếng Nhật);
  • Cải thiện các kỹ năng mềm như quản lý thời gian, sắp xếp công việc…;

Và còn nhiều bài học kinh nghiệm khác được đúc kết riêng cho mỗi người sau khi hoàn thành những dự án.

Sở hữu văn phòng đáng mơ ước dành cho các lập trình viên

Evolable Asia tin rằng để có được sự tập trung, sáng tạo và làm việc dưới áp lực cao độ thì các lập trình viên cần có một không gian làm việc thoải mái nhất. Và Evolable Asia đã xây dựng một văn phòng cực lý tưởng dành riêng cho đội ngũ kỹ sư của họ – một khu phức hợp mở “hình cầu” với lối kiến trúc như một khu rừng nhiệt đới thu nhỏ tại văn phòng Amazon dạo gần đây – một “văn phòng xanh” tận dụng tối đa các nhân tố cây cảnh để trang trí cùng thiết kế trần nhà dạng sóng của Twitter. Đó là những ưu điểm vượt trội giúp tăng năng suất làm việc cho mọi nhân viên của Evolable Asia khi mà không gian ấy đã vươn tới phong cách kiểu quốc tế, nơi có thể sáng tạo không giới hạn và bứt phá năng lực cá nhân bất cứ lúc nào.

Bên cạnh đó không thể không nhắc tới các tiện ích giải trí để xua tan căng thẳng sau cả ngày dài làm việc, Evolable Asia thiết kế riêng một thư viện nhỏ ngay tại văn phòng – nơi có thể giúp các nhân viên được thư giãn với việc đọc sách, trau dồi thêm các tri thức bổ ích…

Evolable Asia tuyển dụng IT - TopDev - Hình 1
Chơi Bi lắc cùng đồng nghiệp sau giờ tan tầm là một trong những hoạt động giải trí rất thú vị tại Evolable Asia

Evolable Asia còn đầu tư tổ chức các hoạt động và trò chơi giải trí để giúp nhân viên được xả stress một cách vui vẻ nhất. Bi lắc, bóng bàn, cờ tướng… đấu trí vui cùng đồng nghiệp sau những giờ tan tầm là những lựa chọn cực kì thú vị khi bạn được làm việc ở đây.

Các cơ hội có thể nắm bắt trong tương lai tại Evolable Asia

Với sứ mệnh là: “To be No.1 IT software provider in Asia”, Evolable Asia đang từng bước hiện thực hóa sứ mệnh và vẫn luôn không ngừng tìm kiếm các kỹ sư tài năng để cùng chung tay góp sức. Nhằm muốn thu hút các ứng viên sáng giá gia nhập đội ngũ, Evolable Asia sẵn sàng trao loạt phúc lợi nổi bật nhất với mức lương lên đến $1,900:

  • Offer hấp dẫn: $1,100 – $1,900 + Lương tháng 13;
  • Nhận ngay HOT BONUS dựa trên mức lương gross sau khi hoàn thành giai đoạn thử việc;
  • Tham gia đào tạo miễn phí các kỹ năng chuyên môn, kỹ năng mềm và kỹ năng tiếng Nhật;
  • Được làm việc với các chuyên gia Nhật Bản, tiếp cận công nghệ mới nhất và chinh phục thách thức ở nhiều dự án mới;
  • Môi trường làm việc nước ngoài chuyên nghiệp, cởi mở và công bằng, nơi mỗi cá nhân được tin cậy và trao quyền phát triển;
  • Các hoạt động thể thao sôi nổi: Bóng đá, Bơi lội, Cầu lông, Tennis, Guitar,…;
  • Du lịch, kick off định kỳ hàng quý, hàng năm cùng nhiều sự kiện thú vị khác;

Đặc biệt cơ hội lần này đang mở ra cho các AI Engineer (Machine Learning)/ Ruby On Rails Developer mong muốn tìm nơi thể hiện năng lực để gặt hái thành công cho con đường sự nghiệp:

  1.  AI Engineer (Machine Learning)

Mô tả công việc:

  • Hợp tác chặt chẽ với các thành viên trong nhóm để xây dựng NLP engine, Recommendation system và những sản phẩm AI khác;
  • Áp dụng các thuật toán machine learning và AI để phân tích dữ liệu và phát triển các model;
  • Phát triển các dịch vụ web RESTful để cung cấp cho API integration;

Yêu cầu:

  • Cử nhân hoặc Thạc sĩ Khoa học Máy tính;
  • Có ít nhất 1 năm kinh nghiệm với Deep Learning / Machine Learning;
  • Thành thạo lập trình hướng đối tượng và có thể phát triển nhanh chóng các prototypes với một hoặc nhiều ngôn ngữ như Python;
  • Có thể đọc/ ghi tài liệu AI/ ML bằng tiếng Anh;
Evolable Asia tuyển dụng IT - TopDev - hình 4
Tự tin gia nhập để trở thành một mảnh ghép trong đại gia đình của Evolable Asia
  1. Ruby On Rails Developer (HOT BONUS)

Mô tả công việc:

  • Trao đổi với các chủ doanh nghiệp để hiểu thêm các yêu cầu của sản phẩm;
  • Đưa ra các chú thích rõ ràng, đảm bảo chất lượng và viết các unit test tốt;
  • Xem xét và đánh giá code của các thành viên khác để đảm bảo chất lượng làm việc cho cả nhóm;
  • Nghiên cứu và đưa ra ý tưởng/ giải pháp cho sự cải thiện;

Yêu cầu chính:

  • Có ít nhất 1 năm kinh nghiệm phát triển phần mềm Ruby / RoR;
  • Có kinh nghiệm về các cài đặt Linux server (middleware uses nginx, MySQL, rabbitmq);
  • Kinh nghiệm về Nodejs, Google Firebase là điểm cộng;

Yêu cầu chung:

  • Có bằng Đại học về Khoa học máy tính, Công nghệ thông tin hoặc kinh nghiệm ở vị trí tương đương;
  • Có thể đọc hiểu các tài liệu bằng tiếng Anh;
  • Có tinh thần đồng đội và trách nhiệm cao;
  • Kỹ năng giao tiếp tốt;
  • Năng động, có tính kỷ luật tự giác;

Tự tin khám phá cơ hội và nắm bắt tương lai cùng EVOLABLE ASIA ngay hôm nay!

Cơ chế phối màu trong UX/UI (Phần 1)

Color in UI

Màu sắc sử dụng trong UX/UI yêu cầu mức độ đồng nhất và có chủ ý cao. 

Bài viết gồm có:

  1. Cách sử dụng
  2. Top app bar và bottom app bar
  3. Backdrop
  4. Sheet và surfaces
  5. Các nút, chip và bảng điều khiển lựa chọn
  6. Typography và iconography

Cách sử dụng UX/UI

Những hướng dẫn dưới đây sẽ cho bạn một cái nhìn đa dạng về các UI component và element chú trọng phần phối màu.

Nguyên tắc

Màu sắc cần được phối thống nhất và hài hoà với brand đại diện của mình, đặc biệt là phải tạo nên được sự khác biệt giữa các element với độ contrast hợp lý.

Consistent                             Khác biệt                                Có chủ ý 

Màu sắc cần được phối           Màu phải tạo nên sự tách       Phối màu có chủ ý để nó  thống nhất và hài hoà            biệt với độ contrast thích        truyền tải ý nghĩa qua nhiều brand mà nó đại diện.            hợp giữa các element.            cách, ví dụ như tương quan                                                                                             giữa các element và thứ bậc.

Top app bar và bottom app bar   

Áp dụng màu chủ đạo cho cả top app bar và bottom app bar sẽ giúp user nhận diện được chúng và hiểu được sự tương quan giữa chúng và các UI element trong đó.

Nhận diện app bar

Các app bar sẽ sử dụng màu chủ đạo của app. Còn các system bar thì có thể dùng màu chủ đạo nhưng gam tối hơn hoặc sáng hơn để phân biệt content của hệ thống với content của top app bar.

NÊN

Top app bar sử dụng màu chủ đạo (Tím 500), còn System bar sử dụng gam tối hơn (Tím 700).

Để nhấn mạnh sự khác biệt giữa app bar và các element khác, bạn có thể dùng một màu khác cho các component xung quanh ví dụ như FAB.

 

NÊN. 

Bottom app bar sử dụng màu chủ đạo (Xanh 700), và nút action nổi thì sử dụng màu phụ (Cam 500).

CẨN TRỌNG. 

Nếu bottom app bar và nút action nổi dùng chung một màu, bạn nên dùng thêm hiệu ứng đổ bóng (shadow) hoặc các hiệu ứng thay thế để có sự tách biệt giữa chúng.

Kết hợp app bar với background

Khi màu của top app bar và bottom app bar cùng màu với background, chúng sẽ “quyện” vào nhau và tạo thêm điểm nhấn cho content thay vì cấu trúc của app.

Cả top app bar và background đều sử dụng màu chủ đạo: màu Trắng. Tuy nhiên, khi kéo thả thì top app bar có đổ bóng, thể hiện được là nó nằm cao hơn 1 lớp so với phần content được kéo ở phía dưới.

App này sử dụng màu xanh chủ đạo (Xanh 700) cho cả app bar, navigation ở dưới và background, vì thế mà các element đơn lẻ sẽ bớt nổi lại và phần content sẽ trội hơn hẳn. Nút activation thì sử dụng màu phụ – màu Vàng. Nó bao gồm cả một phần đổ bóng ở navigation dưới cùng để hiển thị một lớp cao hơn so với background.

Xem tin tuyển dụng UI UX designer lương cao trên TopDev

Backdrop 

Một backdrop phải có một front layer và back layer. Để phân biệt được giữa 2 layer, thì đường baseline của back layer color sẽ là màu chủ đạo còn đường baseline của front layer là màu Trắng.

App này sử dụng màu chủ đạo (Tím 800) cho back layer của background. Vùng text thì dùng mảng sáng hơn màu chủ đạo (Tím 700). Còn màu phụ (Đỏ 700) thì dùng cho phần chi phí chuyến bay.

Màu của back layer của background là màu chủ đạo (Hồng 100) và màu cho phần typography và iconography là mảng tối hơn (Hồng 900). Ngoài ra, màu phụ (Hồng 50) dùng cho phần Mở rộng trên front layer.

Các sheet và surface

Màu baseline của các sheet và surface, ví dụ như các bottom sheet, navigation drawer, menu, dialog, và card đều là màu trắng white. Các component này có thể phối hợp với nhau để tạo ra sự tương phản giữa các surface. Sự tương phản sẽ làm cho phần rìa các surface rõ ràng, phân biệt rõ được chênh lệch lớp trên dưới khi các surface chồng lên nhau.

Sản phẩm này đã chuyển màu trắng mặc định thành màu chủ đạo trên bottom sheet và navigation drawer.

  1. Nó dùng màu (Tím 500) làm màu chủ đạo cho 1 phần của bottom sheet chứ không để baseline trắng.
  2. Navigation drawer của nó dùng luôn màu chủ đạo (Tím 500)

Các modal sheet

Sử dụng các màu đối lập trên surface hiển thị trên screen tạm thời, ví dụ như các navigation drawer và bottom sheet. Các surface này thường là màu trắng, nhưng bạn hoàn toàn có thể dùng màu chủ đạo hoặc màu phụ cũng được.

App sử dụng màu xanh chủ đạo (Xanh 700) trên navigation drawer ở dưới, gam màu tối (Xanh 800) cho phần chuyển account, và màu phụ (Cam 500) cho phần chọn.

App sử dụng màu chính là màu trắng cho phần modal navigation drawer, tạo được sự tương phản tối đa giữa phần typo màu tối và phần navigation. Phần ngăn màu trắng được dùng để che bớt phần content đằng sau vì phần navigation drawer cùng màu với background.

App này cho hiển thị sheet ở góc phải bên dưới bằng màu chủ đạo (Hồng 500). Khi nhấn vào thì sheet sẽ mở rộng ra.

Cards

Màu baseline của phần card là màu trắng. Màu này được tuỳ chỉnh để thể hiện hình ảnh brand hoặc cải thiện việc đọc rõ hơn. Phần text và icon cũng có thể dùng cùng theme màu để cải thiệc việc đọc tốt hơn.

Surface của các card này dùng màu chính (Tím 500). Màu background của app là màu trắng. Còn màu phụ (Xanh teal 200) dùng cho hiển thị biểu đồ số liệu.

Các card có thể hiển thị trùng màu chủ đạo để hiển thị lựa chọn hoặc mức độ quan trọng.

Khi phần text và icon của card hiển thị trước hình, chúng có thể sẽ hơi khó đọc. Để cải thiện được việc này bạn có thể dùng màu phụ để tạo surface cho text và icon.

 

Card này sử dụng phần ngăn có màu để đảm bảo text có thể đọc được.

… [CÒN TIẾP] 

TopDev via Material.io

Tối ưu tỉ lệ chuyển đổi với Google Optimize và Google Analytics

Tối ưu tỷ lệ chuyển đổi là một trong những yếu tố quan trọng mà một Growth Marketer không thể bỏ qua. Google Analytics là công cụ hữu hiệu và phổ biến nhất giúp chúng ta theo dõi, đo lường và tối ưu tỷ lệ chuyển đổi. Số liệu từ Google Analytics giúp chúng ta nhìn ra điểm cần thay đổi để tăng tỷ lệ chuyển đổi. Theo dõi chuyển đổi là quá trình thiết yếu nhưng cũng rất “khó nhằn”.

Ngày nay, mọi người đang sử dụng điện thoại di động nhiều hơn và thường xuyên hơn khi mua hàng trực tuyến. Việc tối ưu hóa website phiên bản di động rất quan trọng. Traffic đến từ mobile khá lớn và làm ảnh hưởng nhiều tới tỷ lệ chuyển đổi. Để xem website của bạn có hoạt động tốt trên mobile hay không như thế nào? Làm gì khi tỷ lệ chuyển đổi giảm?

Website phiên bản di động của bạn có nội dung hấp dẫn không? Không có những nút điều hướng hành động? Trang bị lỗi …, những điều này có thể ảnh hưởng tới tỉ lệ chuyển đổi Google Analytics, hiểu được điều này, bạn sẽ có cơ sở để khắc phục và hoàn thiện website của mình.

Hãy cùng đến với chủ đề “DÙNG GOOGLE ANALYTICS TỐI ƯU TỈ LỆ CHUYỂN ĐỔI TRÊN MOBILE” với sự chia sẻ của diễn giả Nguyễn Minh Đức, CEO IM GROUP tại Vietnam Mobile Day 2018 nhé

Việt Nam sẽ là điểm nóng của Blockchain trong khu vực

Theo báo cáo của TopDev, trong Q2 năm 2018, lập trình vẫn là một trong những ngành có nhu cầu tuyển dụng cao nhất. Đặc biệt hơn nữa, nhiều chuyên gia nhận định Việt Nam sẽ trở thành blockchain hub của khu vực trong thời gian tới. Với số lượng việc làm được tìm kiếm đạt mốc cao nhất trong 3 năm trở lại đây.

Các công ty công nghệ trong khu vực đang đẩy mạnh việc tận dụng nguồn nhân lực dồi dào với khả năng nghiên cứu tốt tại thị trường Việt Nam để phát triển các ứng dụng mới dựa trên nền tảng blockchain. Dựa trên những số liệu của TopDev, hiện đang có hơn 100 công ty công nghệ và hơn 5000 lập trình viên tại Việt Nam đang phát triển các sản phẩm công nghệ dựa trên nền tảng blockchain.

Việc làm Blockchain lương cao

Nhu cầu tuyển dụng ngành IT vẫn tiếp tục tăng trưởng mạnh

Tính tới Q2 năm 2018, thị trường tuyển dụng IT vẫn tiếp tục tăng trưởng mạnh ở những nhóm kỹ năng có liên quan đến blockchain và cả lẫn những nhóm CNTT thông thường khác. Tính đến thời điểm Q2 năm 2018, lượng việc làm IT đã tăng đến 74% so với năm 2012, và tăng 24% so với cùng kỳ năm ngoái. Theo đó, chúng ta sẽ cần đến 350,000 nhân lực IT đến trước cuối năm 2021, nhưng cho đến hiện tại chỉ có khoảng 200,000 nhân lực đủ sức đáp ứng yêu cầu công việc.

Ở thời điểm hiện tại, mức lương trung bình của lập trình viên tại Việt Nam có mức dao động 10 triệu đồng đến 25 triệu đồng mỗi tháng. Trong đó, ở phân khúc lập trình web, các lập trình viên sẽ có mức lương vào khoảng 8 triệu ~ 13 triệu đồng cho lập trình viên front-end và 11 triệu ~ 15 triệu đồng cho lập trình viên back-end.

Mức thu nhập trung bình của Developer

Trong khi đó, các vị trí liên quan tới vai trò quản lý có mức lương cao dao động từ 30 triệu tới 66 triệu đồng và xu hướng vẫn sẽ tiếp tục tăng trong thời gian tới.

Đặc biệt, nếu các lập trình viên có kiến thức và kinh nghiệm về blockchain thì mức lương trung bình có thể sẽ tăng lên gấp 3 lần do nhu cầu của thị trường đang tăng mạnh. Tuy nhiên những nhân sự này vẫn rất khan hiếm chỉ chiếm khoảng 2-5% trên toàn thị trường.

Biểu đồ nhu cầu tuyển dụng nhân sự IT

Để lý giải cho xu hướng này nhiều nhà tuyển dụng lập trình viên nhận định: sự thiếu hụt nhân lực có chuyên môn cao và các kiến thức bắt kịp xu hướng thay đổi của thị trường công nghệ là nguyên nhân khiến cho developer cấp cao ngày càng trở nên khan hiếm, dẫn tới sự cạnh tranh về lương để thu hút nhân tài giữa các công ty.

Blockchain chiếc chìa khoá cho sự phát triển của Việt Nam

Công nghệ blockchain tại Việt Nam đang được áp dụng rộng rãi vào các lĩnh vực chủ chốt dịch vụ tài chính (83%), chuỗi cung ứng (40%) và dịch vụ công cộng (30%). Hơn thế nữa, nhiều doanh nghiệp trong lĩnh vực ngân hàng, kiểm toán hay bảo hiểm cũng đang lên kế hoạch phát triển và ứng dụng công nghệ Blockchain. Điều này càng khẳng định triển vọng của công nghệ Blockchain tại Việt Nam.

Blockchain là 1 trong 5 xu hướng công nghệ đáng chú ý nhất năm 2018

Hiện đang có rất nhiều doanh nghiệp lớn nhỏ trên thế giới đang muốn tham gia đầu tư mạnh vào thị trường blockchain tại Việt Nam. Theo Ông Tong Hsien-Hui, Phó Giám đốc Investments SGInnovate cho biết: “Tôi nghĩ có nhiều cơ hội giúp cho chúng ta cùng làm việc với nhau. Tôi mong muốn đưa các đồng nghiệp, nhóm làm việc của tôi tới Việt Nam vì các bạn rất thông minh chịu khó. Việt Nam cũng có rất nhiều nhân tài”. Còn theo Ông David Nguyễn, Chủ tịch Quỹ đầu tư Regulus chia sẻ: có thể nói rằng 99% nhân sự trong các công ty công nghệ blockchain của Việt Nam đều đến từ ngành CNTT trong nước, do đó, sẽ có sự thiếu hụt nhân tài trong lĩnh vực blockchain nếu chúng ta không có những bước chuẩn bị tốt nhất để đón đầu kịp với xu hướng này.

Cũng chính vì lẽ đó, TopDev vừa cho ra mắt mạng lưới đào tạo lập trình viên TopDev Expert Network (TEN) để kịp thời đáp ứng nhu cầu đào tạo nhân sự ngành IT trong làn sóng blockchain và cũng như các thay đổi chóng mặt của ngành CNTT trong thời gian sắp tới. Đây sẽ là giải pháp giúp các lập trình viên dễ dàng tiếp cận trực tiếp các khóa huấn luyện và đào tạo kỹ năng dựa trên dự án thực tế của các doanh nghiệp IT tham gia vào mạng lưới TEN trên cả nước.

Download báo cáo đầy đủ

React Native tại Airbnb (Phần cuối): Điều kì diệu tiếp theo là gì?

Tác giả: Gabriel Peal

Một chặng đường thú vị phía trước 

Khi đang còn làm việc với React Native, chúng tôi cũng bỏ không ít nỗ lực vào native. Ngày hôm nay, chúng tôi đã có được một số lượng kha khá các project thú vị trong production hoặc trong pipeline. Một số project được lấy cảm hứng từ những kinh nghiệm và trải nghiệm tốt nhất của chúng tôi với React Native.

Tuyển dụng lập trình React Native lương cao

Server-Driven Render

Mặc dù chúng tôi không còn dùng React Native nữa, chúng tôi vẫn thấy được giá trị lớn lao của việc viết product code chỉ 1 lần. Thật ra chúng tôi vẫn phụ thuộc khá nhiều vào hệ thống universal design language system (DLS) của mình và nhiều screen nhìn cũng khá tương tự nhau trên Android và iOS.

Rất nhiều team đã thí nghiệm thử và bắt đầu tiến hành hợp nhất các framework render chạy bằng server rất mạnh. Bằng những framework này, server sẽ gửi data mô tả component được render về thiết bị, screen configuration, và cá action có thể diễn ra. Mỗi mobile platform sẽ xử lý data này và renders các native screen hoặc hết nguyên flow dùng các component.

Render chạy bằng server cũng kéo theo không ít thử thách. Dưới đây là một số vấn đề điển hình mà chúng tôi phải xử lý:

  • Vừa update các định dạng component an toàn vừa maintain tương thích backward.
  • Share định dạng type cho các component trên các platform.
  • Respond các event vào runtime như các button tap hoặc user input.
  • Chuyển giao giữa các screen đa JSON-driven trong lúc duy trì state.
  • Render hoàn toàn các custom component không có implementation sẵn tại build-time. Chúng tôi đã thử nghiệm format Lona.

Các framework render theo server này đã mang đến rất nhiều giá trị như cho phép chúng ta thử nghiệm và update tính năng ngay trong cái búng tay.

Các Epoxy Component

Trong năm 2016, we đã cho mở nguồn mở Epoxy cho Android. Epoxy là một framework cho phép đa dạng dễ dàng như RecyclerViews, UICollectionViews, và UITableViews. Ngày nay, hầu như mọi screen mới đều dùng Epoxy. Làm vậy cho phép chúng ta tách mỗi screen thành các component riêng biệt và đạt lazy-rendering. Giờ đây, chúng ta có Epoxy trên cả Android và iOS.

Trên iOS nó trông như sau:

BasicRow.epoxyModel(
  content: BasicRow.Content(
    titleText: "Settings",
    subtitleText: "Optional subtitle"),
  style: .standard,
  dataID: "settings",
  selectionHandler: { [weak self] _, _, _ in
    self?.navigate(to: .settings)
  })

Trên Android, chúng ta cũng đã tận dụng khả năng viết các DSL trên Kotlin để áp dụng các component một cách dễ dàng:

basicRow {
 id("settings")
 title(R.string.settings)
 subtitleText(R.string.settings_subtitle)
 onClickListener { navigateTo(SETTINGS) }
}

Epoxy Diffing

Trong React, bạn return một list component từ render. Mấu chốt quan trọng trong performance của React đó là những component này chỉ là một cái gì đó đại diện cho data model của views/HTML thực mà bạn muốn render. Component tree từ đó sẽ được diff và chỉ có những thay đổi mới bị xử lý. Chúng tôi đã build môt concept tương tự cho Epoxy. Trong Epoxy, bạn phải declare các model cho toàn bộ screen trong buildModels. Chuyện này cộng với Kotlin DSL làm nó khá giống với React và sẽ trông như thế này:

override fun EpoxyController.buildModels() {
  header {
    id("marquee")
    title(R.string.edit_profile)
  }
  inputRow {
    id("first name")
    title(R.string.first_name)
    text(firstName)
    onChange { 
      firstName = it 
      requestModelBuild()
    }
  }
  // Put the rest of your models here...
}

Cứ mỗi khi data thay đổi, bạn sẽ call requestModelBuild() và nó sẽ render screen lần nữa bằng các RecyclerView call tối ưa hoá đã gửi đi.

Trên iOS, nó trông như thế này:

override func itemModel(forDataID dataID: DemoDataID) -> EpoxyableModel? {
  switch dataID {
  case .header:
    return DocumentMarquee.epoxyModel(
      content: DocumentMarquee.Content(titleText: "Edit Profile"),
      style: .standard,
      dataID: DemoDataID.header)
  case .inputRow:
    return InputRow.epoxyModel(
      content: InputRow.Content(
        titleText: "First name",
        inputText: firstName)
      style: .standard,
      dataID: DemoDataID.inputRow,
      behaviorSetter: { [weak self] view, content, dataID in
        view.textDidChangeBlock = { _, inputText in
          self?.firstName = inputText
          self?.rebuildItemModel(forDataID: .inputRow)
        }
      })
  }
}

Một Android Product Framework mới (MvRx)

Một trong những phát triển thú vị nhất mới gần đây đó là Framework mới mà chúng tôi đang phát triển nội bộ tên là MvRx, là sự kết hợp tinh hoa của Epoxy, JetpackRxJava, và Kotlin với nhiều bộ quy tắc của React giúp việc build screen mới dễ dàng hơn và trơn tru hơn bao giờ hết. Là một framework có nhiều ý kiến trái chiều nhưng khá linh hoạt ra đời từ những pattern phổ biến mà chúng ta hay thấy và cũng là những phần tinh hoa nhất của React. Nó cũng an toàn cho thread và gần như mọi thứ đều trải đều trên main thread làm cho việc kéo thả và animation trở nên mượt mà và đẹp hơn hẳn.

Đến nay nó đã hiệu quả trên rất nhiều screen và gần như bỏ đi nhu cầu xử lý các lifecycle. Hiện chúng tôi đang cho dùng thử trên mọi product Android và dự tính sẽ làm nó open source nếu nó thành công. Đây là phần code đầy đủ cần để tạo nên một screen tính năng hoàn thiện đưa ra các network request:

data class SimpleDemoState(val listing: Async<Listing> = Uninitialized)

class SimpleDemoViewModel(override val initialState: SimpleDemoState) : MvRxViewModel<SimpleDemoState>() {
    init {
        fetchListing()
    }

    private fun fetchListing() {
        // This automatically fires off a request and maps its response to Async<Listing>
        // which is a sealed class and can be: Unitialized, Loading, Success, and Fail.
        // No need for separate success and failure handlers!
        // This request is also lifecycle-aware. It will survive configuration changes and
        // will never be delivered after onStop.
        ListingRequest.forListingId(12345L).execute { copy(listing = it) }
    }
}

class SimpleDemoFragment : MvRxFragment() {
    // This will automatically subscribe to the ViewModel state and rebuild the epoxy models
    // any time anything changes. Similar to how React's render method runs for every change of
    // props or state.
    private val viewModel by fragmentViewModel(SimpleDemoViewModel::class)

    override fun EpoxyController.buildModels() {
        val (state) = withState(viewModel)
        if (state.listing is Loading) {
            loader()
            return
        }
        // These Epoxy models are not the views themself so calling buildModels is cheap. RecyclerView
        // diffing will be automaticaly done and only the models that changed will re-render.
        documentMarquee {
            title(state.listing().name)
        }
        // Put the rest of your Epoxy models here...
    }

    override fun EpoxyController.buildFooter() = fixedActionFooter {
        val (state) = withState(viewModel)
        buttonLoading(state is Loading)
        buttonText(state.listing().price)
        buttonOnClickListener { _ -> }
    }
}

MvRx có cấu trúc khá đơn giản để xử lý các Fragment arg, savedInstanceState persistence khi quy trình bắt đầu, TTI tracking, và một số feature khác.

Chúng tôi cũng đang xử lý một framework tương tự trên iOS và sẽ sớm được đưa vào testing.

Iteration Speed

Có một điều khá rõ ràng khi chuyển từ React Native về lại native đó là iteration speed. Nếu phải đi từ việc test thay đổi chỉ trong 1 vài giây sang test lên đến 15 phút là điều không thể chấp nhận được. May mắn thay là chúng tôi có thể thay đổi tình thế một chút ở đây.

Chúng tôi đã build infrastructure trên Android và iOS để bạn có thể compile một phần app bao gồm một launcher và có thể phụ thuộc vào một số feature module nhất định.

Trên Android, nó dùng rất nhiều gradle product flavor. Gradle module của chúng tôi trông như thế này:

Loại hình gián tiếp này sẽ giúp kĩ sư build và develop trên một slice nhỏ của app. Cộng với IntelliJ module unloading sẽ cải thiện được đáng kể build và IDE performance trên MacBook Pro.

Chúng tôi đã build nên các script để tạo được các phép testing mới và chỉ trong vòng vài tháng đã có trên 20 cái.

Những build mới sử dụng các phép thử mới này nhanh hơn trung bình gấp 2.5 lần và tỉ lệ các build tốn hơn 5 phút thì giảm xuống còn 15x.

Bạn có thể tham khảo gradle snippet này được dùng để tạo ra các product flavor có root dependency module.

Tương tự, trên iOS, các module như sau:

Hệ thông tương tự cũng cho ra các build nhanh hơn gấp 3 đến 8 lần.

Kết luận

Chúng tôi luôn tự hào khi là một công ty không ngần ngại thử các loại công nghệ mới và không ngừng nỗ lực maintain từ chất lượng, tốc độ đến trải nghiệm cho developer tốt nhất. Suy cho cùng, React Native đã đóng vai trò một tool hết sức quan trọng trong ship các feature và cho chúng ta một cái nhìn mới về phát triển mobile. Nếu cuộc hành trình này làm bạn thích thú và muốn trở thành một phần của nó, đừng ngần ngại đến với chúng tôi!

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

  React Native tại Airbnb (P4): Ngày tàn của React Native

  Thất nghiệp tuổi 35: Khủng hoảng tuổi 30 thực ra được báo trước bởi những cơn buồn ngủ tuổi 25?

Tuyển dụng Data Scientist từ góc nhìn của những người trong cuộc

tuyển dụng data scientist

Tôi là một nhà khoa học dữ liệu (Data Scientist) chứ không phải là một nhà tuyển dụng, nhưng tôi có cơ hội được trò chuyện với Amanda Voss và nhiều nhà tuyển dụng trong lĩnh vực khoa học dữ liệu và công nghệ thông tin. Tôi may mắn có được cái nhìn từ 2 phía: Data Scientist mong muốn công việc như thế nào và nhà tuyển dụng cần gì từ họ.

Từ phía nhà khoa học dữ liệu

Tuyển dụng Data Scientist từ góc nhìn của những người trong cuộc

Nếu bạn là một nhà khoa học dữ liệu, hoặc đang trong qua trình tìm kiếm một công việc như vậy. Lời khuyên đầu tiên của tôi là: Hãy kiên nhẫn!

Đây không phải là một việc dễ dàng, và có thể bạn sẽ phải đi phỏng vấn cả trăm nơi trước khi chính thức được nhận.

Tất nhiên, nó có thể thực sự dễ dàng và nhanh chóng với vài người, nhưng theo kinh nghiệm của tôi thì nó sẽ tốn của bạn ít nhất vài tháng.

Hãy học hỏi từ mỗi lần bạn bị từ chối. Khi tôi bắt đầu xin việc, tôi đã bị từ chối rất nhiều lần. Nó nằm ngoài sự chuẩn bị của tôi, nhưng tôi nghĩ rằng không có ai lại chuẩn bị cho việc mình bị từ chối cả, nhưng điều bạn cần nhận thức được là mọi thứ đều có nguyên nhân của nó. Hãy chấp nhận, học hỏi và tiếp tục tiến lên phía trước.

Mỗi lần bạn bị từ chối sẽ là thêm một bước trên con đường đến tới thành công. Thật sự không phải là dễ dàng để có thể đáp ứng với mọi đặc điểm mà nhà tuyển dụng muốn.

Nếu bạn may mắn, bạn sẽ gặp được một nhà tuyển dụng tuyệt vời sẽ cho bạn biết làm thế nào để có thể cải thiện cho những buổi phỏng vấn trong tương lai. Nhận thức được sai sót và điểm yếu của bạn là sự khởi đầu để trở nên tốt hơn. Sự thất vọng bạn cảm thấy hôm nay sẽ là động lực để cải thiện cho tương lai.

Ba điểm chính cần lưu ý

Một số người không biết khoa học dữ liệu là gì. Vì vậy, hãy nghiên cứu các công ty bạn đang ứng tuyển. Xem những gì nhân viên của họ đang làm, tìm cách giao tiếp thông qua Facebook, LinkedIn, Twitter và hội thảo.

Người tuyển dụng là người bạn thân nhất của bạn vào thời điểm phỏng vấn, họ muốn giúp bạn, hãy tin tưởng họ, thế nên hãy để họ giúp bạn và đặt câu hỏi!

Mọi người thường quan tâm nhiều hơn đến cách bạn giải quyết vấn đề và cách đối phó với một số tình huống cụ thể hơn là kiến thức kỹ thuật của bạn. Tất nhiên là khả năng viết code chất lượng vẫn rất quan trọng nhưng vẫn còn nhiều thứ hơn thế nữa.

Một số lời khuyên để có được một công việc về khoa học dữ liệu

Tuyển dụng Data Scientist từ góc nhìn của những người trong cuộc

Kiên nhẫn. Bạn sẽ phải nộp đơn xin việc hàng trăm nơi trước khi nhận được một.

Chuẩn bị. Không chỉ nghiên cứu các khái niệm quan trọng, lập trình và trả lời các câu hỏi kinh doanh, bạn cũng nên nhớ rằng bạn sẽ là một phần quan trọng của tổ chức. Do đó, bạn sẽ phải giải quyết các tình huống khác nhau, vì vậy hãy sẵn sàng trả lời các câu hỏi về cách bạn cư xử trong những tình huống công việc khác nhau.

Có một portfolio chất lượng. Nếu bạn đang tìm kiếm một công việc được trả lương hậu hĩnh trong ngành khoa học dữ liệu, hãy làm một số dự án với dữ liệu thực. Nếu bạn có thể gửi chúng lên GitHub. Ngoài các cuộc thi Kaggle, hãy tìm một cái gì đó mà bạn yêu thích hoặc một vấn đề bạn muốn giải quyết và sử dụng kiến ​​thức của bạn để làm điều đó.

Người tuyển dụng là bạn của bạn. Những người phỏng vấn luôn muốn bạn nhận được trong công ty.

Hỏi mọi người về những gì họ làm. Tôi khuyên bạn nên đọc bài viết của Matthew Mayo về “Một ngày trong cuộc đời của một nhà khoa học dữ liệu” để có ý tưởng tốt hơn về những gì nghề này cần phải làm.

Nếu bạn muốn xin vào vị trí thực tập, bạn cần đáp ứng được yêu cầu tối thiểu về học vấn.

Cách tạo một Resume ấn tượng

Hãy trung thực. Không làm giảm giá trị của bản thân bạn trong hồ sơ của bạn.

Kết nối và năng động trong cộng đồng khoa học dữ liệu. Tạo blog, chia sẻ kiến ​​thức, tham gia vào các dự án mã nguồn mở.

Hãy rõ ràng. Đọc CV của bạn và tự hỏi: liệu đây là cách tôi muốn người đọc xem CVcủa mình?, hãy chắc chắn rằng bạn đang đặt những thứ bạn nghĩ là quan trọng nhất đối với bản thân và công ty mà bạn đang xin vào.

Không sử dụng 1 CV cho tất cả các công ty. Thay vào đó hãy phân tích công ty và tạo bản CV phù hợp cho từng vị trí.

CV ngắn gọn, xúc tích: nhà tuyển dụng nhận hàng nghìn hồ sơ mỗi ngày, vì vậy người tuyển dụng sẽ chỉ có khoảng 30-60 giây để đọc hồ sơ của bạn. Vì vậy, hãy chắc chắn rằng bạn đang có những điều họ muốn xem. Đừng đặt những thứ không liên quan đến công ty.

Nhất quán. Điều đó có nghĩa là cùng một phông chữ và phong cách trình bày cho toàn bộ hồ sơ.

Kể câu chuyện về cuộc sống của bạn theo cách của mình và họ sẽ thích nó. Nếu bạn tự tin hơn về kỹ năng học tập, hãy để nó trước phần kinh nghiệm, và ngược lại.

Hỏi các nhà tuyển dụng bạn biết tư vấn cho trước khi gửi bản lý lịch.

Các mẹo phỏng vấn

Thường thì quá trình phỏng vấn sẽ diễn ra như sau:

  • Phỏng vấn qua điện thoại, bạn và nhà tuyển dụng sẽ trau đổi sơ qua về kinh nghiệm về vị trí ứng tuyển. Đây là vòng phỏng vấn đầu tiên.
  • Nếu mọi việc suôn sẻ, bạn sẽ nhận được cuộc gọi thứ hai, lần này có thể từ một số Senior trong công ty. Họ sẽ hỏi bạn nhiều hơn về kinh nghiệm cũng như một số câu hỏi chuyên về kỹ thuật. Điều này có nhiều khả năng để kiểm tra xem nếu những điều bạn nói trong sơ yếu lý lịch của bạn là đúng.

Note: (có thể có hoặc không) Nếu bạn đã có kinh nghiệm về khoa học dữ liệu. Họ sẽ gửi cho bạn một bộ dữ liệu và hỏi bạn vài câu để xem khả năng của bạn tới đâu.

Lập trình trên bảng trắng. Đây có thể là phần khó và đáng sợ hơn của bất kỳ quy trình nào. Chỉ bạn và một tờ giấy trắng. Hãy thực hành trước điều này thật nhiều. Bạn không cần phải viết code một cách hoàn hảo bởi họ muốn thấy cách bạn suy nghĩ và đưa ra giải pháp.

Note: (có thể có hoặc không) Buổi viết code tại công ty. Đây là nhiệm vụ cuối cùng, nhưng thường là để đánh giá việc bạn có thể phù hợp với văn hóa công ty hay không.

Nhà tuyển dụng

Tuyển dụng Data Scientist từ góc nhìn của những người trong cuộc

Nếu bạn đang muốn tuyển các chuyên gia về khoa học dữ liệu thì trước hết phải biết rõ ràng họ là những ai:

Nhà khoa học dữ liệu là người phụ trách phân tích các vấn đề kinh doanh và đưa ra một giải pháp liên quan tới việc chuyển đổi vấn đề thành một câu hỏi hợp lệ và đầy đủ, sau đó sử dụng các công cụ lập trình và công cụ tính toán phát triển code để phân tích dữ liệu nhằm có được câu trả lời.

Các chuyên gia về khoa học dữ liệu có vai trò như thế nào cho công ty:

Giúp lãnh đạo đưa ra quyết định tốt hơn

Giúp xác định mục tiêu

Thách thức nhân viên để áp dụng các thực hành tốt nhất và tập trung vào những vấn đề quan trọng.

Xác định và phân tích cơ hội

Cũng cố quyết định bằng dữ liệu.

Xác thực tính chính xác của các quyết định này

Xác định và lọc đối tượng mục tiêu

Tuyển dụng đúng cho tổ chức

Liệu bạn có cần tới chuyên gia khoa học dữ liệu không?

Hãy nhớ những lời này: một nhà chuyên gia khoa học dữ liệu tệ còn nguy hiểm hơn khi bạn không có họ.

Có rất nhiều người muốn làm việc trong khoa học dữ liệu, đa số họ là những người thực sự thông minh, muốn giúp đỡ và có một con đường thăng tiến trong lĩnh vực này, nhưng hãy cẩn thận trước khi thuê một chuyên gia khoa học dữ liệu. Tôi khuyên bạn nên tìm hiểu rõ về khoa học dữ liệu trong các công ty tốt nhất trên mạng, tìm hiểu về quy trình và học hỏi từ họ.

Ngoài ra, bằng cấp không quyết định tất cả. Họ cần kinh nghiệm làm việc với dữ liệu và giải quyết các câu hỏi kinh doanh bằng cách sử dụng khoa học dữ liệu. Trước khi yêu cầu lấy bằng tiến sĩ, hãy hỏi về kiến ​​thức, dự án họ đã làm, dự án mã nguồn mở mà họ xây dựng hoặc cộng tác, kinh nghiệm làm việc liên quan cũng như họ giải quyết vấn đề cụ thể như thế nào.

Mẹo để tuyển một chuyên gia về khoa học dữ liệu

Các nhà tuyển dụng phải làm việc chặt chẽ với các nhà quản lý để đưa ra các yêu cầu công việc chính xác.

Xác định những loại nhà khoa học dữ liệu nào sẽ phù hợp nhất với nhu cầu của doanh nghiệp. Tìm hiểu về các kỹ năng và kinh nghiệm của nhà khoa học dữ liệu trước khi phỏng vấn họ.

Tư duy dài hạn, đánh gia vai trò của nhà khoa học dữ liệu trong lộ trình phát triển của công ty.

Đặt kỳ vọng đúng theo thực tế dành cho ứng viên. Hãy tuyển dụng đúng người vị trí.

Xây dựng một danh sách các kĩ năng cần có cho một ứng viên lí tưởng để vào làm nhằm có sự đánh giá chính xác dựa vào thị trường nhân lực.

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

React Native tại Airbnb (P4): Ngày tàn của React Native

Tác giả: Gabriel Peal

Do có quá nhiều vấn đề về kĩ thuật và cơ cấu tổ chức, chúng tôi đã quyết định ngừng dùng đến React Native và dồn hết tâm huyết vào lại cho native. 

Mặc dù có rất nhiều team dựa trên React Native và lên kế hoạch sử dụng đến nó trong tương lai gần, căn bản là chúng tôi vẫn chưa đạt được mục tiêu ban đầu. Bên cạnh đó, còn tồn đọng quá nhiều vấn đề về cả mặt kĩ thuât và tổ chức mà chúng tôi không thể giải quyết được, làm cho quá trình áp dụng React Native trở nên khó khăn và trắc trở hơn nữa.

Chính vì thế, chúng tôi sẽ kết thúc kỉ nguyên React Native tại Airbnb và quyết tâm đầu tư mọi nỗ lực vào native một lần nữa.

Tìm việc làm React Native lương cao up to 2000USD

Thất bại trong việc đạt mục tiêu

Di chuyển nhanh hơn

Khi React Native hoạt động được đúng như kì vọng, các kĩ sư có thể hoạt động trơn tru mượt mà hơn cả máy. Tuy nhiên, họ vướng phải không ít vấn đề về cả mặt kĩ thuật lẫn tổ chức mà chúng tôi đã nêu khá kĩ trong toàn bộ series.

Maintain Quality Bar

Mới đây, khi React Native đã đủ chín và chúng tôi cũng đã tích luỹ được nhiều kinh nghiệm, chúng tôi đã đạt được môt số thứ mà mình không nghĩ là có thể. Chúng tôi đã build nên được các shared element transition, parallax, và có thể cải thiệc tối đa performance của một số screen thường xuyên bị drop frame. Tuy nhiên, một số khó khăn về mặt kĩ thuật khác như initialization và async render đầu tiên làm cho việc đạt được một số mục tiêu nhất định trở nên khó khăn hơn nhiều. Việc thiếu resources cả nội bộ lẫn bên ngoài làm mọi thứ không khá lên nổi.

Chỉ viết Code một lần

Mặc dù code trong các React Native feature dùng được trên hầu hết các platform, chỉ có một phần nhỏ trong app của chúng tôi là React Native. Ngoài ra, nó đòi hỏi một lượng lớn bridging infrastructure để giúp các kĩ sư product làm việc hiệu quả hơn. Do đó mà, chúng tôi cho ra supporting code trên cả ba platform thay vì chỉ 2. Chúng tôi nhìn thấy được tiềm năng share code sharing giữa mobile và web và có đã có thể share một vài npm package, nhưng quan trọng là, nó không mang nhiều ý nghĩa quan trọng lắm.

Cải thiện trải nghiệm cho Developer

Phần trải nghiệm cho developer với React Native là một hỗn hợp phức tạp. Trong một số trường hợp, ví dụ như thời gian build, mọi thứ sẽ trở nên dễ dàng hơn nhiều. Tuy nhiên , với số khác, như debugging, mọi thứ sẽ tệ hơn nhiều (chi tiết trong Phần 2 của series).

Kế hoạch 

Vì chúng tôi không thể đạt được mục tiêu của mình, dường như React Native không còn là lựa chọn đúng đắn nữa. Chúng tôi đang trong quá trình làm việc với các team để làm nên một kế hoạch chuyển giao thật trơn tru. Các feature React Native đã được tạm ngừng sử dụng và thực hiện kế hoạch chuyển hầu hết các screen đông traffic sang native đến cuối năm. Ngoài ra cũng có không ít sự thay đổi trong thiết kế bắt buộc phải có. Team native infrastructure của chúng tôi sẽ support React Native đến hết năm 2018. Trong năm 2019, chúng tôi sẽ giảm thiểu support và giảm lưu lượng React Native như khởi động runtime trên launch.

Tại Airbnb, chúng tôi tin tưởng vào open source. Chúng tôi chủ động dùng và cho đi rất nhiều project open source khắp thế giới và làm open source cho cả những project react native nữa. Vì không còn tiếp tục với React Native nữa, chúng tôi sẽ không thể maintain các React Native repo được nữa. Để có lợi nhất cho community, chúng tôi sẽ chuyển một só open source React Native sang react-native-community, như chúng tôi đã chuyển react-native-maps và sắp tới sẽ đến native-navigation và lottie-react-native.

Nó không hoàn toàn tệ

Mặc dù chúng ta ta không thể đạt được mục tiêu với React Native, các kĩ sư React Native nhìn chung đều có trải nghiệm khá tốt về nó. Trong số họ:

  • 60% nói rằng có có trải nghiệm rất tốt với nó.
  • 20% thì cảm thấy khá tôt.
  • 15% cảm thấy hơi tệ.
  • 5% cảm thấy thật sự tệ.

63% số kĩ sư nói rằng nếu được chọn lại họ vẫn sẽ chọn React Native và gần 74% đều cân nhắc sử dụng React Native cho project sau.

Các kĩ sư đã viết trên dưới 80,000 dòng product code trên hơn 220 screen cũng như 40,000 dòng javascript infrastructure. Ngoài ra, chúng tôi có khoảng 10x số lượng code và 4x số screen trên mỗi native platform.

React Native đang ngày càng tân tiến hơn

Series bài viết này kể toàn bộ trải nghiệm của chúng tôi với React Native. Tuy nhiên, Facebook và cả các công đồng React Native đang nỗ lực đưa React Native hoạt động trong các hybrid app trên quy mô lớn. React Native đang phát triển nhanh hơn bao giờ hết. Trong năm vừa qua đã có hơn 2500 commit và Facebook vừa mới tuyên bố rằng họ đã phát hiện ra một số khó khăn nhất định, tương tự với những cái chúng tôi đã gặp phải. Kể cả khi chúng tôi không còn bước tiếp với React Native, chúng tôi vẫn sẵn sàng tiếp tục theo dõi chúng vì những gì chúng tôi đạt được về mặt kĩ thuật với React native sẽ chuyển hoá thành những thành tựu thực ngoài thực tế với những ai đang sử dụng product của chúng tôi.

Cái mất

Chúng tôi thống nhất React Native thành các app lớn hiện có và di chuyển rất nhanh chóng. Nhiều trong số những vấn đề mà chúng tôi mắc phải là do phương pháp hybrid model mà chúng tôi đang áp dụng. Tuy nhiên, qui mô hiện tại chỉ cho phép chúng tôi giải quyết được một số vấn đề nhỏ lẻ mà các cônng ty nhỏ không sắp xếp được thời gian để giải quyết. Việc chạy React Native suôn sẻ với native là hoàn toàn có thể nhưng rất khó khăn. Mọi công ty đang sử dụng React Native đều được trải nghiệm function độc quyền của team mình, các app có sẵn, yêu cầu về sản phẩm, và sự phát triển của React Native.

Khi mọi thứ hoạt động cùng nhau, iteration speed, chất lượng, and trải nghiệm của developer đạt được những mục tiêu và kì vọng đề ra. Đó là lúc mà chúng tôi ngỡ như mình sẽ là người thay đổi diện mạo của ngành mobile vậy. Mặc dù những trải nghiệm này là cực kì tích cực, nhưng khi cân bằng được ưu điểm và khuyết điểm cộng thêm những nhu cầu và resource hiện tại từ team Kĩ sư của chúng tôi thì chúng tôi đã quyết định nó không còn phù hợp với mình nữa.

Quyết định xem có nên dùng platform mới hay không có lẽ là quyết định khó khăn nhất, phụ thuộc hoàn toàn vào nhưng đặc thù riêng của team. Những trải nghiệm trước đây không còn phù hợp với chúng tôi nữa. Trên thực tế, rất nhiều công ty vẫn tiếp tục sử dụng nó rất thành công và là sự lựa chọn tuyệt vời của nhiều tập đoàn khác.

Mặc dù chúng tôi không bao giờ ngừng đầu tư phát triển thêm vào native, việc từ dã React Native đã giải phóng được rất nhiều resource làm cho native tốt hơn thế nữa. Hãy đón xem phần cuối của series để xem được trong native của chúng tôi có gì mới.

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

  React Native tại Airbnb (P3): Xây dựng một Mobile Team cross-platform

  Inspectorio đã thành công vòng gọi vốn "Series A" trị giá 10 triệu đô la Mỹ

Đâu chỉ mỗi Bitcoin, công nghệ Blockchain còn nhiều ứng dụng hơn thế!

công nghệ blockchain_TopDev

Khi nhắc đến blockchain, lập tức mọi người thường nghĩ ngay đến các loại tiền mã hóa, chẳng hạn như bitcoin. Tuy nhiên, blockchain lại là công nghệ tạo ra tiền mã hóa nhưng bản thân công nghệ này không phải là tiền mã hóa như cách mà chúng ta hay đánh đồng. Vậy blockchain và bitcoin có sự liên quan gì với nhau? Và công nghệ blockchain có phải chỉ dừng lại ở mỗi ứng dụng bitcoin hay không thôi?

Blockchain không phải là Bitcoin!

Mọi dữ liệu trên mạng đều có thể bị sao chép bất cứ lúc nào. Bình thường khi cần giao dịch trực tuyến, chúng ta sẽ phải cần đến một bên trung gian thứ ba thật đáng tin tưởng (chẳng hạn như: ngân hàng, một công ty trung gian hoặc công ty vận chuyển…) nhằm chống lại sự gian lận với một cơ sở dữ liệu tập trung để xác minh cho giao dịch đó. Đến khi blockchain (blockchain technology) ra đời, loại công nghệ mới này đã giúp giải quyết được bài toán (double-spending) mà không cần tới bên trung gian thứ ba tin cậy.

Như đã từng đề cập ở phần đầu bài, bitcoin chỉ là một ứng dụng của công nghệ blockchain (mỗi giao dịch bitcoin cũng chỉ là một tập tin) chứ không thể hiểu ngược lại blockchain là bitcoin. Để hiểu rõ hơn một phần về định nghĩa blockchain, bạn có thể đọc bài viết liên quan Blockchain là gì? Phân loại và định nghĩa đúng về lập trình blockchain

Chính vì cái tên bitcoin trở thành một thuật ngữ được nhắc đến rộng rãi trong khoảng gần một thập kỉ trở lại đây, đồng thời cũng là ứng dụng hữu ích đầu tiên được biết đến từ công nghệ blockchain nên nhiều người vẫn bị hiểu nhầm cả hai định nghĩa này là tương đồng. Vậy ngoài bitcoin ra thì blockchain còn được ứng dụng vào những ngành nào nữa hay không? Câu trả lời là “Có”. Cụ thể hơn có thể kể đến các ngành như ngành vận tải biển, ngành ngân hàng, ngành tạp hóa, ngành luật pháp… Và để lý giải tại sao blockchain lại đặc biệt và có nhiều sức mạnh đến vậy, hãy tìm hiểu về hệ thống sau đây của blockchain.

Bitcoin chỉ là một ứng dụng của công nghệ blockchain

Phân loại hệ thống blockchain, bao gồm 3 loại chính:

  • Public: Dạng hệ thống cho phép bất kì người dùng nào cũng có quyền đọc và ghi dữ liệu trên blockchain. Quá trình xác thực giao dịch này cần đòi hỏi phải có hàng nghìn nút hoặc hàng vạn nút để tham gia. Nếu như ai đó muốn tấn công vào hệ thống này thì điều đó dường như rất khó xảy ra, bởi lẽ đây là điều bất khả thi vì chi phí khá cao. Ví dụ: Bitcoin, Ethereum…
  • Private: Đối với private blockchain thì người dùng chỉ được quyền đọc dữ liệu mà không có quyền ghi vì điều này còn thuộc về bên tổ chức thứ ba tuyệt đối tin cậy. Tổ chức bên thứ ba này toàn quyền quyết định mọi thay đổi trên blockchain; có thể hoặc không cho phép người dùng đọc dữ liệu trong một số trường hợp. Ở private blockchain, thời gian xác nhận giao dịch khá nhanh vì không đòi hỏi quá nhiều thiết bị tham gia xác thực giao dịch mà chỉ cần một lượng nhỏ. Ví dụ: Ripple là một dạng của hệ thống private blockchain, với 20% nút được hệ thống cho phép là gian dối, còn lại 80% chỉ cần hoạt động ổn định là được.
  • Permissioned: Hay còn gọi là Consortium, cũng là một dạng của private nhưng có một số tính năng nhất định được bổ sung thêm, kết hợp giữa một bên là “niềm tin” khi tham gia vào public và một bên là “niềm tin tuyệt đối” khi tham gia vào private. Ví dụ: Các ngân hàng hay tổ chức tài chính liên doanh sẽ sử dụng blockchain cho riêng mình.

Những ứng dụng thực tế của công nghệ blockchain

Công nghệ blockchain không chỉ dừng lại ở ứng dụng bitcoin mà còn rất nhiều ở lĩnh vực khác. Vậy các ứng dụng thực tế nào đã và đang áp dụng công nghệ này hiện nay?

Hợp đồng quản lý và hợp đồng thông minh (Smart Contract)

Mọi ngành công nghiệp đều phụ thuộc nhiều vào hợp đồng. Đối với các bên tổ chức tài chính, ngành bảo hiểm, lĩnh vực bất động sản, xây dựng, giải trí và pháp luật, sẽ đều có thể tận dụng công nghệ blockchain cho việc cập nhật, quản lý, theo dõi và bảo mật các hợp đồng.

Hợp đồng thông minh (smart contract) là những bản hợp đồng số được viết bằng code trên nền tảng blockchain và dùng để thực hiện trao đổi tài sản ảo, dịch vụ, cổ phiếu… một cách minh bạch, rõ ràng mà không cần đến sự tham gia của một bên trung gian nào. Bằng phương pháp mã hóa này, các văn bản pháp lý truyền thống có thể được thay thế nhờ ứng dụng công nghệ blockchain. Một ví dụ cụ thể có thể thấy là đa số các mã token ICO hiện nay được phát hành đều nhờ đến việc sử dụng các “Smart Contract”.

Lĩnh vực tài chính, hệ thống xử lý thanh toán

Trong hệ thống xử lý thanh toán của các công ty, blockchain mang lại một tác động rất lớn, có khả năng loại bỏ sự cần thiết của một bên trung gian thứ 3. Vốn dĩ trước đây ở các quy trình thanh toán thường phải nhờ sự can thiệp vào một tổ chức thứ 3 nhưng giờ đây khi có ứng dụng công nghệ blockchain, việc chuyển khoản có thể diễn ra nhanh chóng và tức thì.

Quản lý chuỗi cung ứng

Một số chuyên gia tin rằng blockchain có thể trở thành “hệ thống vận hành chuỗi cung ứng”. Để quản lý một quá trình có sự thay đổi chủ sở hữu đối với một loại tài sản nào đó hoặc trạng thái tài sản thì lựa chọn lý tưởng nhất ở đây chính là nhờ công nghệ blockchain.

Trong chuỗi cung ứng, blockchain cho phép cập nhật trạng thái ngay lập tức và tăng tính bảo mật và tính minh bạch. Dù cho ở bất kì ngành nào đi nữa cần theo dõi chuỗi cung ứng thì đều có thể nhờ đến blockchain – một hệ thống cho phép sự theo dõi kịp thời, chính xác và không thể phủ nhận.

Một ví dụ thực tế có thể kể đến là Walmart và Trung tâm an toàn thực phẩm ở Bắc Kinh. Họ đã áp dụng công nghệ blockchain để theo dõi chi tiết nguồn gốc trang trại, số lô, dữ liệu chế biến và nhà máy, ngày hết hạn, nhiệt độ lưu trữ và chi tiết vận chuyển đối với thịt lợn.

Bảo vệ quyền sở hữu tài sản

Để khẳng định quyền sở hữu tài sản thì công nghệ blockchain có thể giúp bạn điều này, ví dụ như việc đăng kí bản quyền âm nhạc trên blockchain. Bằng cách tạo ra hồ sơ không thể chối cãi về quyền sở hữu trong thời gian thực, blockchain cho phép bạn bảo vệ được tài sản của cá nhân mình mà không ai được quyền sao chép hay giả mạo.

Điều này càng trở nên hữu ích hơn đối với các loại tài sản cần có biện pháp chống hàng giả, ví dụ như dược phẩm, các loại đồ xa xỉ đắt giá, kim cương, đồ điện tử.v.v… Và BlockVerify cho phép các công ty làm được điều đó – đăng ký sản phẩm của riêng mình và tạo ra sự minh bạch cho chuỗi cung ứng.

Vấn đề bảo mật, nhận dạng số hóa, hệ thống hồ sơ cá nhân và mật khẩu

Trong vấn đề bảo mật, nhận dạng số hóa, công nghệ blockchain có thể giúp ngăn chặn việc đánh cấp ID và tăng cường bảo mật dữ liệu cá nhân.

Onename, một công ty startup blockchain, bên cạnh việc cung cấp dịch vụ để đăng kí và quản lý blockchain ID, họ còn cung cấp một sản phẩm có tên là Passcard – dự sẽ là khóa kỹ thuật số thay thế tất cả mật khẩu và ID cần thiết cho mỗi người, bao gồm cả giấy phép lái xe. Ngày nay có một hệ thống quản lý nhận dạng khác với tên gọi là ShoCard, có thể giúp các cá nhân và doanh nghiệp xác nhận danh tính một cách nhanh chóng.

Hiện nay, một lượng lớn dữ liệu cá nhân từ hồ sơ sinh/ tử đến giấy chứng nhận kết hôn, hộ chiếu và dữ liệu điều tra dân số đều do chính phủ quản lý. Và công nghệ blockchain có thể hỗ trợ cho việc quản lý tất cả những điều trên bằng một giải pháp hợp lý và an toàn hơn. Các tổ chức chính phủ ngày nay cũng đã bắt đầu xây dựng hệ thống nhận dạng quốc gia sử dụng blockchain, có thể kể đến các nước như Singapore, Canada, Thụy Sĩ…

Ở thời đại mà xu thế công nghệ không ngừng phát triển, ngoài blockchain ra thì rất có thể sẽ còn nhiều cuộc bùng nổ cách mạng công nghệ khác nữa. Tuy nhiên xét về thời điểm hiện nay, sức mạnh của công nghệ blockchain đã và đang dần thay đổi thế giới là một điều chúng ta không thể phủ nhận được. Và rất có khả năng trong tương lai, các ứng dụng của blockchain sẽ ngày càng tiếp tục mở rộng hơn, nhiều hơn theo một con số nào đó được ước tính bằng cấp số nhân.

Xem thêm: Các cơ hội hấp dẫn dành cho Blockchain Developer

Inspectorio đã thành công vòng gọi vốn “Series A” trị giá 10 triệu đô la Mỹ

Vào ngày 10 tháng 7 năm 2018, tại Minneapolis, Mỹ, công ty Inspectorio chuyên cung cấp giải pháp kiểm định và giám sát chất lượng cho các nhà cung cấp trong chuỗi cung ứng, được vận hành trên nền tảng trí thông minh nhân tạo, đã phát hành vòng gọi vốn tối ưu hóa “Series A” trị giá 10 triệu Đô la Mỹ. Công ty phần mềm dịch vụ này tạo ra một mạng lưới năng động và độc lập, kết hợp với công nghệ máy học (machine learning) cho ngành công nghiệp kiểm định và giám sát chất lượng để các nhà sản xuất, nhà cung cấp, thương hiệu và nhà bán lẻ có thể kết nối, chia sẽ dữ liệu, và cải thiện chất lượng liên tục.

Ông Carlos Moncayo Castillo, CEO và là người đồng sáng lập công ty, cho biết: “Chúng tôi cam kết tiếp tục củng cố vị thế của Inspectorio như là nền tảng hàng đầu thế giới về kiểm định và giám sát chất lượng bằng cách tạo tác động tích cực vào chuỗi cung ứng toàn cầu. Khoản đầu tư này sẽ đẩy nhanh tốc độ tăng trưởng và phát triển nền tảng công nghệ của chúng tôi. Chúng ta cần phải chuyển đổi từ chuỗi cung ứng sang một cấp độ mới từ cách làm thủ công sang nền tảng thông minh và không bị giới hạn bởi các khoảng cách địa lý.”

Nhà đầu tư chính cho vòng gọi vốn này chính là công ty Techstars, một công ty được biết đến cho các khoản đầu tư chiến lược vào Uber, Sendgrid, Twilio, DigitalOcean v.v. Ông Mark Solon, Giám đốc điều hành của Techstars cho biết “Tôi đã biết anh em nhà Moncayo vài năm nay. Công ty của họ là loại hình doanh nghiệp mà tôi mong muốn được làm việc”. Ông nói thêm “Họ là ví dụ điển hình cho việc tự dấn thân vào lĩnh vực mới để tạo ra những thay đổi có giá trị, làm việc chăm chỉ, tập trung vào việc nâng cao trải nghiệm của khách hàng, và theo đuổi không ngừng nghỉ giúp tìm ra giải pháp cho một vấn đề lớn, giúp mang lại tính minh bạch và trách nhiệm   cho chuỗi cung ứng của ngành bán lẻ. Các anh em Moncayo thể hiện cùng một giá trị ban đầu mà chúng tôi trân quý tại Techstars, và chúng tôi rất vui mừng được tham gia. ”

Vòng gọi vốn lần này cũng có sự tham gia của 2 công ty nằm trong danh sách 500 công ty lớn nhất tại Mỹ: Ecolab (NYSE ECL), công ty hàng đầu thế giới về nước, vệ sinh và công nghệ năng lượng; cung cấp nước sạch, thực phẩm an toàn; và Target Corporation (NYSE TGT), một nhà bán lẻ hàng giảm giá cao cấp, chuyên cung cấp hàng hóa có chất lượng cao và thời trang tại 1.829 cửa hàng và tại trang web www.target.com. Matchstick Ventures, một quỹ đầu tư mạo hiểm tập trung vào công nghệ có trụ sở tại Minneapolis, cũng là một phần của khoản đầu tư.

Inspectorio hiện đang có văn phòng trên toàn thế giới tại Hoa Kỳ, Việt Nam, Trung Quốc và Belarus, đang mở một văn phòng khác ở châu Âu trong những tuần tới. Công ty đã từng tham gia cuộc thi “Tăng tốc khởi động các nhà bán lẻ Techstars 2016” và hiện đã phát triển đội ngũ của mình hơn 120 thành viên từ 11 quốc gia khác nhau.

Để biết thêm thông tin về Inspectorio, hãy truy cập https://www.inspectorio.com/careers/

React Native tại Airbnb (P3): Xây dựng một Mobile Team cross-platform

Tác giả: Gabriel Peal

Ngoài vô sô ưu điểm và khuyết điểm của React Native, chúng ta còn biết thêm về những gì nó làm được cho các công ty và tập đoàn ngành công nghệ. Việc ứng dụng nó phức tạp hơn nhiều lần so với việc add library hay pattern mới vào platform hiện có. Nó đã kéo theo không ít rắc rối đến cho doanh nghiệp: Nó không chỉ đơn thuần là những vấn đề có thể xử lý tức thì, mớ này rất khó nhằn, không dễ bị phát hiện hoặc sửa hoặc recover tí nào. Trong điều kiện này, mặc dù chúng tôi có một nền tảng khá ổn định nhưng trước khi dùng đến React Native phải lưu ý một số điểm.

Tuyển lập trình viên React Native

Những quan điểm trái chiều xoay quanh React Native 

Theo như kinh nghiệm thì các kĩ sư khi tiếp cận với React Native có nhiều quan điểm trái chiều xung quanh nó, người thì ưu ái dùng nó cho cả Android, iOS, và web nhưng người thì chống đối, cương quyết không dùng nó trong team. Sau khi sử dụng rồi cũng xảy ra chuyện tương tự: Team này thì có những trải nghiệm rất tuyệt vời nhưng cũng có team phải quay lại con đường native.

Đi tìm gốc rễ của vấn đề 

Dĩ nhiên khi làm việc với React Native thì việc gặp bug, lỗi kĩ thuật hay lỗi performance là không thể tránh khỏi. Tuy nhiên vẫn còn nhiều khuất mắt chưa tìm hiểu được nguyên nhân:

  1. React Native di chuyển rất nhanh.
  2. Đồng thời chúng tôi cũng đang phát triển thêm nhiều infrastructure và feature mới.
  3. Mọi người còn khá mới với React Native và vẫn đang học cách sử dụng nó.
  4. Tài liệu và hướng dẫn debug trong lập trình và production không được thống nhất lắm và dễ bối rối không hề nhẹ.

Vì thế mà rất khó để tìm ra được căn nguyên của vấn đề. Đôi khi việc xác định xem vấn đề xuất phát từ team nào hay liệu nó có liên quan đến React Native hay không cũng không được rõ ràng.

React Native thì vẫn là Native

Một hiểu lầm khá phổ biến đó là nếu dùng React Native bạn có thể ngừng hẳn luôn việc viết code native. Lầm to nhé! Bản chất native của React Native vẫn sẽ ở đó lúc bạn làm việc mà thôi. Ví dụ, trên mỗi platform text sẽ bị render khác nhau một tí, keyboard sẽ được xử lý khác nhau một tẹo, và phần Activities sẽ được tái lập mặc định bởi Android. Để mang lại môt trải nghiệm chất lượng cao với React Native, nó đòi hỏi sự cân bằng từ cả hai phía. Điều này kéo theo một thử thách khá lớn về trình độ chuyên môn cao trên cả 3 platform làm cho việc truyền tải được trải nghiệm tốt khó khăn hơn. 

Debug xuyên Platform

Hầu hết mọi kĩ sư đều sẽ chuyên sâu 1 hoặc 2 platform. Còn chuyện có người chuyên về cả Android, iOS, và React là hiếm vô cùng. Mặc dù hầu hết mọi việc trong môi trường React Native là bằng JavaScript và React, đôi lúc khi build hoặc debug vẫn sẽ yêu cầu quay về native. Đây là những trường hợp trớ trêu dồn kĩ sư vào thế bí khi phải debug vấn đề trên các platform mà họ chưa bao giờ đụng đến. Nó sẽ còn tệ hơn nếu như các kĩ sư không biết bắt đầu từ đâu vì rất khó để tìm ra cốt lõi của vấn đề.

Tuyển mộ người tài

Mặc dù đang đầu tư tốc lực cho React Native, việc mở rộng các team và tham vọng về mobile của chúng tôi vẫn không ngừng mở rộng và đầu tư. Tuy nhiên, sau một thời gian dài trong cộng đồng, người ta bắt đầu đánh đồng Airbnb với React Native và gán luôn cho Airbnb là 100% react Native. Từ đó mà nhiều lập trình viên Android và iOS cũng chần chừ apply vào Airbnb, mặc dù tin đồn kia là không đúng tí nào. Vì thế, đừng ngại ngùng nữa và apply ngay nào!

Khó khăn về các Hybrid App 

Một lộ trình 100% native hoặc 100% React Native nghe tương đối dễ chịu. Nhưng nếu bạn trộn codebase lại, thì sẽ nảy sinh ra 1001 vấn đề mới. Làm sao để chia team? Làm sao để các team collab? Làm sao để share state qua app? Làm sao để đảm bảo rằng mọi thứ được test? Làm sao để kĩ sư có thể debug hiệu quả trên cả 3 platform? Làm sao để quyết định dùng platform nào cho feature mới? Đây là một trong số ít những câu hỏi mà bạn phải giải quyết khi đụng độ với chuyện này.

Ba Môi trường Development

Để trở thành một kĩ sư React Native giỏi, điều quan trọng là bạn phải có 3 môi trường React Native, Android, và iOS thật ổn định và cập nhật kịp thời. Đối với các công ty lớn như Airbnb, mỗi platform đòi hỏi một lượng thời gian nhất định để set up, tìm hiểu và cập nhật. Chỉ cần bạn lơ là với nó một hai tuần là bạn sẽ phải tốn hàng tiếng đồng hồ để bắt kịp với mọi thứ.

Native vs React Native

Có rất nhiều trường hợp xảy ra làm cho các giải pháp tối ưu hoá cho vấn đề sử dụng cả Native và React Native. Ví dụ, ứng dụng navigation của chúng tôi sử dụng tối đa Activities và ViewControllers và hầu hết code của nó là native trên mọi platform. Thường thì việc code nên được viết bằng Native hoặc React Native là không rõ ràng. Kĩ sư thường sẽ chọn platform nào thoải mái nhất để hỗ trợ việc xử lý unideal code.

Test Cross-Platform 

Chúng tôi phát hiện ra rằng các kĩ sư làm việc chủ yếu trên 1 platform nhất định phụ thuộc vào sự tiện lợi và thoải mái. Họ thường giả định là nếu nó hiệu quả trên platform mà họ test, thì nó cũng hiệu quả trên những platform khác nữa. Logic này gần như luôn đúng, và đây cũng là một trong những thế mạnh lớn nhất của React Native. Tuy nhiên, số lần nó không đúng cũng đủ để gây ra một mớ rắc rối trong các cycle QA hoặc trong production.

Các team riêng lẻ

Các team nào thường làm việc ở cả native cũng như React Native thường sẽ vướng phải cả những khó khăn về mặt kĩ thuật lẫn giao tiếp. Sau khi codebase bị tách ra thành native và React Native, code sẽ bắt đầu đứt đoạn. Từ đó việc chia sẻ các logic kinh doanh, các model, state,… trở nên khó khăn hơn và các kĩ sư không có đủ chuyên môn để làm việc xuyên suốt cả quá trình được. Chúng tôi hiểu rằng nó sẽ xảy ra từ đầu nhưng lại nghĩ rằng nó có thể sẽ cân bằng nếu có collab mới với web. Một số team đã bắt đầu share resource và code qua web và mobile nhưng hầu hết đều không thể nhận ra được tiềm năng này.

Iteration Speed đạt được

Một trong những mục tiêu đề ra về React Native đó là gia tăng tốc độ lập trình. Thông thường, các React Native feature chỉ được 1 kĩ sư viết, chứ không phải mỗi platform một người. Từ góc nhìn của một kĩ sư React Native, cho dù nhìn chung nó có tốn ít thời gian để viết feature so với trên Android hoặc iOS, đối với họ nó sẽ vẫn lâu hơn.

Các Resource và Tài liệu chung 

Hàng triệu kĩ sư trong vòng 10 năm qua đã cống hiến và chia sẻ vô số resource học tập, open resource và hỗ trợ online về Android và iOS. Chúng tôi cũng cho ra lò nhiều resouce như CodePath để giúp mọi người học về Android và iOS chuyên sâu hơn. Có thể React Native sở hữu một trong những cộng đồng cross-platform lớn nhất và cung cấp các nguồn React, nhưng nó vẫn còn nhỏ hơn nhiều so với Android và iOS. Cộng thêm một thực tế rằng chúng ta phải tự tay build nên gần hết infrastructure in-house của mình cho thấy rằng nguồn resource React Native hạn hẹp của chúng ta đã bị đầu tư quá lỗ trong giáo dục và đào tạo so với native.

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

  React Native tại Airbnb (Phần 1): Mở đầu

  React Native tại Airbnb (Phần 2): Công nghệ

  Tiki đã dùng React Native như thế nào?

React Native tại Airbnb (Phần 2): Công nghệ

airbnb-p2-topdev

Xem Phần 1React Native tại Airbnb (P1)

Tác giả: Gabriel Peal

React Native là một platform tương đối mới trên các cross-section của Android, iOS, web và các framework cross-platform. Sau 2 năm, chúng tôi có thể nói rằng React Native là một bước đột phá ở nhiều khía cạnh. Đây là một bước đột phá mới về thuật toán cho mobile và chúng ta có thể được lợi từ rất nhiều hoạt động. Tuy nhiên, lợi ích thu được sẽ đi kèm với không ít “thương tích”.

Những mặt hiệu quả

Cross-Platform

Lợi ích rõ ràng nhất của React Native đó là code bạn viết có thể chạy trên cả Android và iOS. Hầu hết các feature sử dụng React Native có thể đạt từ 95–100% shared code và 0.2% file chuyên cho platform (*.android.js/*.ios.js).

Design Language System thống nhất (DLS)

Chúng ta đã develop được một design language gọi là DLS. Chúng tôi làm các bản Android, iOS, React Native, và bản web cho mỗi component. Việc này hỗ trợ cho việc viết các feature cross-platform hơn vì mọi design, tên component và các screen thống nhất trên các platform. Tuy nhiên, chúng ta vẫn có thể đưa ra các quyết định phù hợp với platform. Ví dụ, chúng ta có thể dùng Toolbar trên Android và UINavigationBar trên iOS và chọn hide disclosure indicators trên Android vì họ không follow các design guideline của platform Android .

Chúng tôi đã viết lại các component thay vì giữ cái cũ để tạo ra được các API phù hợp cho từng platform và giảm thiểu workload cho các kĩ sư Android và iOS nào không rõ cách test các thay đổi trong React Native. Tuy nhiên, nó sẽ gây ra sự tách rời giữa các platform mà các phiên bản native và React Native của cùng component sẽ không sync với nhau nữa.

React

Chuyện React là một trong những web framework được ưa thích nhất là có lí do. Đơn giản mà quyền lực và dễ scale các codebase lớn hơn. Có một vài thứ mà chúng tôi đặc biệt ưa thích:

  • Các component: Các React Component giải quyết được nhiều khuất mắt bằng nhiều prop và state tốt.
  • Lifecycle đơn giản: Lifecycle của Android, và một extent bé hơn, của iOS rất phức tạp. Các component React căn bản sẽ xử lý vấn đề và làm cho việc học React Native dễ hơn nhiều so với việc học Android hoặc iOS.
  • Rõ ràng: Bản chất rõ ràng của React sẽ giúp đồng bộ UI in sync bằng các nguyên lý ngầm.

Iteration Speed

Khi develop React Native, chúng tôi có thể dùng hot reloading để test các thay đổi trên Android và iOS trong chỉ một hai giây. Mặc dù việc build performance là ưu tiên hàng đầu trong các app native, nhưng vẫn chưa có cái nào đạt được iteration speed mà chúng tôi đạt được nhờ React Native. Hơn thế nữa, thời gian kết hợp native là 15 giây tuy nhiên nó có thể lên đến 20 phút đối với full builds.

Đầu tư vào Infrastructure

Chúng tôi đã phát triển các hệ integration khủng vào infrastructure native của mình. Mọi mảng cốt yếu như networking, i18n, thí nghiệm, di chuyển các element chung, info của device, info của account, và nhiều thứ khác nữa trong một React Native API đơn. Các bridge này là các mảng khá phức tạp vì chúng ta muốn gói gọn các API Android và iOS vào một cái gì đó thống nhất và hợp lý cho React. Việc liên tục làm mới các bridge này nhanh chóng và phát triển thêm infrastructure mới là một cuộc chiến không ngừng nghỉ, vì thế mà việc đầu tư vào infrastructure team sẽ thúc đẩy được tiến trình tạo nên product.

Sự thiếu đầu tư vào infrastructure sẽ dẫn đến việc React Native mang lại những trải nghiệm tồi tệ cho developer và người dùng. Thế mới nói, React Native không thể nào kết hợp với app một cách êm đẹp nếu thiếu sự đầu tư liên tục và hợp lý.

Performance

Một trong những cái chúng tôi lo lắng nhất về React Native hiện tại đó là performance. Tuy nhiên, trên thực tế đó cũng không phải là vấn đề to tát lắm. Hầu hết các React Native screen chạy trơn tru như những cái của native. Performance thường được xem như một một mảng riêng. Chúng ta thường thấy các kĩ sư mobile nhìn vào JS và nghĩ rằng nó “chậm hơn Java”. Tuy nhiên, layout sẽ cải thiện được performance trong nhiều trường hợp.

Khi chúng ta thấy những vấn đề liên quan đến performance, thường chúng sẽ xuất phát từ việc render quá tải và được giảm tải bằng shouldComponentUpdateremoveClippedSubviews, cũng như sử dụng Redux hợp lí hơn.

Tuy nhiên, thời gian render lần đầu và khởi động làm cho React Native hoạt động không tốt khi launch screen, deeplink và tăng thời gian TTI khi đang định vị giữa các screen. Ngoài ra, các screen drop frame thì rất khó để debug vì Yoga dịch giữa các React Native component và các native view.

Redux

Chúng tôi dùng Redux để quản lý state khá hiệu quả và ngăn chặn UI không đồng bộ với state và cho phép việc chia sẻ data dễ dàng hơn giữa các screen. Tuy nhiên, Redux nổi tiếng về boilerplate của nó và hơi khó tiếp thu. Chúng tôi đã cung cấp một generator cho một số template phổ biến nhất định nhưng nó vẫn là một trong những phần khó và gây bối rối nhất khi làm việc với React Native. Nên lưu ý một điều là, không phải chỉ với React Native bạn mới gặp những thử thách như vậy.

Được hỗ trợ bởi Native

Vì mọi thứ trên React Native được bridge bằng native code, chúng ta có thể build nên rất nhiều thứ mà chúng ta không chắc là có thể từ đầu như:

  1. Shared element transitions: Chúng tôi đã build <SharedElement> component được hỗ trợ bởi native shared element code trên Android và iOS. Nó còn hoạt động được giữa screen native và screen React Native.
  2. Lottie: Chúng tôi đã thành công trong việc đưa Lottie hoạt động trên React Native bằng cách wrap các library có sẵn trên Android và iOS.
  3. Native networking stack: React Native sử dụng existing native networking stack và cache trên cả hai platform.
  4. Các core infra khác: Tương tự như networking, chúng tôi wrap phần native infrastructure còn lại như i18n, experimentation, v.v để nó hoạt dộng được trơn tru trên React Native.

Phân tích số liệu 

Chúng tôi có một bề dày lịch sử dùng eslint trên web rất hùng mạnh. Tuy nhiên, chúng tôi là platform đầu tiên tại Airbnb tiên phong Prettier. Chúng tôi nhận thấy rằng việc giảm nit và bikeshedding trên các PR rất hiệu quả. Prettier giờ đây được tích cực đầu tư bởi team web infrastructure.

Chúng tôi cũng dùng analytics để đo lường thời gian render và performance để tìm ra các screen nào cần được ưu tiên đầu tư hàng đầu về những vấn đề liên quan đến performance.

Vì React Native còn mới hơn và trẻ hơn so với web infrastructure của chúng tôi, nó sẽ là một vùng test idea mới hoàn hảo. Đã có rất nhiều tool và ý tưởng chúng tôi đưa ra hiện đã được show và sử dụng trên web.

Animation

Nhờ có thư viện React Native Animated, chúng ta có thể lấy được các animation jank-free và cả các interaction-driven animation như scrolling parallax.

JS/React Open Source

Vì React Native chạy React và JavaScript, chúng tôi đã tận dụng rất nhiều array các project javascript như redux, reselect, jest, v.v

Flexbox

React Native xử lý layout bằng Yoga – một library C đa platform giúp xử lý các tính toán layout qua flexbox API. Trước đó, chúng tôi vướng phải cá nhiều giới hạn với Yoga, ví dụ như, thiếu aspect ratios nhưng sau đó nó đã được bổ sung trong các update sau này. Ngoài ra, các tutorial như flexbox froggy làm cho việc onboarding thêm thú vị.

Kết hợp với Web

Lâu sau khi đã ứng dụng React Native, chúng tôi bắt đầu build web, iOS, và Android cũng một lúc. Vì web cũng dùng Redux, chúng tôi phát hiện ra nhiều code có thể share xuyên web và các native platform mà không cần thay đổi gì.

Những mặt không hiệu quả

Sự non nớt của React Native

React Native mới hơn Android hoặc iOS nhiều. Nó mới hơn, tham vọng hơn, di chuyển nhanh chóng hơn. Mặc dù React Native hầu như hiệu quả mọi lúc, có rất nhiều ví dụ về sự độ non của nó và đôi khi sẽ mang lại những thứ rắc rối không đáng. Đáng tiếc là, những thành phần này rất khó xác định và sẽ tốn của bạn từ vài tiếng đến vài ngày để giải quyết được nó.

Maintain fork của React Native

Do độ trẻ của React Native mà đôi khi chúng ta phải patch React Native source. Ngoài việc quay trở lại React Native, chúng tôi cũng phải maintain fork để chúng ta có thể nhanh chóng gộp các thay đổi vào phiên bản mình đang sử dụng. Qua 2 năm, chúng tôi đã phải add gần 50 commit trên React Native, làm cho quá trình upgrade React Native trở thành một trải nghiệm rất đau đớn.

JavaScript Tooling

JavaScript là một ngôn ngữ untyped. Nó làm cho việc scale khó khăn hơn và sẽ là một điểm trừ quá lớn với những kĩ sư mobile nào đang muốn học React Native. Chúng tôi phát hiện ra rằng việc áp dụng flow trừ các cryptic error message sẽ đem đến hậu quả khôn lường. Chúng tôi cũng đã cho ra TypeScript nhưng gộp nó vào một infrastructure có sẵn như babel và metro bundler sẽ rất phiền phức. Tuy nhiên, chúng tôi vẫn sẽ tiếp tục nghiên cứu nhiều hơn về TypeScript trên web.

Refactoring

Vì là một ngôn ngữ untype nên việc refactor trên JavaScript là cực khó và nhiều lỗi. Một cơn ác mộng để refactoring chính xác đó là Đặt lại tên cho prop, đặc biệt là các tên prop phổ biến như onClick hoặc các prop được pass qua nhiều component. Tệ hơn là, các refactor sẽ hỏng trong production chứ không phải lúc compile và rất khó để add phần phân tích hợp lý vào.

Các JavaScriptCore inconsistency

Một khía cạnh khó nói khác của React Native đó là nó chạy trong môi trường JavaScriptCore. Đây là một số kết quả mà chúng tôi nhận được khi thử:

  • iOS ship chung với JavaScriptCore của riêng nó, đồng nghĩa là iOS khá thống nhất và sẽ không gây nhiều khó khăn cho chúng tôi.
  • Android không ship JavaScriptCore nên React Native sẽ tự bundle cho nó. Tuy nhiên, cái bạn lấy được mặc định là cái cũ. Do đó, chúng ta cũng phải tự tìm ra cách để lấy được cái mới hơn.
  • Khi debug, React Nativese sẽ attach vào Chrome Developer Tool. Điều này là tốt vì nó là một debugger rất quyền lực. Tuy nhiên, một khi debugger đã attach, mọi JavaScript sẽ chạy trong V8 engine của Chrome. Nó sẽ chạy tốt 99.9% thời gian. Tuy nhiên, giả dụ như, bạn gặp phải vấn đề khi toLocaleString chạy trên iOS nhưng lúc debug thì chỉ chạy trên Android. Thành ra Android JSC sẽ không có nó và âm thầm fail trừ khi bạn đang debug khi đang sử dụng V8. Nếu như không biết nhưng chi tiết kĩ thuật như thế này, nó sẽ trở thành một trải nghiệm debug đầy đau thương cho các kĩ sư product.

Các React Native Open Source Library

Học một platform mới không hề dễ dàng và rất tốn thời gian. Hầu hết mọi người chỉ rành rõi một đến hai platform. Các React Native library có các native bridge như map, video, v.v đòi hỏi một lượng kiến thức trên cả 3 platform để hoạt động hiệu quả. Nó dẫn đến inconsistency hoặc các bug ngẫu nhiên trên Android hoặc iOS.

Trên Android, nhiều React Native library cũng yêu cầu bạn phải có chuyển môn đủ sâu về node_modules hơn là publish các maven artifact không khớp với cái mà cộng đồng mong đợi.

Infrastructure song song và Feature Work

Chúng tôi đã tích luỹ được nhiều năm với native infrastructure trên Android và iOS. Tuy nhiên, với React Native, chúng tôi bắt đầu từ 2 bàn tay trắng và phải viết và tạo lại hết các bridge trên tất cả những infrastructure sẵn có. Nó có nghĩa là có lúc kĩ sư của chúng tôi cần đến những tính năng chưa hề tồn tại nữa! Lúc này họ phải làm việc trên platform mà mình không hiểu gì và ngoài phạm vi project hoặc tạm hoãn cho đến khi tính năng xuất hiện…

Crash Monitoring

Chúng tôi dùng Bugsnag để report crash trên Android và iOS. Mặc dù chúng tôi có thể làm cho Bugsnag hoạt động trên cả 2 platform, nó không đáng tin lắm và đòi hỏi nhiều hơn so với các platform khác. Vì React Native còn mới và hiếm trong ngành, chúng tôi phải build một lượng infrastructure khá lớn như upload source của map in-house và phải dạy Bugsnag làm những thứ như filter crash bằng những gì đang có trong React Native.

Do lượng custom infrastructure trong React Native, chúng ta thường vướng phải những vấn đề khá nghiêm trọng mà không được report về crash hoặc source map không được upload hợp lý.

Cuối cùng, debug các React Native crash thường khó khăn hơn nhiều nếu như vấn đề này dính cả React Native và native code vì stack trace không nhảy qua lại giữa React Native và native được.

Native Bridge

React Native có một bridge API để giao tiếp giữa native và React Native. Dù nó hoạt động đúng như mong đợi, việc viết là một thử thách. Đầu tiên, nó đòi hỏi cả 2 môi trường phải được set up đúng. Chúng tôi cũng vướng phải một số vấn đề liên quan đến các type bất thường từ JavaScript. Ví dụ, các integer thường được wrap bởi string, một vấn đề ít được phát hiện ra cho đến khi nó được pass qua bridge. Tệ hơn là, đôi khi iOS sẽ âm thâm fail khi Android crash. Chúng tôi từ đó cũng bắt đầu nghiên cứu cách để tạo bridge code tự động từ các định nghĩa của TypeScript đến cuối năm 2017, hơi quá muộn.

Thời gian Initialization

Không như các native screen, việc render React Native đòi hỏi ít nhất một full main thread -> js -> yoga layout thread -> main thread trước khi có đủ info để render một screen lần đầu. Chúng ta đã gặp một p90 render trung bình 280ms trên iOS và 440ms trên Android. Trên Android, chúng ta đã dùng postponeEnterTransition API thường dùng cho shared element transition để trì hoãn việc hiển thị screen cho đến khi nó được render. Trên iOS, sẽ vướng phải các vấn đề về cài navbar configuration từ React Native. Từ đó, chúng ta sẽ add các khoảng trì hoãn cỡ 50ms với mọi React Native screen transition để hạn chế việc navbar chập chờn sau khi đã load configuration.

App Size

React Native cũng có những tác động không nhỏ đến app size. Trên Android, total size của React Native (Java + JS + các native library như Yoga + Javascript Runtime) là 8mb/ ABI. Với cả x86 và arm (chỉ 32 bit) trong một APK, nó có thể xấp xỉ 12mb.

64-bit

Chúng ta vẫn chưa thể ship một 64-bit APK trên Android vì vấn đề này.

Các Gesture

Chúng tôi tránh dùng React Native với screen bao gồm các gesture phức tạp vì touch subsystem trên Android và iOS đã đủ khó để nảy sinh thêm một API thống nhất gây khó dễ cho cả cộng đồng React Native. Tuy nhiên, mọi thức vẫn phải tiến triển và react-native-gesture-handler vừa mới đạt bản 1.0.

Các list dài 

React Native đã cải thiện được vấn đề với các library như FlatList. Tuy nhiên, nó vẫn chưa đủ lớn và linh hoạt như RecyclerView trên Android hoặc UICollectionView trên iOS. Rất nhiều hạn chế rất khó vượt qua do threading. Adapter data không thể truy cập đồng bộ được nên bạn có thể thấy thấy các flash khi đang lướt vì nó render không đồng bộ khi lướt nhanh. Text cũng không được đo đồng bộ nên iOS không thể tối ưu hoá một số cái bằng pre-computed cell heights.

Upgrade React Native

Dù hầu hết các upgrade React Native đều không đáng kể, vẫn sẽ có vài cái đau điếng như cục nhọt. Cụ thể là, việc chuyển React Native 0.43 (tháng 04/2017) sang 0.49 (tháng 10/2017) là không thể vì nó dùng React 16 alpha và beta. Đây là một vấn đề lớn vì hầu hết các library React được thiết kế cho web không support các phiên bản React trước đó. Quy trình vật lộn với các dependency cho upgrade này là một thiệt hại lớn cho React Native infrastructure work vào giữa năm 2017.

Tính truy cập

Trong năm 2017, chúng ta đã thực hiện một thay đổi lớn về accessibility – chúng tôi nỗ lực phát triển sao cho cả người khuyết tật cũng có thể dùng Airbnb để book cái họ muốn. Tuy nhiên, có quá nhiều lỗ hổng trong các API React Native accessibility. Để làm nên một thanh accessibility bar ở mức tối thiểu, chúng tôi phải maintain fork của chính mình trên React Native để gộp các chỉnh sửa lại. Trong những trường hợp này, những chỉnh sửa trong 1 dòng code Android hoặc iOS cũng tốn đến vài ngày để tìm hiểu xem add nó vào React Native thế nào, chọn lọc cẩn thận, rồi file vấn đề trên React Native core và follow nó vài tuần sau đó.

Các Crash phiền phức

Đôi khi chúng tôi phải đối mặt với rất nhiều dạng crash kì lạ và khó fix. Ví dụ, chúng ta đang phải fix crash này trên @ReactProp annotation và không thể tái tạo nó trên bất kì device nào, kể cả trên các device cùng hardware và software đến những cái crash khác.

SavedInstanceState trong các Process trên Android

Android thường dọn sạch các background process nhưng sau đó sẽ cho chúng lưu phần state đồng bộ trong bundle. Tuy nhiên, trên React Native, mọi state chỉ truy cập được trên js thread nên không thể thực hiện nó đồng bộ được. Kể cả như không trong trường hợp đó, redux như một state store sẽ không tương thích với phương pháp này vì nó chứa data cả chuyển đổi được và không chuyển đổi được và có thể chứa nhiều data hơn khả năng trong savedInstanceState bundle mà có thể dẫn đến crash trong production.


Đây là phần 2 trong series React Native của chúng tôi. 3 more to go!

  React Native tại Airbnb (Phần 1): Mở đầu

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

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

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

Ấn tượng trước những bước đột phá công nghệ mới của Line!

Line Vietnam tuyển dụng - TopDev

Line – Ứng dụng nhắn tin lớn nhất Nhật Bản vừa gây xôn xao giới công nghệ với thông báo chính thức sẽ ra mắt sàn giao dịch BITBOX trong tháng 7 này. Trước đó Line cũng đã và đang nỗ lực triển khai kế hoạch hỗ trợ Dapps trên Blockchain riêng của mình. 

Kế hoạch xây dựng sàn giao dịch mới

Trong thông cáo báo chí đăng tải ngày 28.6 vừa qua, Tập đoàn Line (“LINE”) và LVC Corporation (“LVC”), một công ty thuộc nhóm Line vận hành tiền điện tử và kinh doanh blockchain, đã công bố kế hoạch triển khai sàn giao dịch BITBOX ngay trong tháng 7 này với hơn 30 đồng tiền điện tử, bao gồm Bitcoin (BTC), Ethereum (ETH), Bitcoincash (BCH), Litecoin (LTC).

Line - TopDev

Cụ thể, Line cho biết:

“Với nhu cầu giao dịch tiền điện tử tăng vọt trên phạm vi toàn cầu, Line đã chuẩn bị mọi thứ để tạo điều kiện giúp người dùng thực hiện điều này một cách an toàn, và bởi giờ mọi thứ đã sẵn sàng, công ty sẽ bắt đầu cung cấp dịch vụ.”

Sàn giao dịch sẽ triển khai trên các quốc gia ngoại trừ Nhật Bản và Mỹ, với 15 ngôn ngữ được hỗ trợ bao gồm tiếng Anh và tiếng Hàn, không hỗ trợ cho tiếng Nhật và tiếng Thái.

Sàn sẽ lấy phí 0,1% cho mỗi giao dịch, nhưng sẽ ưu đãi 1 tháng đầu miễn phí cho người dùng.

Hỗ trợ Dapps trên Blockchain riêng của mình

Sự kiện nhà phát triển của Line diễn ra vào 20/4 vừa qua đã vạch ra lộ trình công nghệ 2018. Tại đây, Euivin Park – giám đốc công nghệ, cho biết Line đang có kế hoạch xây dựng một blockchain tùy chỉnh nhằm thúc đẩy phát triển các ứng dụng phân tán cho nền tảng của nó.

Nền tảng này sẽ được xây dựng bên ngoài các sản phẩm hiện có của Line và sử dụng mô hình kinh tế token để khuyến khích và thúc đẩy phát triển các ứng dụng phân tán, bởi các bên thứ ba hoặc chính các nhà phát triển của công ty.

Mục tiêu hướng đến việc đưa những nỗ lực blockchain hiện có của Line tạo bước đột phá lớn bằng cách triển khai một mainnet blockchain.

Euivin cũng cho biết thêm hiện Line đang muốn mở rộng và chuyển sang tuyển dụng các nhà phát triển blockchain ở Nhật Bản và Hàn Quốc, bên cạnh đó là một số nước khu vực Đông Nam Á.

Nhóm phát triển Line sẽ bắt đầu khám phá tiềm năng của công nghệ blockchain và nghiên cứu các phương pháp đổi mới thương mại hóa công nghệ này trong dài hạn, đồng thời sẽ triển khai nhiều ứng dụng phân quyền (dApps) và mainnet blockchain của nó trên giao thức blockchain ICON.

LINE Việt Nam vẫn đang tiếp tục mở rộng quy mô

Bước chân vào thị trường Việt Nam từ năm 2017 với việc mua lại công ty công nghệ Adways Technology Vietnam và đổi tên chính thức là Line Việt Nam. Số lượng những kỹ sư công nghệ tại Line Việt Nam là 100 nhân viên, tăng gấp đôi so với giai đoạn mới đi vào hoạt động.

Tháng 4 vừa qua, Line cũng đã đánh tiếng cho sự trở lại Việt Nam khi đầu tư vào webtretho.com. Theo nguồn tin từ Nhịp cầu đầu tư, Line hiện đang nắm quyền chi phối Công ty Cổ phần Dịch vụ Thông tin Trẻ Thơ, đơn vị chủ quản webtretho.com.

Thị trường Việt Nam giờ đã khác so với cách đây 5 năm và cơ hội cho Line khi Line Music và dịch vụ thanh toán Line Pay là hai dịch vụ có tốc độ tăng trưởng doanh thu cao nhất trong cơ cấu của Line với tỉ lệ lần lượt 180% và 96,6%.

Line Vietnam - TopDev

Với nhìn nhận Việt Nam là một quốc gia trẻ với số lượng lớn các lập trình viên, kỹ sư công nghệ thông tin, doanh nhân khởi nghiệp,… những người có tầm ảnh hưởng lớn đến sự phát triển kinh tế của quốc gia, Line nỗ lực mở rộng thêm những cơ sở mới tại thành phố Hồ Chí Minh và Hà Nội. Line từng bước tiếp cận, khai thác nguồn lực chất lượng, bám sát tầm nhìn chiến lược của công ty.

Cơ hội nào dành cho các lập trình viên tại LINE Việt Nam?

Đại diện Line chia sẻ: “Nhu cầu tuyển dụng trong ngành công nghệ thông tin ngày càng cao và Việt Nam là một trong những quốc gia sở hữu nguồn nhân lực công nghệ vô cùng ấn tượng”. Line đã và đang muốn khởi tạo thật nhiều cơ hội, những dự án cho những tài năng Việt. Đi cùng theo đó là loạt phúc lợi ấn tượng mà Line Vietnam dành riêng cho các lập trình viên của họ:

  • Offer hấp dẫn đầy nổi bật: $1,500 – $3,000;
  • Lương tháng 13 và thưởng hấp dẫn theo hiệu suất công việc;
  • Bảo hiểm sức khỏe chu đáo cho chính bạn và gia đình;
  • Nghiên cứu và làm việc với những công nghệ tiên tiến nhất;
  • Tham dự các chương trình training hấp dẫn: từ training kỹ năng ngoại ngữ cho đến các buổi Local Workshop, International Workshop và onsite training mở mang học hỏi;
  • Vui khỏe với các CLB thể thao (bóng đá, gym, bơi lội, yoga,…) và Company trip tuyệt vời mỗi năm;

Liệu bạn có muốn gia nhập Line và tạo dấu ấn thành công cho con đường sự nghiệp?

> Click tìm hiểu các vị trí bên dưới và giành cơ hội ứng tuyển ngay hôm nay <<

  • Java Engineer (Java, Spring, Cloud) Quận 10, Hồ Chí Minh – Ứng tuyển
  • Application Security Engineer – Quận 10, Hồ Chí Minh – Ứng tuyển
  • Back-end Engineer –  Quận 10, Hồ Chí Minh – Ứng tuyển
  • Senior Front-end Engineer (VueJS / ReactJ) – Ứng tuyển
  1. Senior Android Engineer (Mobile)

Mô tả công việc:

  • Thiết kế, xây dựng và duy trì các ứng dụng hiệu suất cao, đáng tin cậy và có thể tái sử dụng cho nến tảng Android
  • Đảm bảo hiệu suất, chất lượng và khả năng đáp ứng tốt nhất của các ứng dụng;
  • Cộng tác với nhóm để định hướng, thiết kế và giao các tính năng mới;
  • Phân tích hiệu suất và độ tin cậy của các ứng dụng LINE;
  • Liên kết chặt chẽ với các đội ngũ sản phẩm, thiết kế và lập trình để xây dựng các ứng dụng hoặc tính năng mới tại Tokyo và Seoul;

Yêu cầu chính:

  • Có kinh nghiệm lập trình phát triển các ứng dụng Android ít nhất 2 năm trở lên;
  • Hiểu biết về cấu trúc dữ liệu, thuật toán;
  • Nắm vững về lập trình hướng đối tượng OOP;
  • Nắm vững về Android SDK và tùy biến giao diện phù hợp với tất cả các kích cỡ màn hình;
  • Khả năng coding vững chắc, có thể hiểu các yêu cầu từ khách hàng để chuyển sang thành các yêu cầu kỹ thuật;
  • Thành thạo về API RESTful, cloud message APIs và thông báo đẩy;
  • Có kinh nghiệm về RESTful API kết nối từ app tới dịch vụ phía back-end;
  • Có kinh nghiệm về lưu trữ dữ liệu offline, xử lý đa luồng, tối ưu hóa performance;
  • Yêu thích coding và có khả năng review code và tái cấu trúc mã nguồn.

2. Junior Software Engineer (PHP, C++, Java, JavaScript)

Mô tả công việc:

  • Phát triển, duy trì, cập nhật và sửa đổi hệ thống phần mềm;
  • Thực hiện các yêu cầu nghiệp vụ theo đặc điểm kỹ thuật;
  • Cài đặt, thiết lập cấu hình, kiểm tra và duy trì hệ điều hành, phần mềm ứng dụng và các công cụ quản lý hệ thống;

Yêu cầu chính:

  • Từng có kinh nghiệm với một trong các ngôn ngữ lập trình sau: C/ C ++/ Java/ PHP/ JavaScript…;
  • Mới tốt nghiệp hoặc có ít hơn 2 năm kinh nghiệm;
  • Cơ tư duy phản biện và logic;
  • Có kiến ​​thức tốt về kiến ​​trúc phần mềm, OOP và design pattern;
  • Nhiệt tình học hỏi các công nghệ mới và chia sẻ phát triển cùng với team;

>>> Nhanh tay gửi CV – Chớp lấy cơ hội ngay hôm nay <<<