Home Blog Page 212

Vue.js vs jQuery: So sánh qua 1 số ví dụ

Giới thiệu

Vue.js là gì? Vue.js khác gì so với jQuery? Tôi có nên khoan hãy đụng đến jQuery nếu đã biết Vue.js? Có thể sử dụng Vue.js ngoài Laravel không? Nếu mới bắt đầu hoặc chỉ vừa mới học Vue.js, nhiều khả năng bạn sẽ gặp những thắc mắc tương tư hoặc bị rối về những trường hợp nên sử dụng Vue.js. Hy vọng bài viết này sẽ giải đáp thắc mắc của bạn, hiểu rõ hơn về framework đang khá nổi này, khi nào thì nên sử dụng và liệu có nên ngừng dùng jQuery vì Vue.js không.

jQuery là gì

jQuery đã xuất hiện được hơn 10 năm và được sử dụng phổ biến, từ những dự án nhỏ, vui vui đến các công ty lớn tiêu tốn hàng triệu USD mỗi tháng.

jQuery (viết ít hơn, hiệu quả hơn) là 1 thư viện Javascript nhỏ, nhanh gọn, nhiều tính năng, hoạt động trên nhiều hệ điều hành và góp phần giúp quá trình viết vanilla Javascript dễ dàng hơn. jQuery hỗ trợ DOM/CSS manipulation, event handling, animation và tạo các truy vấn Ajax.

Nên dùng jQuery khi nào?

jQuery có thể được sử dụng trong nhiều trường hợp. Rất nhiều thư viện và plugins yêu cầu có jQuery, nhờ đó có thể làm được nhiều thứ đơn giản như chỉnh sửa giá trị của input hoặc lấy content cảu div để tạo các slideshows/ galleries và animations đẹp, ấn tượng.

Khi đã quen với việc viết code jQuery, bạn hoàn toàn có thể viết mọi thứ bằng Javascript bằng jQuery. Dưới đây là 1 số ví dụ cho thấy jQuery không khó:

  • Nếu muốn lấy giá trị của 1 input:
$(‘#input-id’).val();

Lưu ý: Không nhất thiết là ID của element, bạn có thể sử dụng tất cả các CSS selectors quen thuộc như:  tag name, class name, attribute, first-child, last-child.

  • Thêm 1 class vào 1 element
$(‘#element-id’).addClass(‘some-class’);
  • Submit 1 truy vấn get đến API:
$.get(‘http://your-site.com/api/endpoint’, function(data){
    console.log(data);
});

Bạn có thể dễ dàng nhận ra: so với sử dụng vanilla Javascript, thì việc manipulate DOM hoặc tạo Ajax calls sử dụng jQuery rất dễ.

Chính vì vậy mà nhiều dev còn quên luôn cách viết code với vanilla Javascript. Bạn có thể tham khảo hình dưới:

Vue.js vs. jQuery

Cài đặt:

Bạn có thể sử dụng jQuery bằng cách tham chiếu CDN như bên dưới:

<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

Hoặc có thể cài đặt bằng NPM:

$ npm install jquery

Vue.js là gì?

Khác với jQuery, Vue.js là 1 framework MVC – được truyền cảm hứng bởi Angular. Trên thực tế, người sáng lập Evan You đã khởi tạo dự án này sau khi làm Angular cho Google. Ông quyết định trích những ưu điểm về Angular và tạo ra 1 framework nhẹ, dễ học, dễ sử dụng. Vue ra mắt vào tháng 2/2014 và được cộng đồng Laravel ủng hộ mạnh mẽ. Khi tôi viết bài này, Vue đã có 4,933,779 NPM lượt tải và 65,422 Github Stars.

Nên dùng Vue.js khi nào?

Vue phù hợp với các dự án nhỏ như chỉ cần thêm 1 ít reactivitity, submit form với AJAX, hiển thị cho user 1 modal, hiển thị giá trị của 1 input khi user đang gõ.. Vuejs scalable và cũng là lựa chọn tuyệt hảo cho dự án lớn. Chính vì vậy mà Vue.js được gọi là progressive framework.

Bạn có thể tìm thấy 1 số code mẫu trong documentation chính thức với nhiều ngôn ngữ khác nhau.

  1. GitHub Commits
  2. Todo App
  3. Model Component
  4. Elastic Header

.. Xem thêm các ví dụ tại đây.

Nhờ vào các core component Router and Vuex, Vue được thiết kế gần như hoàn hảo dành cho các ứng dụng single app lớn. Chúng ta có thể giải quyết nhiều vấn đề nâng cao (Components, Filters, Router, Events, Vuex… ) của framework sau đó trên Scoth.io này. Nếu bạn thích nghiên cứu code của những người khác thì tôi đề xuất ví dụ này: HackerNews Clone.

Cài đặt:

Bạn có thể sử dụng Vue bằng cách tham chiếu đơn giản CDN như thế này:

<script src="https://unpkg.com/vue"></script>

Hoặc cài đặt qua NPM:

$ npm install vue

#Examples:

Trong phần này, chúng ta sẽ đi qua nhiều ví dụ về cách thực hiện các tasks khó với jQuery và Vue.js:

Events:

  1. Nhận tín hiệu khi có 1 element được click vào:

jQuery: https://jsfiddle.net/4x445r2r/

<button id="button">Click me!</button>
(function() {
    $('#button').click(function() {
        alert('Clicked!');
    });
})();

Vue: https://jsfiddle.net/jwfqtutc/

<div id="app">
  <button @click="doSomething">Click me!</button>
</div>
new Vue({
    el: '#app',

    methods: {
        doSomething() {
            alert('Clicked!');
        }
    }
});
  1. Nhận tín hiệu khi có 1 input thay đổi:

jQuery: https://jsfiddle.net/5zdcLdLy/

<input id="input" type="text" placeholder="Enter your name">
(function() {
    $('#input').change(function() {
        alert('Hello '+ $(this).val());
    });
})();

Vue: https://jsfiddle.net/as65e4nt/

<div id="app">
  <input @change="doSomething" v-model="name" type="text" placeholder="Enter your name">
</div>
new Vue({
    el: '#app',

    data: {
        name: ''
    },

    methods: {
        doSomething() {
        alert('Hello '+ this.name);
    }
    }
});

Binding classes:

jQuery: https://jsfiddle.net/o65nvke2/

<div id="content">
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet, modi. Similique amet aliquam magni obcaecati placeat, iusto ipsum enim, perferendis earum modi debitis praesentium, consequatur dolor soluta deserunt. Saepe, laborum.
</div>
(function() {
    var className = 'red-text';

    $('#content').addClass(className);
})();

Vue: https://jsfiddle.net/a203pyqf/

<div id="app">
  <div id="content" :class="className">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet, modi. Similique amet aliquam magni obcaecati placeat, iusto ipsum enim, perferendis earum modi debitis praesentium, consequatur dolor soluta deserunt. Saepe, laborum.
  </div>
</div>
new Vue({
    el: '#app',

    data: {
        className: 'red-text'
    }
});

Cập nhật content của 1 element:

jQuery: https://jsfiddle.net/ccLffhot

<div id="content"></div>

<input type="text" id="text" placeholder="Enter your text">
(function() {

    $('#text').keyup(function() {
        $('#content').html($(this).val());
    });

})();

Vue: https://jsfiddle.net/gjLag10s/

<div id="app">
  <div v-html="content"></div>
  <input type="text" placeholder="Enter your text" v-model="content">
</div>
new Vue({
    el: '#app',

    data: {
        content: ''
    }

});

Toggle khả năng hiển thị của 1 element:

jQuery: https://jsfiddle.net/4LcL5pco/

<div id="content">
  BooHoo!
</div>

<button id="button">Toogle</button>
(function() {

    $('#button').click(function() {
        $('#content').toggle();
    });

})();

Vue: https://jsfiddle.net/a8xoaoqy/

<div id="app">
  <div id="content" v-if="visible">
    BooHoo!
  </div>

  <button @click="visible = !visible">Toogle</button>
</div>
new Vue({

    el: '#app',

    data: {
        visible: true
    }

});

Xây dựng 1 select input từ 1 array:

jQuery: https://jsfiddle.net/9f4pcakt/

<span>Social Networks:</span>

<select id="networks"></select>
(function() {

    var socialNetworks = ['Facebook', 'Twitter', 'YouTube', 'Instagram', 'LinkedIn'];
    var list;

    $.each(socialNetworks, function (index, value) {
        list += `<option value="${index}">${value}</option>`;
    });

    $('#networks').html(list);

})();

Vue: https://jsfiddle.net/gktr062m/

<div id="app">
  <span>Social Networks:</span>

  <select id="networks">
    <option v-for="(network, index) in socialNetworks" :value="index">{{ network }}</option>
  </select>
</div>
new Vue({

    el: '#app',

    data: {
        socialNetworks: ['Facebook', 'Twitter', 'YouTube', 'Instagram', 'LinkedIn']
    }

});

Tạo các truy vấn Ajax:

jQuery: https://jsfiddle.net/t3qef00y/

<span>List of users:</span>

<ul id="users"></ul>
(function() {

  var list = '';

    $.get('https://reqres.in/api/users', function(response) {

        $.each(response.data, function (index, user) {
            list += `<li>${user.first_name}</li>`;
        });

        $('#users').html(list);

  });

})();

Vue: https://jsfiddle.net/gbjthb3q/

Bạn không thể tạo các AJAX calls với chính Vue, nhưng team đã ra mắt 1 package tương ứng: GitHub – pagekit/vue-resource: The HTTP client for Vue.js

<div id="app">
<span>List of users:</span>

  <ul id="users">
    <li v-for="user in users">{{ user.first_name }}</li>
  </ul>
</div>
new Vue({

    el: '#app',

    data: {
        users: null
    },

    mounted: function() {
        this.$http.get('https://reqres.in/api/users').then(response => {
            this.users = response.body.data;
        });
    }

});

#Kết luận

Sau khi đọc bài này, hy vọng bạn đã rõ về sự khác nhau giữa jQuery và Vue, ưu điểm cũng như những trường hợp nào nên sử dụng jQuery hoặc Vue.

Với cá nhân thôi thì tôi vẫn dùng jQuery vì nó phù hợp với dự án tôi đang làm, trong khi đó tôi dùng Vue cho các dự án đòi hỏi sự phức tạp và reacitivity. Thêm nữa, bạn cũng nên cân nhắc dựa trên mức độ thành thạo đối với mỗi công cụ.

Nguồn: scoth.io

Những Visual Studio Code Extensions không thể bỏ qua khi lập trình Angular v2+

Visual Studio Code là công cụ editor hiệu quả giúp đời sống coding trở nên dễ dàng hơn, đặc biệt là các developer Javascript.

Điều khiến VS Code trở thành công cụ editor phát triển hiệu quả hơn là nhờ số lượng extensions trong marketplace.

Trong quá trình lập trình với Angular, tôi đã phát hiện được vài packages hỗ trợ khá tốt cho các dự án Angular v2+. Để sử dụng được nhiều packages như thế này, bạn có thể dùng gói extension sau: Angular Essentials Extension Pack by John Papa.

Video khóa học có liên quan: Make Visual Studio Code Your Editor

#Các packages Angular chuyên biệt—

Đây là những packages chuyên biệt với Angular. Tất cả những packages này sẽ giúp lập trình Angular nhanh hơn và thuận tiện hơn.

#Angular 2 TypeScript Emmet

Package này sẽ giúp bạn sử dụng những từ viết tắt của Emmet trong các templates Angular.

Nếu không có package Angular 2 TypeScript Emmet thì sẽ như thế này:

Những Visual Studio Code Extensions không thể bỏ qua khi lập trình Angular v2+

Và nếu có package, chúng ta sẽ thấy rõ về Emmet!

Những Visual Studio Code Extensions không thể bỏ qua khi lập trình Angular v2+

Video khóa học liên quan: Write HTML Super Fast with Emmet

#Angular Language Service

VS Code Package

Đây là 1 extension cực kì hữu ích, cung cấp intellisense khi viết các templates HTML cho 1 component Angular.

#Angular v4 TypeScript Snippets

VS Code Package

Đây là package rất hay của John Papa. Mặc dù Angular CLI có thể hỗ trợ rất nhiều nhưng cũng nên có những phương án dự phòng khác.

Chỉ cần gõ a- và nhận ra VS Code hiển thị cho bạn thấy tất cả các snippets có sẵn với package:
Đây là ví dụ của 1 snippet để generate 1 HTTP Interceptor:

#Angular2 Inline

VS Code Package

Package này đơn giản nhưng lại được yêu thích khá nhiều. Chúng ta sẽ có syntax hightlight cho các templates inline. Dưới đây là so sánh có package và không có package:

#Angular2 Switcher

VS Code Package

Package đơn giản, nhưng không phải tất cả mọi người đều nhận ra package này hữu ích. Đây là lý do tại sao tôi đầu tư thời gian học hỏi các shortcuts keyboard VS và Vim.

Package này giúp bạn nhanh chóng chuyển qua matching files .css|.html|.ts của 1 component.

Gỡ alt + o (Windows) hoặc shift + alt + o (Mac) đến:

  • Đi từ .ts -> .html
  • Đi từ .css -> .html
  • Đi từ .html -> file trước (.ts or .css)

Gõ alt + i (Windows) hoặc shift + alt + i (Mac) đến:

  • Đi từ .ts -> .css
  • Đi từ .html -> .css
  • Đi từ .css -> file trước (.ts or .html)

Gõ alt + u (Windows) hoặc shift + alt + u (Mac) đến:

  • Đi từ .css -> .ts
  • Đi từ .html -> .ts
  • Đi từ .ts -> file trước đó (.css hoặc .html)

#Packages cho tất cả ngôn ngữ JavaScript —

#Debugger cho Chrome

VS Code Package

Một package quan trọng khi làm việc với VS Code JavaScript bất kì.

#Auto Import

VS Code Package

Một package hữu ích tự động thêm line import { } from '' vào code.

Những Visual Studio Code Extensions không thể bỏ qua khi lập trình Angular v2+

#Bracket Pair Colorizer

VS Code Package

Tuy không được tất cả mọi người ưa chuộng, nhưng package này vẫn hay được dùng để xác định các dấu ngoặc gần với chỗ nào nhất. Extension này hỗ trợ đánh dấu các dấu ngoặc đơn cùng màu.

#JavaScript (ES6) Code Snippets

VS Code Package

Một package đơn giản để thêm ES6 snippets thông dụng. Tôi thường hay dùng idm – 1 snippet mở rộng thành

import { } from 'module';

1 số snippet có ích khác:

  • clgconsole.log(object)
  • foffor(const item of object) {}
  • stosetTimeout(() => {});

#npm

VS Code Package

1 package nhỏ dùng để thông báo khi nào thì 1 trong các packages của bạn không được update. Dưới đây là 1 ví dụ hiển thị 1 trong các packages Angular cập nhật chậm hơn 1 phiên bản.

#TSLint

VS Code Package

Tích hợp TSLint vào VS Code để có thể xác định được các lỗi trong TypeScript code nhanh chóng.

#Align

VS Code Package

Package nhỏ mà tôi hay sử dụng, giúp bạn cân chỉnh các đoạn code.

Một đoạn code chưa được căn chỉnh.

Sử dụng shortcut bàn phím ctrl + alt + a và sẽ có được:

#Kết luận

Hy vọng những extensions này sẽ giúp bạn tiết kiệm được thời gian và tập trung nhiều hơn code.

Nguồn: scotch.io

“Ở Việt Nam, cơ hội để thực sự làm về Trí tuệ nhân tạo còn quá ít, trong khi những thứ mang hình thù và dáng dấp AI thì quá nhiều”

Sau 2 mùa tuyển sinh, IP (Intelligence Program) vẫn là chương trình đào tạo (miễn phí) hiếm hoi trên thị trường về lĩnh vực Trí tuệ nhân tạo. Có vẻ như sau cơn sốt tràn ngập những “buzz words” về loạt công nghệ nóng nhất hành tinh, chúng ta quay trở lại với một sự thật hết sức hiển nhiên, rằng: “Cơ hội chưa bao giờ đến tự nhiên và dễ dàng.”

Trong quá trình gặp gỡ và tiếp xúc với các bạn trẻ đam mê công nghệ, Cinnamon nhận thấy tất cả đều mang trong mình một tài năng/ tiềm năng nhất định, như khả năng giải thuật siêu hạng với hàng loạt giải thưởng lớn nhỏ, khả năng lập trình 100 dự án/năm, tham vọng trở thành một doanh nhân công nghệ, hay đơn giản chỉ là khát khao có cơ hội để thực hành một dự án về Học máy (một trong những công nghệ cốt lõi của Trí tuệ nhân tạo). Thế nhưng tất cả đều thiếu CƠ HỘI và ĐỊNH HƯỚNG để đưa ra những lựa chọn đúng đắn nhất cho con đường sự nghiệp của mình. Câu chuyện xảy ra tương tự ngay cả với các du học sinh bậc Thạc Sĩ và Tiến sĩ từ Anh, Pháp, Đài Loan, v.v. khi trở về, mặc cho Khoa học máy tính đang trở thành ngành được săn đón nhất trên thế giới.

Sự thật là: “Ở Việt Nam, cơ hội để thực sự làm về Trí tuệ nhân tạo còn quá ít, trong khi những thứ mang hình thù và dáng dấp AI thì quá nhiều.”

Vậy cơ hội nào cho bước nhảy vọt tới tương lai cùng Trí tuệ nhân tạo?

Tầm nhìn toàn cầu và Tư duy Lãnh đạo chính là 2 giá trị mà Cinnamon muốn truyền tải xuyên suốt chương trình Intelligence khóa 2 cũng như Sự kiện: Ngày lễ tốt nghiệp và Định hướng nghề nghiệp vào ngày 29 tháng 10 tới đây.

NỘI DUNG CHI TIẾT

  • 14:15 – 15:00 Tổng quan
    – Những cơ hội nào đang tồn tại trên thị trường AI? (Ông) Nghiêm Xuân Bách – Quản lý Cinnamon tại Việt Nam
    – Technopreneur: Con đường từ tiến sĩ AI trở thành Doanh nhân công nghệ Tiến sĩ Hajime Hotta – Chủ tịch Cinnamon
  • 15:20 – 16:55 4 dự án tốt nghiệp của khóa Intelligence 2
    – Dự án số 1: Hệ thống khuyến nghị bài hát dựa trên cảm xúc người dùng
    – Dự án số 2: Trợ lý ảo tự động tóm tắt và sắp xếp email
    – Dự án số 3: Trợ lý ảo tự động tóm tắt hội thoại trong Slack
    – Dự án số 4: Nhân tố X – “Phiêu” cùng công nghệ Image Generating
  • 17:00 – 17:45 Thảo luận bàn tròn: Làm thế nào để làm chủ bước tiến sự nghiệp trong lĩnh vực AI?
    – Khách mời: Ts. Nguyễn Tuấn Đức (Đại học Tokyo, Nhật Bản)
    – Ths. Trần Anh Phương (Viện KTH Hoàng Gia, Thụy Điển)

THÔNG TIN ĐĂNG KÝ NHẬN THƯ MỜI THAM GIA SỰ KIỆN – tư cách khán giả (Số lượng có hạn)

IP 2017 – Graduation Day & Career Orientation: Leap to the Future

  • Thời gian: 14 – 17h, Chủ Nhật, 29/10/2017
  • Địa điểm: Nest Coworking Space, tầng 6, tòa nhà C, số 22 Thành Công, Đống Đa, Hà Nội
  • Link đăng ký: https://goo.gl/forms/5Em2sCp30plXN8th2
  • Hạn chót: 27/10/2017
  • Chi phí: MIỄN PHÍ

Lương IT đi Nhật có thể lên đến 165 triệu/tháng

IT đi Nhật

IT đi Nhật không còn là gì xa lạ trong ngành vì mức lương khi làm lập trình viên tại Nhật khá cao, lên đến 165triệu/tháng. Theo số liệu của Bộ Kinh tế công thương Nhật Bản (METI), đến năm 2020, Nhật Bản thiếu khoảng 50.000 nhân lực CNTT.

Theo khảo sát của Cơ quan xúc tiến CNTT Nhật Bản (IPA), trong 5 năm gần đây, có trên 60% doanh nghiệp Nhật khẳng định thiếu và rất thiếu nhân lực CNTT.

Đặc biệt là tình trạng “rất thiếu nhân lực” CNTT đang gia tăng mạnh mẽ, nếu trong năm 2009, chỉ có 5% các doanh nghiệp Nhật Bản trả lời “rất thiếu nhân lực” CNTT thì đến năm 2013, con số này là 19%, tăng gấp gần 4 lần.

Tính lương chuẩn với công cụ tính lương gross – net tại TopDev

Tình trạng khan hiếm nguồn nhân lực IT ở các công ty Nhật đã buộc các công ty  thực hiện giải pháp “nhập khẩu lập trình viên”, và Việt Nam được xác định là một trong những nguồn cung cấp nhân lực IT chủ lực cho các công ty Nhật, bởi chất lượng nhân lực IT Việt được đánh giá là khá tốt cùng với đó là sự tương đồng về văn hóa Nhật – Việt nên ngày càng có nhiều lập trình viên Việt Nam sang Nhật làm việc.

Làm lập trình viên ở Nhật được gì?

Sức hút từ thị trường việc làm IT tại Nhật đến từ mức thu nhập cao, chất lượng công việc được đảm bảo, những trải nghiệm về văn hóa mới, gặp gỡ những con người mới và tích lũy thêm những hành trang kiến thức vô cùng quý giá trong thời gian làm việc ở Nhât:

Tích lũy được rất nhiều kinh nghiệm

Làm việc ở môi trường Nhật Bản, là cơ hội tốt để lập trình viên được tiếp xúc với quy trình chuyên nghiệp, các dự án lớn và sẽ có vô vàn thứ hay ho để bạn học hỏi từ đó. Khi phải đối mặt với những vấn đề chưa từng gặp phải và phải giải quyết chúng một cách nhanh chóng cho kịp tiến độ; biết cách phòng tránh lỗi trong quá trình làm việc; biết cách sửa lỗi và cho ra đời những sản phẩm ưu việt nhất.

  Cơ hội nghề nghiệp về CNTT của các doanh nghiệp Nhật
  Nhà tuyển dụng "mỏi mắt" tìm lập trình viên thạo tiếng Nhật

Ngoài ra, kỹ năng mềm cũng được cải thiện rõ rệt: các kỹ năng làm việc trong môi trường đa văn hóa, quản lý dự án,…là những gì bạn chẳng thể học được khi còn ngồi trên ghế nhà trường.

Cơ hội thăng tiến

Trải nghiệm làm việc ở Nhật không phải là ai cũng có cơ hội có được, chính vì vậy hãy tranh thủ học hỏi thật nhiều đó sẽ làn bàn đạp cho các bạn thăng tiến sau này. Các công ty Nhật rất khuyến khích nhân viên gắn bó lâu dài với công ty, nhưng nếu vì lý do gì đó khiến bạn muốn trở về nước thì có rất nhiều cơ hội có được công việc tốt khi bạn trở về nước sau khi kết thúc hợp đồng làm việc ở Nhật.

Các chính sách đãi ngộ hấp dẫn

Nếu đi theo diện kỹ sư IT thì bạn được hưởng lương, chính sách và các đãi ngộ như các lập trình viên bản địa.

Mức lương dành cho lập trình viên ở Nhật được đánh giá là khá hấp dẫn. Mức lương tối thiểu mà lập trình viên tại Nhật có được 208.000 yên/tháng (khoảng 40 triệu VND). Tùy theo khả năng cũng như thái độ và trình độ tiếng Nhật của bạn thậm chí mức lương có thể lên đến 833.000 yên (~165 triệu VND).

Cấp độ Vị Trí Mức lương

(tháng)

Kinh nghiệm Khả năng
thích ứng
Tiếng Nhật
G1 Lập trình viên từ 208,000 Yên (40 triệu VNĐ) Thực tập sinh/ mới ra trường Chấp nhận linh hoạt các yêu cầu N5
G2 Đến 225,000 Yên (45 triệu VNĐ) Có kinh nghiệm 1 dự án N5
G3 Đến 241,000 Yên (50 triệu VNĐ) Có kinh nghiệm vài dự án N4
G4 Đến 266,000 Yên (54 triệu VNĐ) Có kinh nghiệm vài dự án N4
G5 Kĩ sư Đến 308,000 Yên (62 triệu VNĐ) Có nhiều kinh nghiệm lập trình Giao tiếp

linh hoạt

N3 trở lên
G6 Đến 367,000 Yên (72 triệu VNĐ) Có nhiều kinh nghiệm lập trình Giao tiếp linh hoạt/ Kiểm soát được các dự án N3 trở lên
G7 Đến 440,000 Yên (87 triệu VNĐ) Có nhiều kinh nghiệm lập trình N3 trở lên
G8 Project Manager Đến 533,000 Yên (105 triệu VNĐ) Kinh nghiệm lâu năm (senior) + nhiều skill lập trình Đưa ra được các đề án mới N3 trở lên
G9 Đến 658,000 Yên (130 triệu VNĐ) Kinh nghiệm lâu năm (senior) + nhiều skill lập trình N3 trở lên
G10 Đến 833,000 Yên (165 triệu VNĐ) Kinh nghiệm lâu năm (senior) + nhiều skill lập trình N3 trở lên

Mức lương tham khảo dựa trên trình độ kỹ thuật, kỹ năng mềm và khả năng tiếng Nhật

Trừ đi các khoản sinh hoạt phí bạn có thể tiết kiệm được 1 khoản kha khá sau thời gian làm việc ở Nhật.

Thời gian làm việc sẽ tùy thuộc vào hợp đồng lao động giữa ứng viên và công ty tuyển dụng, thường tối thiểu là 1 năm và gia hạn hợp đồng từ 1 – 3 năm hoặc 5 năm. Đặc biệt các công ty Nhật rất khuyến khích việc gắn bó lâu dài với công ty nên cơ hội được gia hạn hợp đồng là rất cao.

Dự án “Tuyển dụng Nhân tài IT đi Nhật” – Global IT Talent mang cơ hội đi Nhật đến developers từ fresh graduate đến senior

IT đi NhậtĐại diện IGS chia sẻ về chương trình “”Tuyển dụng Nhân tài IT đi Nhật” – Global IT Talent”

Nếu bạn tự nộp đơn ứng tuyển vào các công ty Nhật thì khả năng được nhận thường rất thấp, vì bạn phải trực tiếp cạnh tranh với rất nhiều ứng viên bản địa và cả những ứng viên đến từ khắp các nơi trên thế giới, hơn thế nữa rào cản về các thủ tục giấy tờ hành chính, pháp lý khiến bạn khó tiếp cận được các cơ hội việc làm tại Nhật.

  Cách Engineer Nhật Bản thực hiện test như thế nào
  Doanh nhân kiên nhẫn nhất Nhật Bản: Năm nào cũng viết thư hỏi mua các công ty trên khắp thế giới, có khi chờ tới 16 năm để đối tác gật đầu bán mình

Việc được 1 công ty có uy tín về cung cấp nhân sự ở Nhật như Human Resocia giới thiệu là một tấm vé thông hành gia tăng cơ hội được làm việc ở Nhật của các lập trình viên.

IGS là công ty chuyên về lĩnh vực nhân sự và giáo dục (EdTech và HR Tech). Với mong muốn mang cơ hội được làm việc ở Nhật cho lập trình viên các cấp độ từ fresh graduate đến senior. IGS phối hợp với tập đoàn Human Resocia triển khai chương “Tuyển dụng Nhân tài IT đi Nhật” – Global IT Talent giới thiệu cơ hội nghề nghiệp cho ứng viên đến hơn 3.000 công ty tại Nhật.

Sử dụng ứng dụng GROW – Ứng dụng trí tuệ nhân tạo (AI) vào việc phân tích trình độ chuyên môn cũng như đánh giá các kỹ năng mềm của ứng viên giúp đánh giá một cách toàn diện, và khách quan về các ứng viên. Từ đó đề xuất các vị trí thích hợp với trình độ cũng như tính cách của các ứng viên và có những sự hỗ trợ thích hợp dành cho từng ứng viên.

IT đi NhậtDự án “Tuyển dụng Nhân tài IT đi Nhật” – Global IT Talent thu hút được đông đảo các lập viên tham gia

Bên cạnh đó khi tham gia vào chương trình  “Tuyển dụng Nhân tài IT đi Nhật” – Global IT Talent lập trình viên còn nhận được những sự hỗ trợ thiết thực khác:

  • Đi theo diện kỹ sư IT và được hưởng lương và các đãi ngộ như lập trình viên Nhật
  • Ứng viên sẽ được ứng tuyển và phỏng vấn trực tiếp với công ty tuyển dụng bên Nhật
  • Làm việc tại Nhật đúng chuyên ngành mà bạn đã được đào tạo qua đó có thể học hỏi kiến thức, nâng cao tay nghề phát triển sự nghiệp sau này.
  • Được tư vấn và hướng dẫn hoàn thành các thủ tục VISA, xuất nhập cảnh trong thời gian sớm nhất
  • Xuất cảnh ngay khi đậu phỏng vấn với công ty bên Nhật (tối đa 3 tháng)
  • Hỗ trợ học bổng tiếng Nhật cấp tốc với những ứng viên chưa có năng lực tiếng Nhật để đáp ứng được yêu cầu về ngoại ngữ khi sang Nhật làm việc.
  • Tham gia các buổi workshop, training chia sẻ kinh nghiệm với các lập trình viên đã có kinh nghiệm làm việc ở Nhật qua Skype hoặc trực tiếp.

Tìm hiểu thêm thông tin chi tiết về chương trình  “Tuyển dụng Nhân tài IT đi Nhật” – Global IT Talent tại đây:

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

Xem thêm việc làm IT mức lương lương hấp dẫn nhất thị trường

Học cách đối phó nếu bạn phải làm việc với 4 kiểu sếp tồi phổ biến sau

Những vị sếp xấu tính không chỉ tồn tại trên phim, nhưng rất may là bạn vẫn có thể đối phó với họ.

Những vị sếp xấu tính không chỉ tồn tại trong các bộ phim kiểu như “Horrible Bosses” hay “Office Space”. Phiên bản đời thực của những nhân vật này cũng khá phổ biến trong môi trường công sở hiện đại.

Mới đây, LaSalle Network đã tiến hành một cuộc khảo sát với hơn 1.000 nhân viên văn phòng tại Mỹ. Tỷ lệ tố cáo họ có một vị sếp tồi tệ cao đến bất ngờ: 84%.

Ngoài ra, 43% trong số này cho biết họ đã phải bỏ chỗ làm chỉ vì sếp.

Một người sếp tồi có thể gây ra tác động rất tiêu cực lên các nhân viên dưới quyền, cả về mặt cảm xúc lẫn hiệu quả công việc. Theo báo cáo của hãng Gallup, lãnh đạo quyết định ít nhất 70% mức độ gắn kết của một nhân viên với chỗ làm.

Tất nhiên, bạn không bỏ việc chỉ vì có một người sếp không ra gì. Nếu bạn thích công ty đó, môi trường và êkip của mình, dưới đây là bí quyết để đối phó với 4 kiểu sếp xấu tính phổ biến nhất.

Yêu bản thân

Những vị sếp này quan tâm đến sự thăng tiến của bản thân mình hơn bất cứ ai khác. Họ chỉ muốn được nghe tán tụng mình giỏi đến mức nào và hiếm khi đề nghị nhân viên phản hồi về hiệu quả điều hành, bởi họ không bao giờ tin được mình “có vấn đề”.

Khi bộ phận được khen, họ tự nhận tất cả công lao về mình và sẵn sàng quy lỗi cho nhân viên khi xảy ra sự cố.

Cách đối phó: Nếu bạn hạnh phúc với cương vị hiện tại của mình và muốn tiếp tục ở lại công ty, hãy “hài hước hóa” sếp của mình.

Tuân theo nguyên tắc của ông ấy/bà ấy và cố gắng sửa sai bằng sự bao dung. Đừng tiếc lời khen dành cho họ mỗi khi họ đưa ra lời khuyên nào với bạn. Thông báo đầy đủ với họ về tất cả những trao đổi mà bạn đã tiến hành với khách hàng. Họ cần cảm thấy mình đang kiểm soát và biết mọi việc.

Khía cạnh tích cực: Những người xung quanh sẽ biết không chỉ có mỗi sếp bạn tham gia vào dự án. Họ thậm chí có thể khen ngợi, hoặc chí ít là ghi nhận bạn vì đã đủ kiên nhẫn và vị tha để không nhảy lên tranh công.

Bóng ma

Những vị sếp kiểu này luôn nói họ quan tâm đến sự phát triển của nhân viên cấp dưới, nhưng cứ thử đợi họ hướng dẫn hay hỗ trợ xem. Họ chẳng mấy khi phản hồi về hiệu quả công việc của bạn và cũng hiếm khi trả lời các câu hỏi. Những email của họ rất ngắn, nhát gừng và chẳng có mấy thông tin.

Cách đối phó: Dù cho sếp của bạn đang bận đánh golf hay thường xuyên phải đi công tác, đừng bao giờ có ý nghĩ “đi cho khuất mắt”. Hãy tiếp tục làm việc chăm chỉ và kết nối tích cực với êkip của mình về diễn tiến của dự án.

Hãy tìm nhiều cách khác nhau để khai thác thông tin và có câu trả lời đối với những vấn đề mình quan tâm. Nếu như không thể có được hồi đáp từ một sếp, hãy tìm ai đó khác có thể bật đèn xanh cho quyết định của bạn.

Khía cạnh tích cực: Thiếu định hướng có thể khiến bạn thất vọng, nhưng thực ra cũng là cơ hội để bạn chứng tỏ năng lực của mình. Bạn cũng có thể nhân đó tiếp cận với các lãnh đạo khác trong tổ chức để hỏi thông tin. Hệ quả là bạn sẽ gây dựng được các quan hệ bên ngoài êkip hiện tại của mình.

Bạn thân

Những vị sếp này luôn muốn nhân viên phải yêu quý họ. Họ muốn tham gia mọi cuộc tán gẫu hay được mời đi nhậu sau giờ làm.

Cách đối phó: Đây thực ra không phải là kiểu sếp quá tệ, nhưng sự thân thiết và “yêu chiều” nhau quá mức sẽ khiến bạn không thể phát triển được. Đôi khi những chỉ trích mang tính xây dựng là rất cần thiết.

Khía cạnh tích cực: Người ta có xu hướng thích làm việc với những người mình quý, và nếu như bạn có thể phát triển một quan hệ tốt đẹp với sếp của mình, trong đa số trường hợp, bạn sẽ làm việc năng suất hơn, chăm chỉ hơn và gắn bó với tổ chức lâu hơn.

Lốc xoáy

Những vị sếp kiểu này luôn xuất hiện rồi biến mất như một cơn lốc. Dù họ muốn được cập nhật thông tin về dự án, họ cũng chẳng có nổi quá 1 phút để nghe bạn trình bày.

Họ yêu cầu bạn làm một việc gì đó nhưng xong lại quên ngay, kết quả là một mớ lộn xộn.

Cách đối phó: Hãy gửi báo cáo tuần ngắn gọn cho họ, tóm tắt diễn tiến của dự án mà bạn đang theo. Bằng cách đó, sếp của bạn có thể cập nhật thông tin và bạn có thể sử dụng quãng thời gian ít ỏi gặp sếp để hỏi những thắc mắc cụ thể.

Khía cạnh tích cực: Bạn được chủ động làm việc của mình. Trong thế giới tương tác bị hạn chế, bạn sẽ trau đồi được kỹ năng phát biểu tự tin, chính xác và ngắn gọn.

Nguồn: Applancer Careers via Trí Thức Trẻ/CNBC

13 mẹo có thể giúp bạn rút ngắn thời gian phát triển kỹ năng lập trình

Khi bạn mới bắt đầu bước vào giới lập trình, rất khó để biết nên bắt đầu từ đâu nhưng lại rất dễ lầm đường, dẫn đến lãng phí rất nhiều thời gian và tiền bạc của bạn.

Nếu bạn là người mới đến với thế giới của lập trình và phát triển web, bạn nên bắt đầu bằng cách tự học từ tất cả các chương trình trực tuyến miễn phí. Bằng cách đó, bạn có thể khám phá những gì bạn thích và không thích trước khi đầu tư tiền vào một ngôn ngữ lập trình hoặc một khoá học nào đó. Có rất nhiều chương trình miễn phí và các lớp học cùng tài liệu để bạn lựa chọn.

1. Không nên quá chú trọng vào việc học ở trường đại học.

Trừ khi đó là từ các trường danh tiếng trong ngành đào tạo CNTT, thì lúc đó trình độ của bạn có thể sẽ vượt trội hơn. Vì trên thực tế, hầu hết các chương trình của trường đại học đều cố gắng để theo kịp với công nghệ đang thay đổi mỗi ngày. Bằng cấp có thể sẽ mang lại cho bạn mức lương tốt hơn trong 1-3 năm đầu tiên. Sau đó nó sẽ hết tác dụng. Vì vậy hãy tập trung vào các khoá học chuyên đề, thực học thực nghiệp, sẽ giúp bạn tiết kiệm thời gian và tiền bạc.

2. Hãy bắt đầu với JavaScript

JavaScript hiện là ngôn ngữ lập trình phổ biến nhất trên thế giới. Đó là ngôn ngữ chuẩn trên nền tảng web và cũng thường được sử dụng để code các ứng dụng di động. Bạn thậm chí có thể lập trình robot, máy bay không người lái (drone) và game bằng JavaScript.

3. Code mỗi ngày.

Chỉ có sự tự tin mới có thể giúp các bạn giữ lửa để code mỗi ngày. Và để tăng cường sự tự tin thì hãy bằng cách bắt đầu với một cái gì đó đơn giản. Hiện nay Code.org đã có chương trình dạy code dành cho trẻ em lấy cảm hứng từ Star Wars và Minecraft. Dù bạn là người lớn, thì đó vẫn là một cách tuyệt vời để tự chứng minh rằng bạn hoàn toàn có thể code.

4. Cách tốt nhất để học code đó chính là code.

Rất nhiều sinh viên luôn bắt đầu bằng cách đọc sách. Bạn hoàn toàn có thể đi theo con đường đó và đó cũng là cách tôi học code khi mới bắt đầu, nhưng nếu bạn thực sự muốn phát triển, hãy bắt đầu bằng việc làm một số bài tập. FreeCodeCamp là một nơi tuyệt với để bạn có thể thoa sức tung hoành phát triển bản thân.

5. Hãy tìm hiểu bằng các ví dụ.

Một trong những cách tốt nhất để có bước đột phá quan trọng đó là xem code của người khác và tìm hiểu xem họ giải quyết vấn đề gì. Tìm một người cùng tiến và thử tham gia một số chương trình đào tạo cặp. Gần đây tôi đã bắt đầu tham gia một chương trình mới gọi là “Shotgun with Eric Elliott”- giúp bạn tôi có thể thấy được quá trình tôi xây dựng ứng dụng một cách trực tiếp, nhờ vậy có thể cùng nhau phát hiện và tìm giải pháp một cách nhanh chóng.

6. Đọc Blog.

Có thể tôi hơi thiên vị, nhưng JavaScript Scene là một blog tuyệt vời để theo dõi và học hỏi. Tôi cũng là một fan của 2ality – đó là nơi tuyệt vời để luôn cập nhật những gì mới về JavaScript.

7. Thử Bootcamp.

Nếu bạn có thể đủ khả năng để học toàn thời gian, hãy bỏ qua các chương trình của trường đại học (Điều 1). Thay vào đó, thử tham gia một khoá bootcamp. Bootcamp là một khoảng đầu rất tuyệt nếu bạn có điều kiện (thường giao động từ 10.000 $ – 25.000$) và bạn cần phải tham gia một cách có trách nhiêm. Tôi đã từng các nhân viên từng tham gia bootcamp. Họ làm việc một cách tuyệt vời chỉ với một ít sự chỉ dẫn từ các những người có kinh nghiệm.

8. Tìm hiểu các khoá trực tuyến.

Nếu bạn không có tiền đầu tư cho bootcamp hoặc bạn là một người đã có mục tiêu và tự định hướng được bản thân, hãy thử tham gia các khoá đào tạo trực tuyến. “Learn JavaScript with Eric Elliott” là một lựa chọn hoàn hảo.

9. Tìm một người cố vấn tài giỏi.

Tốt nghiệp khóa học bootcamp hoặc trực tuyến chỉ là một bước trong quá trình học tập của bạn. Với tốc độ thay đổi nhanh chóng của ngành công nghiệp này, bạn sẽ không bao giờ được ngừng học tập. Bạn cần nên có một người cố vấn thông minh để học hỏi. Họ không nhất thiết phải người mà bạn có thể gặp trực tiếp. Có thể là ai đó mà bạn theo dõi trực tuyến.

10. Tìm một nhóm thảo luận hoặc nhóm học tập.

Các cuộc trò chuyện là cách tuyệt vời để tìm người cố vấn, bạn bè cùng nghiên cứu và bạn mới, bất kể trình độ hiện tại của bạn như thế nào.

11. Tổng hợp mọi thứ lại.

Các bài học bằng video rất hay, nhưng bạn cần luyện tập để nâng cao kỹ năng. Các bài tập thì rất hay, nhưng thường chỉ tập trung các khái niệm rất cụ thể, còn hướng dẫn bằng video mang lại cách code tuyệt vời. Sách rất tuyệt vời, nhưng khó có thể thực hành được nếu chỉ đọc sách. Vì vây dù bạn đang làm gì, hãy tổng hợp tất cả các nguồn đó. Cố gắng học hỏi từ nhiều phương tiện.

12. Tạo một nơi chứa các dự án của bản thân.

Cho dù bạn học như thế nào, nếu bạn muốn viết code trong một mảng nào đó, bạn nên bắt đầu xây dựng một nơi chứa các dự án của bạn. Đăng ký một tài khoản GitHub và đăng các dự án của bạn lên đó để các nhà tuyển dụng tiềm năng có thể nhìn thấy khả năng của bạn.

13.Tìm hiểu nhiều hơn một ngôn ngữ.

Tôi khuyên bạn nên đọc “Seven Languages in Seven Weeks.”. Tôi đã code qua các ngôn ngữ Basic, Assembly, Pascal, Delphi, C / C ++, Java, Lisp, và JavaScript. Học các ngôn ngữ khác nhau với những nguyên lý khác nhau sẽ dạy cho bạn những cách khác nhau để suy nghĩ về những vấn đề tương tự. Mở rộng trí tuệ của bạn, mở rộng sự sáng tạo của bạn. Nhưng hãy dành 1 năm tập trung vào JavaScript để vững chắc trước khi bạn tìm hiểu thêm những cái khác.

Nguồn: Hackingnewstutorials

Họp báo ra mắt sự kiện Vietnam Web Summit

Sáng nay (18/10), đại diện ban tổ chức sự kiện Vietnam Web Summit (VWS2017) – TopDev phối hợp với VECOM (Hiệp hội Thương mại điện tử Việt Nam) đã tổ chức buổi họp báo công bố chuỗi sự kiện Vietnam Web Summit. Buổi họp báo có sự tham gia của đại diện các nhà tài trợ, các đối tác, các đơn vị hỗ trợ, các diễn giả và các đơn vị Báo chí và Truyền thông.

Theo đại diện BTC VWS dự kiến năm nay thu hút hơn 9.000 lượt khách tham dự, gần 400 doanh nghiệp cùng hơn 100 chuyên gia kinh nghiệm, đặc biệt là sự tham gia của nhiều diễn giả đến từ các tập đoàn lớn trên thế giới như AWS (Amazon Web Services), Google, Facebook, Microsoft, Lazada, Nielsen, MasterCard hứa hẹn mang đến cho người tham dự những nội dung đặc sắc.

Từ thành công của Vietnam Web Summit 2016, sự kiện Vietnam Web Summit  đang dần khẳng định là một sân chơi không thể thiếu dành cho mọi cá nhân, tổ chức lớn nhỏ đang hoạt động trong lĩnh vực công nghệ tại Việt Nam, đặc biệt là lĩnh vực công nghệ Web.

Sự kiện thu hút đông đảo đại diện các nhà tài trợ, các đối tác, các đơn vị hỗ trợ, các diễn giả và các đơn vị Báo chí và Truyền thông

Năm nay sự kiện Vietnam Web Summit 2017 tập trung vào các nội dung dành cho doanh nghiệp cũng như các cá nhân thuộc các lĩnh vực công nghệ ứng dụng, quảng cáo, Digital Marketing, Cloud, Payment và E-commerce,… Được chia sẻ bởi các chuyên gia hàng đầu từ các tập đoàn trên thế giới, Vietnam Web Summit là nơi tập trung những chuyên đề đa dạng và thực tiễn, cung cấp những số liệu thực tiễn, cơ hội được trò chuyện cùng các chuyên già hàng đầu có thể giúp giải quyết được các vấn đề hóc búa mà doanh nghiệp đang gặp phải trong thời đại cách mạng công nghệ 4.0. Đồng thời tại sự kiện cũng đưa ra những dự báo tương lai cho sự phát triển của toàn ngành công nghiệp Web trong thời gian tới.

THỜI GIAN & ĐỊA ĐIỂM DIỄN RA SỰ KIỆN

  • Hồ Chí Minh: 01/12/2017 tại Grand Palace, 142/18 Cộng Hòa, P.4, Q. Tân Bình, Tp.HCM
  • Hà Nội: 08/12/2017 tại Trung tâm Hội nghị Forevermark, 614 Lạc Long Quân, Q. Tây Hồ, Hà Nội

CÁC CHỦ ĐỀ DỰ KIẾN TẠI VIETNAM WEB SUMMIT

Tham khảo tại: https://vietnamwebsummit.com

THÔNG TIN CHI TIẾT VỀ SỰ KIỆN

  • Website: https://vietnamwebsummit.com/
  • Fanpage chính thức: https://www.facebook.com/Vietnamwebsummit/
  • Để đăng ký tham dự chương trình Vietnam Web Summit vui lòng để lại thông tin tại đây

Bí kíp toàn thư về React mà bạn cần phải biết (phần 1)

react2

Năm ngoái tôi có viết một cuốn sách ngắn vọn vẻn 100 trang về React.js. Còn năm nay, tôi sẽ tự thử thách mình bằng cách tóm gọn lại vọn vẻn trong bài viết này mọi thứ bạn cần biết về React.js.

Bài viết sẽ không giải thích React.js là gì hay vì sao bạn phải học nó. Thay vào đó, tôi sẽ tập trung viết về những thông tin thực tiễn về phần nền tảng của React.js dành cho những bạn đã biết về JavaScript cũng như hiểu tương đối với DOM API.

Tất cả những ví dụ dưới đây đều mang tính tham khảo. Mục đích là giúp bạn hiểu rõ hơn về những khái niệm trong bài viết.

Nền tảng #1: Mọi thứ của React đều là về components

React được tạo ra xoay quanh khái niệm components tái sử dụng được. Bạn define các component nhỏ và gộp chúng lại để tạo ra những component to hơn.

Tất cả các component đều có thể tái sử dụng, thậm chí là qua nhiều project khác nhau.

Một React component – ở dạng đơn giản nhất – chính là JavaScript function:

// Example 1
// https://jscomplete.com/repl?j=Sy3QAdKHW
function Button (props) {
  // Returns a DOM element here. For example:
  return <button type="submit">{props.label}</button>;
}
// To render the Button component to the browser
ReactDOM.render(<Button label="Save" />, mountNode)

Các bạn đừng lo nếu chưa hiểu rõ những code trên bởi nó sẽ được giải thích trong những phần tiếp theo trong bài viết, kể cả ReactDOM. Bạn chỉ cần hiểu đơn giản nó là một  render function.

Ở đoạn cuối, ReactDOM.render ám chỉ địa điểm của các yếu tố của DOM mà React sẽ lấy và điều khiển. Trong jsComplete REPL, thì bạn có thể làm mọi thứ trên với một variable đặc biệt là mountNode.

Những điều tiếp theo sẽ dựa trên ví dụ #1:

  • Component name bắt đầu với một kí tự in hoa. Đây là yêu cầu bắt buộc bởi chúng ta phải làm việc với cả HTML và React. Nếu bạn đặt tên thường như “button” cho React component thì ReactDOM sẽ bỏ qua function và render một HTML button trống.
  • Mọi component đều nhận một list của các attributes, giống như HTML. Trong React, list này được gọi là props. Với một function component, bạn có thể đặt tên nó tùy ý thích.
  • Trong ví dụ trên, cách viết có vẻ giống HTML trong returned output của Button function component. Tuy vậy, nó không phải là JavaScript hay HTML, cũng chả phải là React.js. Thế nhưng lại trở nên khá nổi tiếng tới mức được xem là chuẩn trong các React applications. Nó có tên gọi là JSX và là một JavaScript extension. Hơn nữa, JSX là một compromise! Dù bạn có thử call và return bất cứ HTML element trong function trên thì chúng đề support cho nhau cả.

Nền tảng #2: JSX là cái quái gì vậy?

Ví dụ 1 ở trên có thể được viết hoàn toàn bằng React.js mà không cần tới JSX như sau:

// Example 2 -  React component without JSX
// https://jscomplete.com/repl?j=HyiEwoYB-
function Button (props) {
  return React.createElement(
    "button",
    { type: "submit" },
    props.label
  );
}
// To use Button, you would do something like
ReactDOM.render(
  React.createElement(Button, { label: "Save" }),
  mountNode
);

createElementfunction là function chính trong React top-level API. Nó vốn chỉ là 1 trong 7 phần của level đó mà bạn cần phải học. React API nhỏ tới mức như vậy đấy.

Như DOM, bản thân nó cũng có document.createElement function để tạo ra một yếu tố được xác định bởi một tag name, React’s createElement là một function cao cấp với khả năng làm được mọi thứ mà document.createElement có thể làm được. Đồng thời, nó còn có thể tạo ra một yếu tố đại diện cho React component. Chúng ta thực hiện điều đó trong ví dụ trên với  Button component.

Không như  document.createElement, React’s  createElement chấp nhận cả những yếu tố đại diện như là con của yếu tố khác. Nói cách khác  createElement thật sự tạo ra cả một cây dòng dõi các yếu tố.

Sau đây là một ví điển hình:

// Example 3 -  React’s createElement API
// https://jscomplete.com/repl?j=r1GNoiFBb
const InputForm = React.createElement(
  "form",
  { target: "_blank", action: "https://google.com/search" },
  React.createElement("div", null, "Enter input and click Search"),
  React.createElement("input", { name: "q", className: "input" }),
  React.createElement(Button, { label: "Search" })
);
// InputForm uses the Button component, so we need that too:
function Button (props) {
  return React.createElement(
    "button",
    { type: "submit" },
    props.label
  );
}
// Then we can use InputForm directly with .render
ReactDOM.render(InputForm, mountNode);

Hẳn bạn cũng có thể thấy rằng:

  • InputFormkhông phải là một React component; mà chỉ là một React element. Đó là nguyên nhân ta dùng nó trực tiếp trong  ReactDOM.render call chứ không phải với  <InputForm />.
  • React.createElement  function chấp nhận nhiều arguments.
  • Chúng ta có thể nest React.createElement call là bởi vì nó toàn là JavaScript.
  • Điểm đáng tranh cãi thứ 2 trong  React.createElement  có thể là null hoặc một object trống khi không cần có attributes hay props cho element.
  • Chúng ta có thể trộn HTML element với React components. Cứ nghĩ đơn giản là HTML elements như built-in React components.
  • React’s API cố gắng trở nên giống DOM API nhất có thể, đó là nguyên nhân vì sao chúng ta dùng  className thay vì class cho input element. Và mọi người cũng đều mong React’s API sẽ thành một phần của DOM API bởi nó sẽ cực kì tiện lợi.

Những đoạn code trong ví dụ trên là điều mà browser sẽ hiểu khi bạn thêm React library. Browser không hề đụng tới bất cứ JSX nào. Tuy vậy, chúng ta thường thích làm việc với HTML thay vì các  createElement calls này. Do đó mà mới có những JSX compromise. Chúng ta có thể viết lại những code trên với một cú pháp tương tự như HTML:

// Example 4 - JSX (compare with Example 3)
// https://jscomplete.com/repl?j=SJWy3otHW
const InputForm =
  <form target="_blank" action="https://google.com/search">
    <div>Enter input and click Search</div>
    <input name="q" className="input" />
    <Button label="Search" />
  </form>;
// InputForm "still" uses the Button component, so we need that too.
// Either JSX or normal form would do
function Button (props) {
  // Returns a DOM element here. For example:
  return <button type="submit">{props.label}</button>;
}
// Then we can use InputForm directly with .render
ReactDOM.render(InputForm, mountNode);

Một số điều nổi bật trong ví dụ trên:

  • Nó không phải là HTML. Chúng ta vẫn dùng className  thay vì  class.
  • Chúng ta vẫn xem những thứ trông giống HTML ở trên như JavaScript.

Ví dụ 4 này chính là JSX. Và ví dụ 3 chính là phiên bản được compiled của nó dành cho browser. Để thực hiện được điều đó ta cần dùng tới một quá trình tiền xử lý để convert JSX version thành  React.createElement version.

Và đó chính là JSX. nó là một compromise cho phép chúng ta viết các React components trong một cú pháp tương tự như HTML.

Mặt khác, JSX cũng có thể được dùng lên chính nó.

Nền tảng #3: Bạn có thể dùng JavaScript expressions bất cứ nơi đâu trong JSX.

Trong một JSX section, bạn có thể dùng bất cứ JavaScript expression nào miễn nằm trong dấu ngoặc nhọn:

// Example 5 -  Using JavaScript expressions in JSX
// https://jscomplete.com/repl?j=SkNN3oYSW
const RandomValue = () => 
  <div>
    { Math.floor(Math.random() * 100) }
  </div>;
// To use it:
ReactDOM.render(<RandomValue />, mountNode);

Có thể thấy rằng không hề có giới hạn cho bất kì JavaScript expression trong dấu ngoặc nhọn. Nó tương tự như interpolation syntax  ${}  trong JavaScript template literals.

Chỉ có một hạn chế duy nhất trong JSX: phải là expression. Thế nên, ví dụ như, bạn sẽ không thể dùng một if statement nhưng một expression thứ ba thì mọi thứ lại bình thường.

JavaScript variables cũng được xem là các expressions, thế nên khi component nhận một list của prop (RandomValue component thì không, props là optional), ban có thể dùng những props này trong dấu ngoặc nhọn. Chúng ta cũng đã thực hiện điều này với Button  component (trong ví dụ 1)

Các objects JavaScript cũng là những expressions. Đôi khi chúng ta dùng JavaScript object trong dấu ngoặc nhọn, nhìn thì giống như xài cả hai lần dấu ngoặc nhọn nhưng thực chất nó là object trong dấu ngoặc nhọn.

// Example 6 - An object passed to the special React style prop
// https://jscomplete.com/repl?j=S1Kw2sFHb
const ErrorDisplay = ({message}) =>
  <div style={ { color: 'red', backgroundColor: 'yellow' } }>
    {message}
  </div>;
// Use it:
ReactDOM.render(
  <ErrorDisplay 
    message="These aren't the droids you're looking for" 
  />,
  mountNode
);

Lưu ý rằng tôi chỉ destructure message ra khỏi props argument. Đó là Javascript. ngoài ra, style attribute ở trên cũng là 1 trường hợp đặc biệt (không phải HTML, mà gần giống như DOM API). Chúng ta sử dụng 1 object với vai trò như giá trị của style attribute. Object đó sẽ định vị styles tương tự những gì chúng ta làm với Javascript.

Bạn còn có thể sử dụng element React trong JSX, vì đó cũng là 1 expression. Nên nhớ là element React là 1 hàm call:

// Example 7 - Using a React element within {}
// https://jscomplete.com/repl?j=SkTLpjYr-
const MaybeError = ({errorMessage}) =>
  <div>
    {errorMessage && <ErrorDisplay message={errorMessage} />}
  </div>;
  
// The MaybeError component uses the ErrorDisplay component:
const ErrorDisplay = ({message}) =>
  <div style={ { color: 'red', backgroundColor: 'yellow' } }>
    {message}
  </div>;
// Now we can use the MaybeError component:
ReactDOM.render(
  <MaybeError
    errorMessage={Math.random() > 0.5 ? 'Not good' : ''}
  />,
  mountNode
);

 MaybeError component ở trên sẽ chỉ hiển thị  ErrorDisplay component nếu có một  errorMessage string pass qua nó và một  div trống. React xem xét  {true}{false}{undefined}, và {null}  để thành valid element children, vốn không render bất cứ thứ gì.

Bạn cũng có thể dùng tất cả các phương pháp JavaScript functional trên collections (mapreducefilterconcat …) bên trong JSX. Đó là vì chúng là return expressions:

// Example 8 - Using an array map inside {}
// https://jscomplete.com/repl?j=SJ29aiYH-
const Doubler = ({value=[1, 2, 3]}) =>
  <div>
    {value.map(e => e * 2)}
  </div>;
// Use it
ReactDOM.render(<Doubler />, mountNode);

Bạn có thể thấy cách Tôi đã cho value prop một default value như trên, bởi vì nó hoàn toàn là Javascript. Cũng như việc tôi output một array expression trong  div. React hoàn toàn ok với điều đó.

Nền tảng #4: bạn có thể viết React components với JavaScript classes

Các function components đơn giản vô cùng thích hợp cho những nhu cầu đơn giản, nhưng đôi khi chúng ta cần hơn cả thế. React hỗ trợ tạo components bằng JavaScript class syntax. Sau đây là  Button component (trong ví dụ 1) được viết với class syntax:

// Example 9 - Creating components using JavaScript classes
// https://jscomplete.com/repl?j=ryjk0iKHb
class Button extends React.Component {
  render() {
    return <button>{this.props.label}</button>;
  }
}
// Use it (same syntax)
ReactDOM.render(<Button label="Save" />, mountNode);

Class syntax này rất đơn giản. Define một class với việc mở rộng React.Component. Việc class định dạng một instance function đơn  render(), và render function returns lại virtual DOM object. Mỗi lần chúng ta dùng Button class-based component ở trên, React sẽ lập tức dùng một object trong class-based component cho DOM tree.

Đó là nguyên nhân vì sao ta dùng this.props.label trong JSX trong rendered output ở trên. Bởi các component đều có một instance property đặc biệt gọi là  props , vốn giữ tất cả các value được pass tới component đó.

Bởi chúng ta có instance liên quan tới một component một lần dùng, chúng ta có thể tinh chỉnh tùy ý instance đó. Chúng tôi có thể tinh chỉnh nó sau khi nó được tạo ra bởi JavaScript  constructor function:

// Example 10 -  Customizing a component instance
// https://jscomplete.com/repl?j=rko7RsKS-
class Button extends React.Component {
  constructor(props) {
    super(props);
    this.id = Date.now();
  }
  render() {
    return <button id={this.id}>{this.props.label}</button>;
  }
}
// Use it
ReactDOM.render(<Button label="Save" />, mountNode);

Chúng ta cũng có thể định dạng hàm class prototype  và dùng nó ở bất cứ nơi nào, bao gồm cả ở trong JSX output:

// Example 11 — Using class properties
// https://jscomplete.com/repl?j=H1YDCoFSb
class Button extends React.Component {
  clickCounter = 0;
handleClick = () => {
    console.log(`Clicked: ${++this.clickCounter}`);
  };
  
  render() {
    return (
      <button id={this.id} onClick={this.handleClick}>
        {this.props.label}
      </button>
    );
  }
}
// Use it
ReactDOM.render(<Button label="Save" />, mountNode);

Bạn có thể thấy trong ví dụ 11 này:

Hàm handleClick được viết nhờ vào class-field syntax mới trong JavaScript. Dù chỉ mới ở stage-2 nhưng nó lại được xem như là phương pháp tốt nhất để truy cập vào component mounted instance. Nhưng bạn sẽ phải dùng tới compiler như Babel configured để hiểu stage-2 để truy cập vào code ở trên. jsComplete REPL thì đã được pre-configured sẵn như vậy.

Chúng tôi cũng define clickCounter  instance variables sử dụng class-field syntax. Nhờ đó mà không cần phải dùng tới class constructor call.

Khi ta chỉ định handleClick  function là giá trị cho onClick  React attribute, ta đã không call nó. Thay vào đó, ta pass trong reference tới  handleClickfunction. Call function với level như vậy là một lỗi thường gặp khi dùng React.

// Wrong:
onClick={this.handleClick()}
// Right:
onClick={this.handleClick}

Nền tảng #5: Events trong React: 2 điểm khác biệt quan trọng.

Khi nói tới events trong các yếu tố của React, có 2 điểm khác biệt quan trọng so với cách chúng ta thường làm với DOM API:

  • Mọi React elements attributes đều được đặt tên sử dụng camelCase, thay vì lowercase. Nói cách khác  onClick mới đúng, chứ không phải là  onclick
  • Chúng ta pass một JavaScript function thật sự như là một event handler thay vì là một string. Nó là  onClick={handleClick}, chứ không phải là onClick="handleClick".

React bao DOM event object với một object của chính nó để tối ưu hóa hiệu năng của events handling. Nhưng trong một event handler, chúng ta vẫn có thể truy cập mọi phương pháp có trong DOM event object. React sẽ pass event object đó tới từng handle call.

// Example 12 - Working with wrapped events
// https://jscomplete.com/repl?j=HkIhRoKBb
class Form extends React.Component {
  handleSubmit = (event) => {
    event.preventDefault();
    console.log('Form submitted');
  };
  
  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <button type="submit">Submit</button>
      </form>
    );
  }
}
// Use it
ReactDOM.render(<Form />, mountNode);

(Hết phần 1)

Bí kíp toàn thư về React mà bạn cần phải biết (phần 2)

Phỏng dịch theo bài viết tại freecodecamp.org

Có gì mới với Server-Side Rendering trong React 16?

react16

React 16 đã có mặt!!

Có rất nhiều thứ để nói (nhất là việc viết lại hoàn toàn Fiber), nhưng với tôi, nhưng cải thiện trong server-side render là nổi bật nhất.

Hãy cùng tôi điểm qua những cái mới và khác biệt với SSR trong React 16, hi vọng là bạn cũng phấn khích như tôi.

Tham khảo vị trí tuyển lập trình viên React lương cao

Cách SSR hoạt động trong React 15

Đầu tiên, chúng ta hãy cũng nhìn lại cách thức hoạt đông của SSR trong React 15. Để dùng SSR, bạn sẽ phải chạy một Node-based web server như xpress, Hapi, hoặc Koa, và bạn call renderToString để render cho root component cho một string, mà sau đó bạn sẽ ghi cho một response:

// using Express
import { renderToString } from "react-dom/server"
import MyPage from "./MyPage"
app.get("/", (req, res) => {
  res.write("<!DOCTYPE html><html><head><title>My Page</title></head><body>");
  res.write("<div id='content'>");  
  res.write(renderToString(<MyPage/>));
  res.write("</div></body></html>");
  res.end();
});

Sau đó, trong client bootstrap code, bạn sẽ yêu cầu client-side renderer “rehydrate” lại server-generated HTML nhờ vào  render(), giống như phương thức với client-side rendered app:

import { render } from "react-dom"
import MyPage from "./MyPage"
render(<MyPage/>, document.getElementById("content"));

Nếu bạn làm đúng theo trên thì client-side renderer sẽ chỉ cần dùng các server-generated HTML có sẵn mà không cần phải update DOM.

Vậy còn SSR trong React 16 thì sao?

React 16 có tính tương thích ngược (Backwards Compatible)

Nói cách khác nếu code của bạn chạy ngon lành trên React 15 thì nó cũng sẽ “trơn tuột” trên cả React 16. Đoạn code ở mục trên cũng chạy được trên cả 2 phiên bản 15 và 16.

render() trở thành hydrate()

Khi bạn upgrade SSR code từ React 15 lên React 16, bạn có thể sẽ bắt gặp bảng warning như sau trong browser của mình:

Hóa ra trong React 16, giờ có tới 2 phương pháp khác nhau để render client side:  render() dành cho các nội dung nằm hoàn toàn về phía client, và  hydrate() cho khi bạn muốn reder server-side. Bởi vì React là backwards compatible,render() vẫn sẽ hoạt động bình thường khi render trên server-generated markup trong React 16, nhưng bạn nên thay những calls đến hydrate() để không bị warning cũng như chuẩn bị code cho phiên bản React 17 trong tương lai. Đoạn trích code bên dưới cũng sẽ thay đổi theo:

import { hydrate } from "react-dom"
import MyPage from "./MyPage"
hydrate(<MyPage/>, document.getElementById("content"));

React 16 có thể xử lí Arrays, Strings, và Numbers

Trong React 15, một component của render sẽ luôn phải trả về (return) một React element đơn. Tuy vậy, với React 16, client-side renderer cho phép components trả về một string, một number, hay một array từ render. Tính năng cũng được hỗ trợ bởi React 16’s server-side render.

Như vậy, giờ bạn đã có thể server-render components như sau:

class MyArrayComponent extends React.Component {
  render() {
    return [
      <div key="1">first element</div>, 
      <div key="2">second element</div>
    ];
  }
}
class MyStringComponent extends React.Component {
  render() {
    return "hey there";
  }
}
class MyNumberComponent extends React.Component {
  render() {
    return 2;
  }
}

Thậm chí còn có cả khả năng pass trong một string, number hoặc một array component tới level cao của  renderToString:

res.write(renderToString([
      <div key="1">first element</div>, 
      <div key="2">second element</div>
    ]));
// it’s not entirely clear why you would do this, but it works!
res.write(renderToString("hey there"));
res.write(renderToString(2));

Điều này cho phép bạn loại bỏ bất cứ  divs and span vừa được thêm vào trong cây React component của bạn, nhờ đó mà kích thước của HTML document sẽ được thu nhỏ lại.

React 16 cho ra những HTML hiệu quả cao

Khi nhắc tới kích thước của HTML document, React 16 cũng cắt gọt bớt SSR trong HTML. Với React 15, từng yếu tố của HTML trong một SSR document có  data-reactid attribute, luôn có giá trị tăng dần theo ID, và text node đôi khi bị bao quanh bởi các comment với  react-text và một ID. Đoạn trích code dưới đây chính là một ví dụ điển hình cho trường hợp trên:

renderToString(
  <div>
    This is some <span>server-generated</span> <span>HTML.</span>
  </div>
);

Trong React 15, đoạn code đấy sẽ cho ra HTML như sau:

<div data-reactroot="" data-reactid="1" 
    data-react-checksum="122239856">
  <!-- react-text: 2 -->This is some <!-- /react-text -->
  <span data-reactid="3">server-generated</span>
  <!-- react-text: 4--> <!-- /react-text -->
  <span data-reactid="5">HTML.</span>
</div>

Còn với React 16, Mọi IDs đã được loại bỏ khỏi markup, nên HTML sẽ trở nên vô cùng đơn giản:

<div data-reactroot="">
  This is some <span>server-generated</span> <span>HTML.</span>
</div>

Không chỉ nó dễ nhìn dễ đọc hơn mà còn giúp giảm kích thước của HTML document  một cách đáng kể!

React 16 cho phép Non-Standard DOM Attributes

DOM renderer trong React 15 khá là khắt khe trong attribute trên các yếu tố thuộc HTML, và nó sẽ tự động loại bỏ ra các non-standard HTML attributes. React 16 thì ngược lại, cả client và server renderer giờ sẽ cho qua cả các non-standard attributes mà bạn đã thêm vào HTML. Bạn có thể đọc thêm Dan Abramov’s React blog để hiểu rõ hơn.

React 16 SSR không hỗ trợ Error Boundaries hoặc Portals

Có hai tính năng mới trong React 16 client-side renderer nhưng lại không được hỗ trợ trong server-side renderer:Error Boundaries và Portals. Nếu bạn muốn biết thêm về error boundaries, hãy đọc Abramov’s React blog, nhưng hãy lưu ý rằng error boundaries sẽ không có bắt được lỗi trên server. Còn Portals thì tới giờ vẫn chưa có bài viết nào hay giải thích về nó nhưng tóm gọn thì Portal API cần một DOM node, nên nó cũng sẽ không dùng được server.

React 16 thực hiện Client-Side Checking nhẹ nhàng hơn

Khi bạn rehydrate markup trên client-side trong React 15, ReactDOM.render() sẽ thực hiện một so sách từng kí tự một với server-generated markup. Nếu có bất kì sai sót gì thì React sẽ phát warning trong development mode và thay toàn bộ cây server-generated markup với HTML được tạo ra bên phía client.

Trong React 16, client-side renderer sử dụng một thuật toán khác để kiểm tra xem server-generated markup có đúng hay không. Nó thật sự khoan hồng hơn so với React 15. Ví dụ như nó không cần server-generated markup phải có các attributes theo đúng thứ tự như phía client. Và nếu có sai sót thì thay vì thay toàn bộ thì nó chỉ nhắm vào sub tree ví trị sai đó thôi.

Nói chung, thay đổi này sẽ không ảnh hưởng đến end-user ngoài trừ một điều: React 16 không fix SSR-generated HTML attributes bị sai/lệch khi bạn call  ReactDOM.render()/hydrate(). Do đó mà bạn sẽ phải cẩn thận và chắc chắn rằng đã sửa hết mọi markup mismatch warning bạn thấy trong app trong  development mode.

React 16 không cần được Compiled thì mới có hiệu suất tốt nhất

Trong React 15, nếu bạn dùng SSR thẳng luôn thì hiệu suất của nó sẽ không được tốt như kì vọng, thậm chí là kể cả trong production mode. Đó là bởi vì có rất nhiều developer warnings và gợi ý trong React, chúng sẽ giống như thế này:

if (process.env.NODE_ENV !== "production") {
  // check some stuff and output great developer
  // warnings here.
}

Thật không may, process.env  lại không phải là một JavaScript object bình thường, và nó khá là tốn công để có thể lấy được một value từ nó. Do đó nên dù ta có set giá trị của NODE_ENV thành  production, chỉ việc checking môi trường của variable thường xuyên cũng đã thêm rất nhiều thời gian cho server rendering.

Để giải quyết vấn đề này trong React 15, bạn sẽ compile SSR code để lại bỏ references của  process.env, nhờ vào Environment Plugin của Webpack hoặc transform-inline-environment-variables plugin của Babel. Tuy vậy, theo kinh nghiệm của tôi, rất nhiều người không hề compile server-side code, đó đó hiệu năng SSR cho ra rất là tệ.

Trong React 16, vấn đề này đã được giải quyết. Chỉ cần một call để check process.env.NODE_ENV ngay từ khi mới bắt đầu, do đó mà không cần phải compile SSR code của bạn để có hiệu năng tốt nhất bởi bạn đã có nó ngay từ đầu rùi.

React 16 cũng chạy nhanh hơn

Nhắc đến tốc độ, các người dùng React server-side render trong production thường than phiền rằng document có kích thước lớn render khá chậm.

Nên tôi rất vui khi thông báo rằng, sau một vài bài test đã cho thấy tốc độ khá cao trong server-side render của React 16, trải dài qua các phiên bản Node hác nhau:

Khi so sánh với React 15 với  process.env được compiled, khác biệt là khoảng 2.4 lần trong Node 4, khoảng 3 lần trong Node 6 và gấp 3.8 trong Node 8.4. Còn nếu so sánh khi không compile thì React 15 vẫn bị React 16 cho hửi khói trong mọi phiên bản Node khác nhau.

Vì sao React 16 SSR lại nhanh tới vậy? Bởi vì với React 15, server và client rendering có code tương tự nhau. Điều đó có nghĩa toàn bộ data structures cần phải duy trì một virtual DOM khi server rendering, cho dù rằng vDOM sẽ bị bỏ đi ngay khi giá trị được return sau khi đã call đến renderToString. Kết quả là có quá nhiều thứ bị phung phí trong server render.

Trong React 16 thì mọi chuyện hoàn toàn khác, nhờ vào core team đã viết lại hoàn toàn server renderer, và không còn dính dáng tới vDOM nữa. Nhờ đó mà nó sẽ trở nên nhanh hơn rất nhiều.

Một điều cần lưu ý rằng, mặc dù kết quả so sánh phía trên đã chứng tỏ rằng React 16 hoàn toàn là kẻ thống trị mọi mặc nhưng do những bài test đều nhắm tới từng tính năng một. Mặt khác, một app khi được sử dụng sẽ bao gồm những tính năng chạy cùng một lúc vì thế nên các bạn đừng trông mong rằng nó sẽ chạy nhanh tới gấp 3 lần như theo kết quả của bài test.

React 16 hỗ trợ streaming

React 16 giờ đã hỗ trợ render trực tiếp cho một Node stream.

Việc Render một stream có thể giúp giảm thiểu thời gian xử lí first byte (TTFB) cho nội dung của bạn, đồng thời gửi một phần của document vào cho browser ngay cả trước khi phần tiếp theo được tạo ra. Các browser sẽ parsing và rendering nội dung sớm hơn khi stream từ server theo cách này.

Ngoài ra còn có một tính năng tuyệt vời khác là backpressure. Nói cách khác, khi network bị backed up và không thể nhận thêm bytes, renderer sẽ nhận được tín hiệu và dừng rendering cho đến khi hết bị tắc nghẽn. Điều đó có nghĩa là server của bạn dùng ít memory và đáp ứng nhanh hơn tới I/O conditions.

Để sử dụng React 16’s render cho stream, bạn sẽ cần call 1 trong 2 phương pháp mới trên react-dom/server: renderToNodeStream or renderToStaticNodeStream, nhằm tương xứng với  renderToString và renderToStaticMarkup. Thay vì trả về một string, chúng sẽ return Readable, là một Node Stream class cho objects phát ra một stream của byte.

Khi bạn nhận lại  Readable stream từ renderTo(Static)NodeStream, nó sẽ ở trong paused mode, và chưa hề được render. Render sẽ chỉ bắt đầu khi bạn call  read, hoặc pipe  Readable đến một  Writable stream. Phần lớn các Node web frameworks có một object kế thừa từ  Writable, để bạn có thể pipe Readable dễ dàng hơn.

// using Express
import { renderToNodeStream } from "react-dom/server"
import MyPage from "./MyPage"
app.get("/", (req, res) => {
  res.write("<!DOCTYPE html><html><head><title>My Page</title></head><body>");
  res.write("<div id='content'>"); 
  const stream = renderToNodeStream(<MyPage/>);
  stream.pipe(res, { end: false });
  stream.on('end', () => {
    res.write("</div></body></html>");
    res.end();
  });
});

Streaming giờ đã có một vài Gotchas

Trong khi rendering một stream kể thể nói là một bước tiến cải thiện đáng kể, vẫn có một vài SSR pattern không tương thích tốt với streaming.

Thông thường thì bất cứ pattern nào sử dụng server render pass để tạo ra markup (cần phải add vào document trước khi SSR-ed thực hiện) thì đều không tương thích với streaming. Một số ví dụ bao gồm frameworks có chức năng xác định CSS nào nên cho vào page trong một  <style> tag, hoặc frameworks add các yếu tố vào document <head>  trong khi render. Nếu bạn dùng những framework này thì bạn sẽ phải dùng string rendering để stream.

Một pattern khác không tương thích tốt với React 16 là embedding calls đến renderToNodeStream vào cây component. Trong React 15, chúng ta thường dùng renderToStaticMarkup để tạo ra page template và embed calls đến renderToString để tạo ra những nội dung mạnh mẽ:

res.write("<!DOCTYPE html>");
res.write(renderToStaticMarkup(
  <html>
    <head>
      <title>My Page</title>
    </head>
    <body>
      <div id="content">
        { renderToString(<MyPage/>) }
      </div>
    </body>
  </html>);

Tuy nhiên nếu bạn thay những render call này thì streaming sẽ không thể chạy được bởi nó vẫn còn chưa thể cho một  Readable stream (được return từ  renderToNodeStream) được embedded như là một yếu tố thuộc component.

Nguồn: topdev.vn via Hackernoon

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

Phỏng vấn chuyên gia AdAsia – Xu hướng AdTech, đã đến lúc lập trình viên tham gia vào cuộc chơi quảng cáo

Phỏng vấn chuyên gia AdAsia - Xu hướng AdTech, đã đến lúc lập trình viên tham gia vào cuộc chơi quảng cáo

Ngành quảng cáo ngày càng phải đối mặt với nhiều thách thức, ngày càng khó để chiều lòng những khách hàng khó tính, đã đến lúc cần có những công cụ và quy trình mới thay thế, Advertising Technology (Ad Tech) là chìa khóa có thể giải quyết một loạt thách thức mà các nhà quảng cáo đang phải đối mặt. Giờ đây, đã đến lúc nhà quảng cáo nên “bắt tay” với lập trình viên để tối ưu hóa hiệu quả quảng cáo.

AdAsia Holdings, được đánh giá là một trong những công ty công nghệ tăng trưởng nhanh nhất châu Á. một công ty công nghệ tiên phong trong áp dụng nền tảng quảng cáo kỹ thuật số AdAsia Digital Platform,

Cùng lắng nghe những chia sẻ từ anh Eduard Feliu Baena – chuyên gia Machine Learning của AdAsisa trong buổi phỏng vấn với TopDev để có cái nhìn chính xác hơn về xu hướng Advertising Technology và những cơ hội mới mà đang mở ra cho cộng đồng lập trình viên.

1/ Được biết AdAsia Holdings được thành lập từ năm 2016, tuy chỉ là một khoảng thời gian ngắn, nhưng AdAsia cũng đã đạt được những cột mốc đáng nể. Anh Eduard có thể giới thiệu đôi nét về sứ mệnh của AdAsia Holdings là gì?

AdAsia Holdings hỗ trợ cho các nhà tiếp thị, nhà quảng cáo và nhà xuất bản những công cụ thông minh và sáng tạo để gia tăng lợi nhuận. Các giải pháp mà AdAsia Holdings đưa ra luôn gắn liền với công nghệ. Đồng thời, những giải pháp cũng được điều chỉnh để phù hợp với từng thị trường để đảm bảo chiến dịch quảng cáo phù hợp nhất với thị trường.

“Mang đến những giải pháp tiếp thị tân tiến nhất, được tích hợp trong một nền tảng thông minh và dễ sử dụng” chính là tôn chỉ hoạt động của AdAsia Holdings.

2/ Sau nhiều năm làm khởi nghiệp cho đến làm việc cho các công ty trên khắp thế giới, vì sao anh lại chọn Việt Nam là điểm dừng chân?

Trước đây, anh cùng 1 người bạn cũng làm Star- up, phát triển 1 ứng dụng tìm kiếm khách sạn. Sau 1 năm khi ứng dụng hoàn thành và đi vào hoạt động ổn định, và tới giờ vẫn hoạt động tốt, nhưng anh không còn làm trong dự án đó nữa. Sau đó anh chuyển sang làm Freelancer cho 1 công ty Tây Ban Nha có chi nhánh tại Việt Nam. Và giờ anh đang là machine learning engineer tại AdAsia. Việt Nam thật sự là một môi trường mới có rất nhiều thử thách đối với tôi. Và đây cũng là một sự khởi đầu mới cho mình.

3/ Sự khác biệt của AdAsia chính là áp dụng các công nghệ mới vào lĩnh vực Advertising (quảng cáo), anh có thể chia sẻ thêm về lĩnh vực này?

Áp dụng công nghệ mới vào lĩnh vực quảng cáo, hay còn gọi là Advertising Technology (Ad Tech) là tập hợp các giải pháp, nền tảng công nghệ phục vụ doanh nghiệp trong quá trình xây dựng chiến lược tiếp thị, quảng bá sản phẩm/ thương hiệu đến với khách hàng mục tiêu trên hàng loạt các kênh thông. Có thể hiểu đơn giản Ad Tech là việc tích hợp các tiến bộ khoa học công nghệ với các hoạt động quảng cáo.

Việc kết hợp giữa Advertising và Technology lại với nhau giúp chúng ta thu thập thông tin dễ dàng hơn cũng như phân tích chúng một cách nhanh chóng.

Cụ thể ở AdAsia Hoding là sử dụng trí tuệ nhân tạo là nhân tố chính trong các giải pháp truyền thông tiếp thị, nhằm đến khả năng thấu hiểu sâu sắc thông qua những phân tích mang tính dự đoán trên giao diện dễ sử dụng. Đây là một xu hướng mới, và dự báo sẽ là xu hướng tất yếu của quảng cáo hiện đại. Trí tuệ nhân tạo mà cụ thể hơn là Machine learning là công nghệ cốt lõi của xu hướng này.

4/ Anh có thể nói rõ về ứng dụng Machine Learning trong Advertising Technology.

Thực ra trong các hoạt động hằng ngày chúng ta được trợ giúp bởi các thuật toán machine learning: Các kết quả tìm kiếm trên web, quảng cáo theo thời gian thực trên các trang web và các thiết bị di động, phân tích tình cảm dựa trên văn bản, phát hiện xâm nhập mạng, nhận dạng qua pattern (mẫu) và hình ảnh, lọc bỏ các email spam,..

Ví dụ như ở AdAsia đang sử dụng những công nghệ như nhân diện các đặc điểm nhân khẩu học như: giới tính, tuổi tác, etc…Vì sao lại cần những thông tin này? Đó là những Insight rất quan trọng để hiểu khách hàng của mình là ai? họ có những thói quen sở thích như thế nào? Cuối cùng là để đáp ứng cao nhất nhu cầu của khách hàng.

Ngoài ra, Deep learning còn có thể nhận diện văn bản, câu cú, phiên dịch và còn nhiều cơ hội tiềm năng khác. Deep learning là một công cụ cực kì quan trọng nhưng hiện tại vẫn chưa được khai thác hết tiềm năng. Casting Asia ( một sản phẩm của AdAsia) là 1 ví dụ, khi người dùng gõ keyword tìm kiếm loại sản phẩm mà họ muốn như dầu gội, thì hệ thống sẽ từ động search và đưa ra những kết quả sản phẩm như sunsilk, clear,…. cũng như những campaign và những Influencer nào đã từng là đại diện cho nhãn hàng đó. Trong case này thì mình áp dụng công nghệ semantic search – có khả năng nhận diện và xử lí mặt chữ.

Khó khăn lớn nhất khi áp dụng AdTech là chuẩn hóa chất lượng Data. Hiện tại, AdAsia đang tạo ra một database platform để thu thập thông tin từ các trang mạng xã hội. Tuy nhiên, nguồn Data đó cũng chưa đủ đáp ứng được nhu cầu của công ty. Vì vậy, để có thể thu thập lượng data đủ lớn cần phải kết hợp tổng hợp rất nhiều kênh khác nhau chứ không chỉ đơn thuần dựa vào các kênh Social.

5/ Anh đánh giá như thế nào về tiềm năng phát triển của Advertising Technology trong thời gian tới

Theo dự báo năm 2017, chi tiêu dành cho IT của CMO sẽ vượt qua cả CIO. Tức là số tiền các doanh nghiệp đầu tư vào mảng IT trong lĩnh vực quảng cáo sẽ nhiều hơn đầu tư vào IT ở các lĩnh vực khác, Ad Tech đã vượt qua ngoài phạm vi là một trào lưu thông thường, mà đó là xu thế tất yếu của ngành quảng cáo hiện đại. Ngày càng có nhiều doanh nghiệp tìm đến các giả pháp Ad Tech nhằm cải thiện hiệu quả quảng cáo, cá nhân hóa các mối quan hệ giữa doanh nghiệp với khách hàng mục tiêu. Trong thời gian tới Ad Tech chính là tương lai của ngành quảng cáo.

6/ Để bắt đầu với công nghệ Machine Learning, theo anh lập trình viên cần nắm bắt những điểm cốt lõi nào?

Đối với những bạn muốn phát triển trong lĩnh vực Machine Learning thì anh khuyên các bạn nên bắt đầu từ những điều căn bản, nên dành thời gian để học hỏi, cập nhật các thông tin liên quan con đường mà các bạn lựa chọn. Rồi sau đó, tự làm các project và gửi các sản phẩm của mình đến các công ty chuyên về machine learning để học đánh giá và xem xét sản phẩm của bạn. Chính từ việc làm sản phẩm như vậy sẽ giúp các bạn có nhiều bài học thực tế hơn là chỉ học lý thuyết.

7/ Đối với các bạn lập trình viên muốn làm việc ở AdAsia, hoặc những công ty tương tự anh có lưu ý nào dành cho các bạn?

Nhiều bạn lập trình viên khá e ngại khi phải làm việc trong môi trường làm việc đa văn hóa như ở AdAsia. Nhưng anh nghĩ, làm việc ở môi trường đa văn hóa là cơ hội cho các bạn nhiều hơn là trở ngại. Vì việc bạn đến từ đâu không quan trọng, Developer nào cũng có những điểm yếu và điểm mạnh của mình, và  AdAsia luôn tạo những điều kiện thuận lợi nhất để các bạn có cơ hội phát triển kỹ năng của mình. Anh đánh giá rất cao những bạn có kỹ năng lập trình và đặc biệt là có tư duy về toán học và hiểu biết về máy tính.

Hiện tại Adasia đang rất cần lập trình viên Angular, UX design developer bởi team đang cần phát triển mạnh hơn trên đa nền tảng đặc biệt là web. Nên nếu các bạn lập trình viên tự tin, muốn thử sức ở một môi trường làm việc đa văn hóa, năng động, và có cơ hội được làm việc với các chuyên gia nước ngoài, thì đừng ngần ngại Apply vào AdAssia.

Cảm ơn anh đã tham gia phỏng vấn của TopDev!

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

Nên dành bao nhiêu thời gian để tìm kiếm 1 công việc phù hợp

Các nhà cố vấn nghề nghiệp thường được hỏi rằng người đang tìm việc cần dành ra khoảng bao nhiêu thời gian mỗi ngày để tìm được một công việc thích hợp. Việc này còn tùy thuộc vào hoàn cảnh sống và mục tiêu của bạn trong công việc, nhưng dưới đây là một bản kế hoạch mà bạn có thể sử dụng để tham khảo và quyết định lượng thời gian bạn nên dành ra để tìm kiếm một công việc.

Có một ranh giới rất nhỏ giữa việc dành không đủ thời gian và dành quá nhiều thời gian để tìm việc dẫn tới bị căng thẳng.

Nếu bạn không dành đủ thời gian, bạn sẽ không có được khởi đầu thuận lợi.

Còn nếu bạn dành quá nhiều thời gian cho nó, có thể bạn sẽ bị kiệt sức.

Bao nhiêu thời gian là đủ để tìm kiếm một công việc?

Ai cũng có thể mạnh miệng hô hào: Phải dành toàn bộ thời gian trong ngày để tìm việc, tuy nhiên trên thực tế bỏ ra 40 giờ mỗi tuần cho hoạt động này là một việc vượt ngoài khả năng xử lý của mỗi người.

Một mục tiêu hợp lí hơn là 25 giờ mỗi tuần, đối với những người không làm việc như một nhân viên thời vụ hoặc thực tập. Còn đối với những người làm ở vị trí đó, 15 giờ mỗi tuần là một sự phân bổ thời gian hợp lí.

Làm thế nào để phân chia khoảng thời gian của bạn

Bạn có thể phân chia 25 giờ tìm kiếm việc làm thành một bảng như sau:

  • 5 giờ mỗi tuần bạn nên dành cho việc sáng tạo và chỉnh sửa các tài liệu dùng để liên lạc khi tìm kiếm công việc, bao gồm: sơ yếu lí lịch, thư xin việc, thư theo dõi và email.
  • 3 giờ mỗi tuần bạn nên dành cho việc tìm kiếm và gửi hồ sơ tới những công việc được đăng trên các nguồn trực tuyến bao gồm các trang web việc làm và trang web về nhà tuyển dụng.
  • 3 giờ mỗi tuần bạn nên dành để xem xét vị trí của các đơn vị bạn nhắm đến trong ngành, và mức độ yêu thích của bạn đối với nó để đạt được các yêu cầu về triển vọng của công việc. Thời gian này sẽ bao gồm việc hoàn thành nốt bản sơ yếu lí lịch trực tuyến và nhập hồ sơ vào cơ sở dữ liệu của nhà tuyển dụng.
  • 3 giờ mỗi tuần để tham gia vào các cuộc phỏng vấn. Việc tham dự các hội chợ việc làm cũng nằm trong khoảng thời gian này. Khoảng thời gian này có thể sẽ kéo dài rất nhiều từ tuần này sang tuần khác, phụ thuộc vào số lượng cuộc phỏng vấn mà bạn nhận được.
  • 11 giờ mỗi tuần được dành cho các hoạt động trên mạng khác.

“Lợi dụng” tối đa các mối quan hệ để tìm kiếm công việc

Vì mạng lưới quan hệ rõ ràng là chiến lược hiệu quả nhất nhưng lại thường ít nhận được sự hiểu biết nhất đối với hầu hết những người kiếm việc, cho nên cần chứng minh rằng các hoạt động ấy luôn đem lại lợi ích.

Dưới đây là một ví dụ về hoạt động mạng lưới, để bạn có thể xem xét cho vào lịch trình tìm kiếm việc làm hàng tuần của mình.

  • Phỏng vấn thông tin: Hỏi phòng công tác ở trường đại học của bạn hoặc văn phòng cựu sinh viên về danh sách các cựu sinh viên làm việc cho các công ty, xí nghiệp hoặc trong các lĩnh vực và ví trí mà bạn ưa thích. Tiếp cận càng nhiều cựu sinh viên càng tốt và cố gắng thực hiện các cuộc phỏng vấn thông tin để tìm hiểu nhiều hơn về lĩnh vực họ đang làm cũng như nhận được lời khuyên cho quá trình tìm việc của bạn.
  • Job Shadowing (là Dự khán công việc, một trong những cách đào tạo nhân viên bằng cách quan sát và học theo): Nếu bạn có một mối quan hệ “tâm đầu ý hợp” với bất kì một cựu sinh viên nào, hãy hỏi họ xem liệu bạn có thể “bám chân” họ cả một ngày hoặc thậm chí hai ngày khi họ đang làm việc để có được thêm những hiểu biết cụ thể về công việc của họ không.
  • Sự kiện mạng lưới mà bạn tham gia: Hãy tìm hiểu sự nghiệp của chính bạn cũng như của văn phòng cựu sinh viên về bất kì sự kiện mạng lưới hay sự kiện xã hội nào trong lĩnh vực và vị trí mà bạn yêu thích như là một cách để tiếp cận thêm với các cựu sinh viên.
  • Sử dụng Linkedln: Tạo và nâng cấp một hồ sơ Linkedln và tham gia vào các nhóm của trường đại học của bạn cũng như các nhóm về các lĩnh vực nghề nghiệp bạn yêu thích. Liên hệ với các thành viên trong nhóm để được tư vấn và tạo thêm các cuộc tham vấn thông tin.
  • Sử dụng mạng lưới mối quan hệ cá nhân của bạn: gợi ý sự hỗ trợ từ phía gia đình và bạn bè. Tạo “thông tin quảng cáo” về bản thân trong đó có hình ảnh mới nhất kèm theo kinh nghiệm làm việc, trình độ chuyên môn, thông qua các thành viên trong gia đình và bạn bè xem họ có “mối” nào phù hợp với sở thích của bạn hay có gợi ý/lời khuyên nào theo mong muốn tìm việc của bạn không. Và nói rằng bạn sẽ liên hệ với các địa chỉ liên lạc mà họ đã để lại để sắp xếp một cuộc phỏng vấn thông tin. Hãy gửi email và “thông tin quảng cáo cho tất cả mọi người trong danh sách để bạn có thể mở rộng mối quan hệ với những người bạn của họ.
  • Hỏi bạn bè của bạn: Xem lại tất cả danh sách bạn bè trên Facebook và tiếp cận với bất kì ai đang làm việc cho một công ty hoặc một ngành nào đó thú vị. Hỏi xem bạn có thể đến thăm công ty của họ và có một buổi phỏng vấn thông tin nhỏ không, và liệu họ có thể giới thiệu bạn với những người đồng nghiệp có tầm ảnh hưởng đến vòng phỏng vấn không.
  • Kiếm được thêm một số tiền và có thêm những mối quan hệ mới: Nếu bạn cần làm việc để kiếm thêm thu nhập trong khi đang tìm kiếm một công việc chính thì hãy xem xét các vị trí cho bạn cơ hội giao tiếp với cộng đồng nhiều hơn như là nhân viên khách sạn hoặc phục vụ quầy bar.

Khi bạn cung cấp một dịch vụ tuyệt vời và phát triển được mối quan hệ với khách hàng, hãy cho họ biết thêm về mong muốn lớn nhất của bạn một cách bình thường (không tỏ ra quá tham vọng). Bạn có thể ngạc nhiên với số thẻ kinh doanh và thư giới thiệu mà bạn sẽ nhận được đấy.

Ngay cả với một danh sách dài các việc cần làm khi đi tìm một công việc tiềm năng, bạn sẽ vẫn có nhiều thời gian để vui chơi và giao lưu, 25 giờ chỉ chiếm 22% số giờ tỉnh táo của bạn. Một cuộc sống cân bằng sẽ giúp bạn duy trì được năng lượng cần thiết cho một chiến dịch tìm việc làm phù hợp.

Nguồn: Applancer Careers via career.vn

Vì sao chúng ta lại phải làm việc?

Tiền bạc là một trong những yếu tố cơ bản thúc đẩy chúng ta phải làm việc, phải lao động. Nhưng chỉ vì tiền không thì chưa đủ, làm việc đem lại cho chúng ta nhiều hơn thế. Khi ai đó biết lý do tại sao mình phải làm việc, đương nhiên sẽ cảm thấy cuộc sống của mình rõ ràng và tận tâm với những gì mình đang làm hơn.

1) Làm việc để học tập và phát triển

Các công ty có kế hoạch đào tạo, nâng cao kỹ năng làm việc cho nhân sự nói chung, sẽ có những nhân viên tích cực và tạo ra hiệu quả công việc cao hơn. Nâng cao kỹ năng làm việc của nhân viên sẽ đem lại lợi ích cho cá nhân và cả tập thể.

Vừa làm việc, vừa có thêm kiến thức để phát triển bản thân luôn là mục tiêu lớn của người lao động. Ngoài việc kiếm tiền để duy trì cuộc sống, mọi cá nhân đều mong muốn được phát triển thêm con người và tiến xa hơn cả về trình độ và địa vị.

2) Làm việc để thăng tiến

Khoảng 42% phụ nữ và 58% nam giới được khảo sát cho biết, họ cảm thấy có động lực phấn đấu và cống hiến cho công việc nhiều hơn nếu nhìn ra cơ hội thăng tiến trong sự nghiệp. Nhiều người rời bỏ công việc vì mong muốn được đối mặt với thách thức và rèn luyện kỹ năng của bản thân nhiều hơn. 48% người lao động nhảy việc vì “không có cơ hội thăng tiến” trong công việc.

Tạo động lực làm việc cho người lao động là ý nghĩa chính của những giải thưởng, bằng khen do tổ chức cấp. Nó gián tiếp thúc đẩy khát khao vươn lên, khẳng định bản thân của người lao động thông qua hiệu quả làm việc.

3) Được đánh giá đúng, đánh giá cao để làm việc hăng say hơn

Sự công nhận có thể được thể hiện dưới nhiều dạng khác nhau, tùy thuộc vào mỗi tổ chức và cách quản lý người lao động. Một số người hào hứng với việc được tuyên dương trước đám đông như nhận bằng khen, giải thưởng; một số muốn được nhận lời khen trực tiếp từ sếp, kín đáo nhưng sâu sắc.

Người đi làm chắc chắc sẽ có động lực cống hiến nhiều hơn nữa khi công sức của họ được ghi nhận xứng đáng.

4) Làm việc gia tăng quyền tự chủ và trách nhiệm với bản thân và xã hội

Một điều quan trọng khi đi làm là chúng ta biết được vị trí của bản thân trong tập thể và cảm nhận được giá trị của bản thân. Khi được giao nhiệm vụ quan trọng và có ý nghĩa, bạn sẽ tự cảm thấy mối liên hệ với xã hội, trách nhiệm của bản thân và có kế hoạch để thực hiện nhiệm vụ tốt nhất.

Đối với một tổ chức, khi cá nhân có thể tự chủ công việc, thoải mái đề xuất ý kiến mà không ngại bị bỏ qua hay để ý, họ sẽ có cảm giác gắn bó và trở thành một phần của tổ chức. Công việc lúc này không chỉ là vì kiếm sống mà còn trở thành một phần của cuộc sống.

Một số doanh nghiệp như Microsoft thực hiện chính sách giờ giấc linh động. Các nhân viên có thể tự do lựa chọn giờ làm việc, miễn là hiệu quả làm việc cao. Rõ ràng, chính sách này cho phép các nhân viên làm việc thoải mái hơn, nhưng cũng khiến họ phải có trách nhiệm để có thể sử dụng thời gian linh động nhưng vẫn nâng cao hiệu quả công việc.

5) Cùng làm việc để tạo ra môi trường lý tưởng

Môi trường làm việc mà mọi người đều thích và cảm thấy hứng khởi sẽ luôn khiến các nhân viên có động lực làm việc. Bạn có muốn làm việc nhiều hơn không nếu chôn chân ở một văn phòng u ám, buồn tẻ?

Một văn phòng nghiêm túc nhưng vẫn thoải mái, những đồng nghiệp thân thiện cho bạn cảm giác thân thuộc. Tới làm việc ở một nơi như vậy chẳng phải ai cũng muốn cố gắng sao?

Nguồn: Applancer Careers via Life Advancer

Cách học mới cực nhanh dành cho các developer

Là một developer, tôi luôn phải phải học và tìm hiểu những kiến thức và tool mới

Quá trình học này thường bắt đầu khi tôi code và khi bị “mắc kẹt”.

Vào những lúc như vậy tôi thường lên Google và tìm kiếm thông tin. Thường là nó sẽ dẫn đến một page của Stack Overflow như dưới đây:

Và khi đang trong buổi ăn trưa, tôi hay nghe đám bạn nói về functional programming.

“À…” – Tôi nghĩ – ”Mình chỉ mới học về object-oriented programming nên thật là xấu hổ nếu bọn nó biết là mình chả hiểu gì về cái functional programming kia”

Thế nên tôi bật laptop lên – “functional programming là cái gì thế?” – Tôi hỏi Google.

Ôi trời! – Chữ nhiều kinh khủng! Nào là link trích dẫn, các từ hàn lâm bác học cao siêu. Tôi còn nghĩ nó không chỉ có tiếng anh mà còn dùng nhiều thứ ngôn ngữ “ngoài hành tinh” khác nữa.

Tôi chỉ cần một bài viết đơn giản, đủ để giải thích functional programming là cái quái gì?

Trân trọng giới thiệu với bạn – freeCodeCamp Guide – Bài hướng dẫn đủ đơn giản cho những con người bận rộn như bạn

Chính vì muốn có được những bài viết thật đơn giản mà lại hữu ích, freeCodeCamp Guide đã ra đời.

Nó được tạo ra để giúp cung cấp mọi thông tin cần thiết, bao phủ mọi lĩnh vực trong phát triển software.

Các bài viết đủ đơn giản để cho ngay cả những bạn không rành về tiếng anh vẫn có thể hiểu. Ngoài ra, chúng cũng ngắn gọn để cho những người đọc bận rộn vẫn có thể tiếp thu thông tin một cách đầy đủ.

Hiện tại freeCodeCamp Guide đã có tới 3000 bài viết. Bao gồm cả những tài liệu vốn không nằm trong freeCodeCamp phát triển web, như SQL:

Và Python:

Với search engine, chúng tôi dùng open source Elasticsearch tool vốn rất mạnh mẽ. Nó không chỉ tìm kiếm các bài viết trong freeCodeCamp Guide  mà còn thông qua:

  • Hàng trăm tương tác từ các thử thách của freeCodeCamp coding
  • Hàng trăm freeCodeCamp YouTube videos
  • Hàng ngàn bài viết từ freeCodeCamp Medium

Project này hoàn toàn miễn phí và open source. Vì thế nếu bạn muốn đóng góp cho một cộng đồng thì freeCodeCamp là một lựa chọn không hề tệ.

Làm cách nào để đóng góp – Bằng cách cải thiện freeCodeCamp Guide

Bạn có thể đóng góp cho freeCodeCamp Guide trực tiếp thông qua GitHub trên trình duyệt web của mình. Không cần thiết phải trải qua quá trình cloning GitHub repository tới máy của mình, cài đặt packages, cũng như tìm hiểu codebase.

Thay vào đó, bạn sẽ chỉ cần chọn một topic mà mình thích và viết về nó thôi.

Bởi có đến hàng ngàn topc và sub-topic. Đa phần chúng đều theo Wikipedia-style “stubs” và vẫn còn khá thô sơ. Bạn có thể bắt đầu từ đó.

Sau đây là một gif nhỏ chỉ bạn cách thực hiện chúng:

Các bước bao gồm:

  1. Vào guide folders và chọn chọn một topic mà bạn muốn viết
  2. Mở folder’s index.md file bằng cách click 2 lần vào nó
  3. Click vào icon hình cây viết ở phía trên bên phải để edit
  4. Thay đổi nội dung tùy theo ý bạn
  5. Scroll xuống dưới và viết trong commit message, chỉ rõ bạn đã thay đổi những gì.
  6. Nhớ rằng nút “Create a new branch for this commit and start a pull request” đã được chọn.
  7. Bấm “Commit Changes.”
  8. Trên trang tiếp theo, chọn “Create Pull Request.”

Chúng tôi sau đó sẽ chạy vài bài test để đảm bảo rằng những thay đổi của bạn sẽ không làm hỏng bất cứ thứ gì. Sau đó một thành viên trong team sẽ trực tiếp ghi và gửi feedback lại cho bạn. Cuối cùng pull request của bạn sẽ được merge.

Đóng góp của bạn sẽ được hiển thị bởi freeCodeCamp Guide và hàng triệu người sẽ dùng và trích nguồn của bạn trong những project của họ.

Chúng tôi đã tạo ra freeCodeCamp Guide như thế nào?

Bằng những tool như:

  • React và Redux
  • Gatsby.js — một tool cho việc tạo ra static websites for creating fast static websites
  • Elasticsearch —  chuyên dành cho full-text search
  • Netlify —  static website hosting tool với hiệu năng cực kì cao

Cùng với những cá nhân đã đóng góp công sức của mình vào freeCodeCamp Guide:

freeCodeCamp Guide vẫn còn trong giai đoạn phát triển. Nếu bạn bắt gặp phải bất cứ bug hoặc có ý tưởng giúp freeCodeCamp Guide cải thiện thì hãy tạo một Github issue. Chúng tôi sẽ lập tức xem xét.

Nguồn: topdev.vn via medium.freecodecamp.org

Việt Nam là một trong những nước hàng đầu của thị trường dịch vụ đám mây tại Đông Nam Á

Theo dự đoán của các chuyên gia, năm 2018 tiếp tục sẽ là 1 năm bận rộn với những làn sóng công nghệ mới kết hợp cùng các nền tảng kĩ thuật Web ‘bất biến” từ trước đến nay.  Tiêu biểu có thể kể đến như: trí thông minh nhân tạo (AI), dữ liệu lớn (Big Data), Internet vạn vật (IoT), thực tế ảo – thực tế tăng cường (AR, VR)… cùng hàng loạt những ứng dụng có tính thực tiễn cao.

  • Các dịch vụ vận chuyển ứng dụng AI kết hợp thiết bị IoT để theo dõi, tối ưu đường đi và chi phí di chuyển của phương tiện
  • Web thương mại điện tử dùng Machine Learning để biết gợi ý đúng nhu cầu tiếp theo của khách hàng
  • Thanh toán online dùng AI để phát hiện và cảnh báo giao dịch có dấu hiệu gian lận
  • Chatbot thông minh với AI để chăm sóc khách hàng tự động
  • Mạng quảng cáo dùng Big Data kết hợp Machine Learning để hiển thị quảng cáo đúng nhu cầu

Trong bối cảnh những ứng dụng công nghệ mới đang ngày càng có sức ảnh hưởng mạnh mẽ như vậy, các dịch vụ đám mây cũng “tiến hóa” rất nhanh để đáp ứng nhu cầu tăng cao của doanh nghiệp như AWS Kinesis, AWS Machine Learning, Microsoft Azure hay Google Cloud AI.


Khả năng chuyên môn, bảo mật, kinh phí là 3 thách thức khi chuyển lên đám mây mà các doanh nghiệp đang đối mặt

Theo Waterford Technologies, cho dù là đang chuyển đổi cơ sở hạ tầng từ hệ thống truyền thống sang điện toán đám mây, triển khai phần mềm qua mạng hay đơn giản là sử dụng các dịch vụ đám mây để lưu trữ và sao lưu dữ liệu (Amazon S3), thậm chí đưa toàn bộ sản phẩm dịch vụ của mình lên đám mây, các công ty đang ngày quan tâm đến việc nghiên cứu và cân nhắc phương thức áp dụng điện toán đám mây hiệu quả nhất cho hoạt động kinh doanh.


Dấu ấn rõ nét của Amazon Web Services với 57% tổng thị trường Cloud

“Các kỹ thuật tiên tiến hơn đã sáng tạo vượt qua các thuật toán dựa trên nguyên tắc truyền thống để tạo ra hệ thống có khả năng hiểu, học hỏi, dự đoán, thích ứng và hoạt động độc lập tốt hơn trước.” – công ty nghiên cứu thị trường Gartner nhận xét về sự phát triển của các công nghệ mới.

AI/Machine Learning, Big Data đang thực sự đi vào các dịch vụ trên Web của doanh nghiệp Việt

Theo những thống kê gần đây nhất của TopDev.vn, có đến 80% startup công nghệ đang dần áp dụng AI/Machine Learning, Bigdata và đặc biệt là các công nghệ trên đám mây để tăng sự hiệu quả của hệ thống đến mức tối đa nhất trong thời gian nhanh nhất để không lãng phí chi phí cơ hội. Hơn bao giờ hết, để tránh tốn quá nhiều thời gian tự phát triển và thích ứng nhanh với thị trường, việc sử dụng các dịch vụ đám mây sẵn có sẽ là xu hướng buộc doanh nghiệp Việt chuyển mình nhanh hơn nhằm nắm bắt các đợt sóng công nghệ cao trong kỷ nguyên 4.0.

Dựa vào số liệu nhân sự ngành IT, chiến lược tuyển dụng của các công ty công nghệ tại Việt Nam, số liệu từ Hiệp hội Thương mại điện tử Việt Nam (VECOM) và số liệu cung cấp từ các dịch vụ đám mây, ông Nguyễn Ngọc Dũng – phó chủ tịch VECOM cho biết, Việt Nam hiện đang được xếp là một trong những nước hàng đầu (Tier 1) cho thị trường đám mây tại Đông Nam Á. Đây chắc chắn là một tín hiệu đáng mừng cho việc đẩy mạnh phát triển phân khúc này trong năm 2018.

Bên cạnh đó, số liệu Quý 2/2017 của TopDev khảo sát trên 5500 ứng viên IT cả nước cùng hơn 150 nhà tuyển dụng đã cho thấy: Cloud Computing nằm trong 6 xu hướng công nghệ nóng nhất mà các lập trình Web không thể bỏ qua. Thậm chí với các lập trình viên có nhiều năm kinh nghiệm liên quan đến Cloud Computing, Big Data hay AI luôn được nhà tuyển dụng săn đón với mức lương cạnh tranh, dao động từ $1000 – $1500 tùy theo năng lực và vị trí đảm nhận.

Vietnam Web Summit – Sự trở lại được mong đợi

Sau thành công lớn của mùa đầu tiên, chuỗi sự kiện Vietnam Web Summit được tổ chức bởi TopDev và Hiệp hội Thương mại điện tử Việt Nam (VECOM) đã chính thức trở lại. Đây là một diễn đàn được giới chuyên môn đánh giá cao bởi sự quy tụ đầy đủ những xu hướng công nghệ mới nhất có thể giúp các doanh nghiệp lẫn các lập trình viên tìm ra giải pháp tốt nhất cho hoạt động kinh doanh và công việc của mình.

Sự kiện sẽ diễn ra tại Tp.HCM (01/12) & Hà Nội (08/12), với nội dung trải dài từ AI, Machine Learning, Web, Cloud, Payment và E-commerce cùng sự góp mặt của các đối tác lớn là công ty tập đoàn tại Việt Nam & trên thế giới như Amazon Web Service (AWS), Lazada, Google, Facebook, Nielsen, Zalo Ads, FPT Telecom, Appota…. Với quy mô đó, Vietnam Web Summit 2017 dự đoán sẽ thu hút sự quan tâm của hơn 9.000 lượt khách tham dự, gần 400 doanh nghiệp cùng hơn 100 chuyên gia kinh nghiệm, hứa hẹn đem đến những số liệu, kiến thức, kĩ năng bổ ích cho các cá nhân, tổ chức lớn nhỏ đang hoạt động trong lĩnh vực công nghệ tại Việt Nam.


Vietnam Web Summit dự kiến thu hút trên 9,000 lượt khách tham dự

THỜI GIAN & ĐỊA ĐIỂM DIỄN RA SỰ KIỆN

  • Hồ Chí Minh: 01/12/2017 tại Grand Palace, 142/18 Cộng Hòa, P.4, Q. Tân Bình, Tp.HCM
  • Hà Nội: 08/12/2017 tại Trung tâm Hội nghị Forevermark, 614 Lạc Long Quân, Q. Tây Hồ, Hà Nội

THÔNG TIN CHI TIẾT VỀ SỰ KIỆN

  • Website: https://vietnamwebsummit.com/
  • Fanpage chính thức: https://www.facebook.com/Vietnamwebsummit/

Để đăng ký tham dự chương trình Vietnam Web Summit vui lòng để lại thông tin tại đây.

Về các hạng mục hợp tác tại sự kiện:

Mr. Lê Đặng Hiếu

  • Mobile:  0121 764 2405
  • Email: hieuld@applancer.net

Tổng quát về sự kiện:

BTC

  • Điện thoại: 84-8 62645022 | 84-8 62733496 | 84-8 62733497
  • Email: event@applancer.net

Sử dụng Machine Learning trên Compute Engine để recommend sản phẩm (phần 2)

Phần 1

Cung cấp các recommendations

Để làm cho kết quả của người dùng nhanh chóng và dễ dàng, bạn cần phải tải chúng vào cơ sở dữ liệu có thể được truy vấn theo yêu cầu. Một lần nữa, Cloud SQL là một lựa chọn tuyệt vời ở đây. Từ Spark 1.4, bạn có thể ghi các kết quả của dự đoán trực tiếp vào cơ sở dữ liệu từ PySpark.

Lược đồ của bảng Recommendation như sau:

CREATE TABLE Recommendation
(
  userId varchar(255),
  accoId varchar(255),
  prediction float,
  PRIMARY KEY(userId, accoId),
  FOREIGN KEY (accoId)
    REFERENCES Accommodation(id)
);

Code walkthrough

Phần này sẽ code để train các mô hình.

Lấy dữ liệu từ Cloud SQL


Spark SQL cho phép bạn dễ dàng kết nối với một Cloud SQL instance qua kết nối JDBC. Dữ liệu được tải là ở định dạng  DataFrame

https://github.com/GoogleCloudPlatform/spark-recommendation-engine/blob/master/pyspark/app_collaborative.py

jdbcUrl    = 'jdbc:mysql://%s:3306/%s?user=%s&password=%s' % (CLOUDSQL_INSTANCE_IP, CLOUDSQL_DB_NAME, CLOUDSQL_USER, CLOUDSQL_PWD)
dfAccos = sqlContext.read.jdbc(url=jdbcUrl, table=TABLE_ITEMS)
dfRates = sqlContext.read.jdbc(url=jdbcUrl, table=TABLE_RATINGS)

Chuyển đổi DataFrame sang RDD và tạo ra các bộ dữ liệu khác nhau

Spark sử dụng một khái niệm được gọi là RDD (Resilient Distributed Dataset), tạo điều kiện thuận lợi cho việc làm việc với các elements song song. RDDs là bộ sưu tập chỉ đọc được tạo từ bộ nhớ lưu trữ liên tục. Chúng có thể được xử lý trong bộ nhớ, vì vậy chúng rất thích hợp cho quá trình xử lý lặp.

Để có được mô hình tốt nhất cho dự đoán của bạn, bạn cần chia các bộ dữ liệu của mình thành ba bộ khác nhau. Đoạn mã sau sử dụng một chức năng trợ giúp ngẫu nhiên phân chia các giá trị không chồng chéo trên cơ sở tỷ lệ phần trăm 60/20/20:

https://github.com/GoogleCloudPlatform/spark-recommendation-engine/blob/master/pyspark/app_collaborative.py

rddTraining, rddValidating, rddTesting = dfRates.rdd.randomSplit([6,2,2])

Lưu ý: Điều quan trọng là tạo bảng Rating với các cột theo thứ tự sau: accoId, userId, rating. ALS cần làm việc với các cặp sản phẩm-người dùng xác định để dự đoán. Bạn có thể sửa đổi cơ sở dữ liệu của mình hoặc sử dụng call tới map trên RDD để sắp xếp các cột đúng cách.

Train các mô hình dựa trên các thông số khác nhau


Khi sử dụng phương pháp ALS, hệ thống cần phải làm việc với các thông số xếp hạng, định chuẩn, và lặp lại để tìm ra mô hình tốt nhất. Các xếp hạng tồn tại, vì vậy các kết quả của train phải được so sánh với bộ xác nhận. Bạn muốn đảm bảo rằng xu hướng của người dùng cũng nằm trong tập huấn luyện.

https://github.com/GoogleCloudPlatform/spark-recommendation-engine/blob/master/pyspark/find_model_collaborative.py

for cRank, cRegul, cIter in itertools.product(ranks, reguls, iters):

  model = ALS.train(rddTraining, cRank, cIter, float(cRegul))
  dist = howFarAreWe(model, rddValidating, nbValidating)
  if dist < finalDist:
    print("Best so far:%f" % dist)
    finalModel = model
    finalRank  = cRank
    finalRegul = cRegul
    finalIter  = cIter
    finalDist  = dist

Lưu ý: Hàm howFarAreWe sử dụng mô hình dự đoán xếp hạng trên tập dữ liệu xác thực, chỉ sử dụng các cặp sản phẩm – người dùng.

https://github.com/GoogleCloudPlatform/spark-recommendation-engine/blob/master/pyspark/find_model_collaborative.py

def howFarAreWe(model, against, sizeAgainst):
  # Ignore the rating column  
  againstNoRatings = against.map(lambda x: (int(x[0]), int(x[1])) )

  # Keep the rating to compare against
  againstWiRatings = against.map(lambda x: ((int(x[0]),int(x[1])), int(x[2])) )

  # Make a prediction and map it for later comparison
  # The map has to be ((user,product), rating) not ((product,user), rating)
  predictions = model.predictAll(againstNoRatings).map(lambda p: ( (p[0],p[1]), p[2]) )

  # Returns the pairs (prediction, rating)
  predictionsAndRatings = predictions.join(againstWiRatings).values()

  # Returns the variance
  return sqrt(predictionsAndRatings.map(lambda s: (s[0] - s[1]) ** 2).reduce(add) / float(sizeAgainst))

Tính các dự đoán hàng đầu cho người dùng


Bây giờ bạn có một mô hình có thể đưa ra một dự đoán hợp lý, bạn có thể sử dụng nó để xem những gì người dùng có thể quan tâm nhất dựa trên sở thích và xếp loại của họ bởi những người khác có cùng sở thích. Trong bước này, bạn có thể thấy bản đồ ma trận đã được mô tả trước đó.

https://github.com/GoogleCloudPlatform/spark-recommendation-engine/blob/master/pyspark/app_collaborative.py

# Build our model with the best found values
# Rating, Rank, Iteration, Regulation
model = ALS.train(rddTraining, BEST_RANK, BEST_ITERATION, BEST_REGULATION)

# Calculate all predictions
predictions = model.predictAll(pairsPotential).map(lambda p: (str(p[0]), str(p[1]), float(p[2])))

# Take the top 5 ones
topPredictions = predictions.takeOrdered(5, key=lambda x: -x[2])
print(topPredictions)

schema = StructType([StructField("userId", StringType(), True), StructField("accoId", StringType(), True), StructField("prediction", FloatType(), True)])

dfToSave = sqlContext.createDataFrame(topPredictions, schema)
dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode='overwrite')

Lưu các dự đoán hàng đầu


Bây giờ bạn có một danh sách tất cả các dự đoán, bạn có thể lưu top 10 trong Cloud SQL để hệ thống có thể đưa ra một số đề xuất cho người dùng. Ví dụ, thời điểm tốt để sử dụng những dự đoán này có thể là khi người dùng đăng nhập vào trang web.

https://github.com/GoogleCloudPlatform/spark-recommendation-engine/blob/master/pyspark/app_collaborative.py

dfToSave = sqlContext.createDataFrame(topPredictions, schema)
dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode='overwrite')

Thực hiện các giải pháp


Để chạy giải pháp này, hãy làm theo hướng dẫn từng bước trên trang GitHub. Làm theo hướng dẫn, bạn sẽ có thể tính toán và hiển thị các đề xuất cho người dùng.

Mã SQL cuối cùng lấy yêu cầu hàng đầu từ cơ sở dữ liệu và hiển thị nó trên trang chào mừng của Samantha.

Truy vấn, khi chạy trong Cloud Platform Console mây hoặc MySQL khách, trả về kết quả tương tự như ví dụ sau:

Trong trang web, cùng một truy vấn có thể nâng cao trang chào mừng và tăng khả năng chuyển đổi khách truy cập cho khách hàng:

Giám sát công việc

Giám sát với thiết lập bdutil

Bạn đã sử dụng SSH để kết nối với ví dụ chính. Khi bạn bắt đầu điều hành công việc, điều quan trọng là có thể giám sát họ. Spark cung cấp một giao diện điều khiển quản lý mà bạn có thể sử dụng trong trình duyệt.

Console chạy theo mặc định trên cổng  8080, bạn phải mở trong tường lửa cho từng trường hợp bằng cách làm theo các bước này. Bạn có thể mở giao diện điều khiển bằng cách sử dụng IP external của instance trong URL: http://1.2.3.4:8080, ví dụ. Trong ảnh chụp màn hình sau, bạn có thể thấy hai worker được liệt kê, các ứng dụng đang chạy và những ứng dụng đã hoàn thành, Spark được dùng trong trường hợp này.

The Spark console shows two worker instances
The Spark console

Theo dõi với Cloud Dataproc

Xem tài liệu Cloud Dataproc để tìm hiểu thêm về output hoặc web interfaces.

Tutorial

Toàn bộ nội dung tutorial, gồm các hướng dẫn setup và source code trên GitHub.

Các bước tiếp theo

  • Hãy thử các tính năng khác của Google Cloud Platform cho chính bạn. Hãy xem hướng dẫn của chúng tôi.
  • Tìm hiểu cách sử dụng các sản phẩm của Google Cloud Platform để xây dựng giải pháp end-to-end

Phụ lục

Cross filtering

Mặc dù bạn đã thấy cách xây dựng giải pháp collaborative filter hiệu quả và có thể mở rộng, vượt qua các kết quả với các loại lọc khác có thể cải thiện đề xuất. Nhớ lại hai loại lọc chính khác: dựa vào  content-based và clustering. Một sự kết hợp của những cách tiếp cận này có thể tạo ra một khuyến cáo tốt hơn cho người sử dụng.

Content-based filtering

Lọc dựa trên nội dung hoạt động trực tiếp với các thuộc tính và hiểu được những điểm tương đồng của chúng, giúp tạo ra các đề xuất cho các mục có cùng thuộc tính nhưng có ít xếp hạng của người dùng. Khi cơ sở người dùng phát triển, loại lọc này vẫn có thể quản lý được, ngay cả với một số lượng lớn người dùng.

Để thêm lọc dựa trên nội dung, bạn có thể sử dụng xếp hạng trước đó của người dùng khác cho các mục trong danh mục. Dựa trên các xếp hạng này, bạn có thể tìm thấy những sản phẩm tương tự nhất với sản phẩm hiện tại.

Một cách phổ biến để tính sự giống nhau giữa hai sản phẩm là sử dụng sự giống nhau giữa cô sin và tìm những tính chất gần nhất:

Kết quả tương tự sẽ là từ 0 đến 1. Gần đến 1, các sản phẩm càng giống nhau.

Trong ma trận này, sự tương tự giữa P1 và P2 có thể được tính như sau:

Bạn có thể lọc được dựa trên nội dung thông qua các công cụ khác nhau. Nếu bạn muốn tìm hiểu thêm, hãy xem:

  • Twitter tất cả các cặp giống nhau. Chức năng CosineSimilarities Scala được thêm vào MLlib có thể được chạy trong môi trường Spark.
  • Mahout. Nếu bạn muốn truy cập vào nhiều thư viện để bổ sung hoặc thay thế một số thuật toán MLlib, bạn có thể cài đặt Mahout vào thiết lập  bdutil. Bạn có thể thêm Mahout vào thiết lập hiện tại bằng cách nhân bản dự án GitHub:
git clone https://github.com/apache/mahout.git mahout

export MAHOUT_HOME=/path/to/mahout
export MAHOUT_LOCAL=false #For cluster operation
export SPARK_HOME=/path/to/spark
export MASTER=spark://hadoop-m:7077 #Found in Spark console

Clustering

Điều quan trọng là phải hiểu bối cảnh duyệt web và những gì người dùng đang xem xét. Cùng một người duyệt web ở những thời điểm khác nhau có thể quan tâm đến hai sản phẩm hoàn toàn khác nhau hoặc thậm chí có thể mua một món quà cho người khác. Có thể hiểu những mặt hàng tương tự như mặt hàng hiện đang trưng bày là cần thiết. Sử dụng cụm K-mean cho phép hệ thống đưa các vật phẩm tương tự vào các thùng dựa trên các thuộc tính cốt lõi của chúng.

Ví dụ, đối với giải pháp này, một người đang tìm kiếm để thuê một ngôi nhà ở London có thể không quan tâm đến việc cho thuê một cái gì đó ở Auckland, do đó, hệ thống nên lọc ra các trường hợp đó khi thực hiện khuyến nghị.

from pyspark.mllib.clustering import KMeans, KMeansModel
clusters = KMeans.train(parsedData, 2,
                        maxIterations=10,
                        runs=10,
                        initializationMode="random")

Chế độ xem 360 độ

Bạn có thể cải thiện đề xuất thêm bằng cách lấy dữ liệu khách hàng khác như các đơn đặt hàng, hỗ trợ và các thuộc tính cá nhân như tuổi tác, vị trí hoặc giới tính. Những thuộc tính này thường có sẵn trong hệ thống quản lý quan hệ khách hàng (CRM) hoặc hệ thống hoạch định nguồn lực doanh nghiệp (ERP) sẽ giúp thu hẹp các lựa chọn.

Suy nghĩ nhiều hơn, không chỉ là dữ liệu hệ thống nội bộ sẽ có tác động đến hành vi và lựa chọn của người dùng; các yếu tố bên ngoài cũng quan trọng. Trong trường hợp cho thuê kỳ nghỉ của giải pháp này, việc có thể biết được chất lượng không khí có thể rất quan trọng đối với một gia đình trẻ. Vì vậy, tích hợp công cụ đề xuất được xây dựng trên Cloud Platform với API khác, chẳng hạn như Breezometer, có thể mang lại lợi thế cạnh tranh.

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

Nguồn: topdev.vn via cloud.google.com

12 đặc điểm của 1 công ty đáng mơ ước

Không có gì tệ hơn khi bạn phải làm việc cho một công ty có văn hóa không lành mạnh. Tiền lương hay số ngày nghỉ phép từ công ty, dù có nhiều đến đâu chăng nữa, cũng không thể bù đắp lại sự căng thẳng mệt mỏi mà bạn phải đối mặt hằng ngày tại nơi làm việc. Việc bạn tiếp tục làm cho công ty như thế là không đáng chút nào.

Trái lại, không gì tuyệt vời hơn khi bạn làm việc cho một công ty với một nền tảng văn hóa thật tuyệt vời. Mỗi sáng thức dậy bạn chỉ muốn nhanh chóng đến nơi làm việc và hoàn thành thật tốt công việc cùng những người đồng nghiệp bạn yêu quý.

Nếu công ty bạn có 12 dấu hiệu dưới đây thì đó là một công ty rất đáng mơ ước:

1. Ứng viên luôn mơ ước gia nhập công ty

Lý do chính không phải lúc nào cũng là vì lương cao hơn mặt bằng chung trên thị trường. Nhiều trường hợp lương thấp hơn nhưng nếu ứng viên đã tìm hiểu về văn hóa công ty thì họ sẽ vẫn lựa chọn gia nhập công ty.

2.Tỉ lệ nghỉ việc thấp

Bạn nên nhìn vào tỉ lệ nghỉ việc của nhân viên cấp thấp và cấp trung, vì các cấp cao hơn luôn trụ khá lâu nhờ lương cao và vị trí hiếm khi thay đổi. Nếu như bạn biết được mọi người đều đã gắn bó dài hạn cùng công ty nhờ chế độ đãi ngộ tốt, có thể bạn đã chọn đúng công ty rồi đấy.

3. Sếp này không lo sợ khi sếp khác thành công

Ngược lại, họ đều động viên nhau để thành công nhiều hơn nữa.

4. Không chấp nhận việc nói xấu sau lưng

Bất kể ở cấp độ nào, công ty đều cần phải loại bỏ việc nói xấu sau lưng và thay vào đó là cách khuyến khích nhân viên trực tiếp đối diện vấn đề với nhau.

5. Quản lý những đồng nghiệp cùng cấp bậc

Quản lý nhân viên dưới quyền bạn thường dễ dàng hơn so với quản lý những người mà bạn không có thẩm quyền quản lý. Một công ty tốt luôn có những nhân viên cùng cấp động viên nhau làm việc và sửa chữa lỗi sai của nhau khi cần thiết.

6. Nhân viên luôn được tiếp năng lượng để đạt sứ mệnh đề ra

Bạn đều nghe lãnh đạo các cấp thường xuyên nhắc về sứ mệnh của công ty. Điều này sẽ giúp họ tập trung vào việc lãnh đạo nhân viên hoàn thành sứ mệnh đề ra.

7. Không chỉ gắn bó vì công việc

Mọi người đi xem phim, tụ tập ở nhà đồng nghiệp, và đôi khi đi du lịch cùng nhau. Điều này không có nghĩa là nhân viên công ty không có những người bạn khác, mà chỉ là vì đồng nghiệp đóng vai trò quan trọng không kém và họ cảm thấy vui khi gắn bó cùng nhau ngoài giờ làm việc.

8. Nhân viên tin rằng mọi người đều quan trọng hơn nhiệm vụ đặt ra

Mọi người đi làm không chỉ để hoàn thành công việc. Ngoài nhiệm vụ được phân công, nhân viên là những người đóng góp to lớn vào văn hóa và những giá trị về giao tế trong công ty. Ngay cả trong lúc công ty gặp khó khăn nên chậm trả lương hoặc chế độ đãi ngộ bị sút giảm, tinh thần của nhân viên vẫn không thay đổi.

9. Luôn vui vẻ

Đi dọc theo các khu vực làm việc và bạn có thể thấy mọi người cười nói, trao đổi và tận hưởng công việc cùng nhau thật hiệu quả với sự tập trung cao độ.

10. Không có chỗ cho nỗi sợ hãi

Mọi người đều không sợ khi vô tình nói sai điều gì. Không có những cuộc nói chuyện diễn ra lén lút. Nhân viên của một công ty tốt lúc nào cũng có thể trao đổi thẳng thắn với sếp về những vấn đề họ lo lắng hoặc quan tâm trong công việc.

11. Liên tục chia sẻ thông tin

Mọi người ở các cấp đều trao đổi và chia sẻ thông tin với nhau. Nhân viên không ngạc nhiên khi họ không hề biết gì cho đến khi nhìn thấy rơi giới thiệu về sản phẩm hoặc khi thông tin xuất hiện trên báo chí. Những thông tin này phải được lan truyền nội bộ và cấp lãnh đạo có thể thăm dò ý kiến nhân viên để đưa ra nhiều giải pháp tốt hơn.

12. Sự thay đổi luôn được chào đón

Nhân viên không sợ thay đổi. Không phải ai cũng thích thay đổi, nhưng hầu như ai cũng đã trải qua nhiều lần trong quá trình làm việc và ban lãnh đạo công ty quản lý những thay đổi cùng sự tận tâm và thái độ chững chạc nên mọi người sẽ cảm thấy không sợ nữa.

Những dấu hiệu này có thể làm bạn thất vọng nếu bạn không làm tại một công ty có văn hóa lành mạnh. Tuy nhiên, bạn có thể là người tạo ra những thay đổi tích cực cho văn hóa công ty mình từ những điều nhỏ nhất và từ chính những con người quyết tâm nhất.

Người đi làm đều muốn yêu thích công việc của mình và hầu như không ai muốn làm việc trong một môi trường tiêu cực. Có thể đồng nghiệp của bạn chưa quen với những đề xuất thay đổi của bạn, nhưng sự yêu thương và những điều tích cực lúc nào cũng sẽ chiếm được ưu thế trong lòng nhân viên.

Nguồn: Applancer Careers

Bắt đầu từ con số không với Ruby?

“Ruby có ngoại hình đơn giản, nhưng có tâm hồn rất phức tạp giống như con người chúng ta vậy.” – Matz, cha đẻ của ngôn ngữ lập trình Ruby.

Vì sao bạn nên học Ruby?

Đối với tôi, Ruby là một ngôn ngữ đẹp. Bạn sẽ thấy việc viết code trong Ruby rất mượt mà và tự nhiên.

Mặt khác, một trong những nguyên nhân khiến cho Ruby nổi tiếng nằm ở Rails: một framework được dùng bởi Twitter, Basecamp, Airbnb, Github, và nhiều công ty khác.

Nguồn gốc

Ruby là một ngôn ngữ lập trình open source vô cùng mạnh mẽ với sự đơn giản mà hiệu quả. Với các cú pháp đầy thanh lịch giúp cho việc đọc và viết vô cùng dễ dàng.

Hãy bắt đầu với nền tảng của Ruby

Tham khảo thêm các vị trí tuyển dụng Ruby lương hấp dẫn trên TopDev

Variables

Bạn có thể hiểu đơn giản rằng một variable là một từ chứa một giá trị. Đơn giản thế thôi.

Trong Ruby, rất dễ để ta define một variable và cho nó một giá trị. Giả sử bạn muốn cho giá trị là 1 vào một variable với tên gọi cũng là một.

one = 1

Quá dễ đúng không?

two = 2
some_number = 10000

Bạn có thể cho bất kì giá trì gì mình muốn cho variable mà bạn thích. Trong ví dụ trên, variable tên là two chứa giá trị 2 và variable tên là  some_number có giá trị 10,000.

Ngoài integers, ta còn có thể dùng booleans (true/false), strings, symbols, float, và các dạng data types khác.

# booleans
true_boolean = true
false_boolean = false

# string
my_name = "Leandro Tk"

# symbol
a_symbol = :my_symbol

# float
book_price = 15.80

Conditional Statements: Điều khiển Flow

Conditional statements sẽ có nhiệm vụ xem xét tính true/false của một statement. Nếu kết quả là True (Đúng), thì nội dung bên trong sẽ được xử lí.

if true
  puts "Hello Ruby If"
end

if 2 > 1
  puts "2 is greater than 1"
end

Bởi vì 2 lớn hơn 1 nên dòng chữ “2 is greater than 1” sẽ được hiện ra.

Else statement sẽ được thực hiện khi ta gặp kết quả False(Sai):

if 1 > 2
  puts "1 is greater than 2"
elsif 2 > 1
  puts "1 is not greater than 2"
else
  puts "1 is equal to 2"
end

Bởi 1 không lớn hơn 2, nên code trong Else statement sẽ được xử lí.

Ngoài ra thì bạn cũng có thể dùng tới elsif statement, vốn kết hợp cả 2 loại trên:

if 1 > 2
  puts "1 is greater than 2"
elsif 2 > 1
  puts "1 is not greater than 2"
else
  puts "1 is equal to 2"
end

Tôi thì lại thích dùng if statement  sau khi code đã được thực hiện:

def hey_ho?
  true
end

puts "let’s go" if hey_ho?

Nhìn rất đẹp mà lại ngắn gọn. Đó là thế mạnh của Ruby.

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

Looping/Iterator

Trong Ruby, chúng ta có thể iterate bằng nhiều hình thức khác nhau: while, for và each.

Vòng lặp While: Miễn là kết quả của statement vẫn là true, nội dung code nằm trong statement sẽ luôn được thực hiện. Như vậy, Code sẽ in và hiển thị từ số 1 tới 10 trong ví dụ dưới đây:

num = 1

while num <= 10
  puts num
  num += 1
end

Vòng lặp For: Với Statement được cho ra, nội dung code sẽ được thực hiện cho đến khi thõa mãn yêu cầu của statement đó.

for num in 1...10
  puts num
end

Each iterator: Với bất kì array của giá trị, nó sẽ iterate  từng giá trị một.

[1, 2, 3, 4, 5].each do |num|
  puts num
end

Điểm khác biết giữa For và Each là Each thực hiện chính xác từng giá trị được cho trong khi For sẽ xuất hiện những giá trị không mong muốn nằm ngoài yêu cầu.

# for vs each

# for looping
for num in 1...5
  puts num
end

puts num # => 5

# each iterator
[1, 2, 3, 4, 5].each do |num|
  puts num
end

puts num # => undefined local variable or method `n' for main:Object (NameError)

Array: Collection/List/Data Structure

Giả sử như bạn muốn lưu integer 1  vào một variable. Nhưng giờ thì bạn muốn lưu 2, và rùi 3,4,5….

Vậy có cách nào để có thể lưu những integers mà bạn muốn mà không phải cứ làm cách thủ công như vậy. Ruby sẽ cung cấp giải pháp cho bạn.

Array là một collection dùng để lưu trữ một list các values.

my_integers = [1, 2, 3, 4, 5]

Rất là đơn giản, chúng ta tạo ra một array và lưu nó vào my_integer.

Bạn sẽ tự hỏi rằng “làm cách nào để lấy giá trị từ array đó?”. Trong Arrays có một khái niệm gọi là Index. Bắt đầu với index 0 và cứ thể tăng dần lên.

Sử dụng cú pháp Ruby, nó rất đơn giản để hiểu:

my_integers = [5, 7, 1, 3, 4]
print my_integers[0] # 5
print my_integers[1] # 7
print my_integers[4] # 4

Giờ nếu bạn muốn lưu strings thay vì integers, đại loại như list tên họ hàng của bạn chẳng hạn:

relatives_names = [
  "Toshiaki",
  "Juliana",
  "Yuji",
  "Bruno",
  "Kaio"
]

print relatives_names[4] # Kaio

Không có gì khác ngoài trừ giờ ta dùng chữ thay cho số.

Giờ khi nói về array data structure, ta ám chỉ việc đụng tới các giá trị trong array đó.

Phương pháp thường thấy dùng để thêm giá trị vào array là push và <<.

Push cực kì đơn giản, như ví dụ sau đây:

bookshelf = []
bookshelf.push("The Effective Engineer")
bookshelf.push("The 4 hours work week")
print bookshelf[0] # The Effective Engineer
print bookshelf[1] # The 4 hours work week

Phương pháp << thì có chút khác biệt với:

bookshelf = []
bookshelf << "Lean Startup"
bookshelf << "Zero to One"
print bookshelf[0] # Lean Startup
print bookshelf[1] # Zero to One

Bạn có thể thấy sự khác biệt nằm ở dấu chấm. Có thể nói:

bookshelf << "Hooked"

Cũng chính là

bookshelf.<<("Hooked")

Ruby thật là tuyệt đúng không?

Giờ hãy nói thêm về một loại Data Structure khác.

Hash: Key-Value Data Structure/Dictionary Collection

Chúng ta đều đã biết arrays thực chất chính là array với số. Thế nhưng nếu chúng ta dùng số thứ tự thì sao? Một số data structures có thể dùng số, string, hoặc các dạng type khác. Hash data structure là một trong số đó.

Hash là một collection các cặp key-value:

hash_example = {
  "key1" => "value1",
  "key2" => "value2",
  "key3" => "value3"
}

Trong đó, Key sẽ ám chỉ index của value. Vậy để truy cấp vào value của Hash thì ta sẽ thông qua Key.

Sau đây là một hash về tôi với Key là họ tên, nickname, sắc tộc:

hash_tk = {
  "name" => "Leandro",
  "nickname" => "Tk",
  "nationality" => "Brazilian"
}

print "My name is #{hash_tk["name"]}" # My name is Leandro
print "But you can call me #{hash_tk["nickname"]}" # But you can call me Tk
print "And by the way I'm #{hash_tk["nationality"]}" # And by the way I'm Brazilian

Trong ví dụ trên, tôi cho in ra mọi thông tin về mình.

Một điều khá tuyệt của hash là chúng ta có thể dùng bất cứ thứ gì làm value. Tôi sẽ thêm key “age” và số tuổi của mình là 24 vào value.

hash_tk = {
  "name" => "Leandro",
  "nickname" => "Tk",
  "nationality" => "Brazilian",
  "age" => 24
}

print "My name is #{hash_tk["name"]}" # My name is Leandro
print "But you can call me #{hash_tk["nickname"]}" # But you can call me Tk
print "And by the way I'm #{hash_tk["age"]} and #{hash_tk["nationality"]}" # And by the way I'm 24 and Brazilian

Giờ chúng ta sẽ thêm các nhân tố khác vào một hash. Key dẫn tới value chính là đặc điểm làm nên Hash nên việc thêm vào cũng sẽ theo qui luật như vậy.

hash_tk = {
  "name" => "Leandro",
  "nickname" => "Tk",
  "nationality" => "Brazilian"  
}

hash_tk["age"] = 24
print hash_tk # { "name" => "Leandro", "nickname" => "Tk", "nationality" => "Brazilian", "age" => 24 }

Bạn có thấy việc thêm một giá trị vào hash rất đơn giản đúng không?

Iteration: Vòng lặp thông qua Data Structures

Array iteration thật sự rất đơn giản. Ruby developer thường dùng each iterator:

bookshelf = [
  "The Effective Engineer",
  "The 4 hours work week",
  "Zero to One",
  "Lean Startup",
  "Hooked"
]

bookshelf.each do |book|
  puts book
end

Each iterator ở trên hoạt động bằng cách đi qua từng yếu tố trong array như là một thông số. Trong ví dụ trên, chúng ta sẽ in ra từng yếu tố đó.

Với hash data structure, ta cũng có thể dùng each iterator để đi qua 2 thông số trong cùng một block: key và value.

hash = { "some_key" => "some_value" }
hash.each { |key, value| puts "#{key}: #{value}" } # some_key: some_value

Ta sẽ đặt tên cho hai tham số này là key và value cho khỏi bị nhầm lẫn.

hash_tk = {
  "name" => "Leandro",
  "nickname" => "Tk",
  "nationality" => "Brazilian",
  "age" => 24
}

hash_tk.each do |attribute, value|
  puts "#{attribute}: #{value}"
end

Classes & Objects

Là một ngôn ngữ lập trình object oriented, Ruby dùng class và object.

“Class” là một cách để define objects. Ví dụ như xe ô tô có nhiều loại.

“Objects” có 2 đặc điểm: data và behavior. Ví dụ như ô tô có data về số bánh xe, chiều dài cũng như behavior với khả năng tăng tốc và phanh.

Trong lập trình object oriented, ta gọi data là “attributes”  và behavior là “methods.”

Ruby Object Oriented Programming Mode: On

Sau đây là một cú pháp trong Ruby cho Class:

class Vehicle
end

Ta define Vehicle với class statement và kết thúc bằng end.

Objects chính là đại diện cho class. Ta tạo ra instance bằng phương pháp .new

vehicle = Vehicle.new

Tại đây, vehicle là object (hay instance)  của class: Vehicle

vehicle class có 4 attributes: bánh xe, loại thùng tank, số ghế và vận tốc.

class Vehicle
  def initialize(number_of_wheels, type_of_tank, seating_capacity, maximum_velocity)
    @number_of_wheels = number_of_wheels
    @type_of_tank = type_of_tank
    @seating_capacity = seating_capacity
    @maximum_velocity = maximum_velocity
  end
end

Chúng ta đã sử dụng phương pháp initialize (khởi tạo). Với tên gọi khác là constructor bởi khi bạn tạo ra vehicle object, đồng thời ta cũng sẽ define các attributes của nó luôn.

Giả sử bạn rất thích chiếc Tesla Model S và muốn tạo một object như vậy. Bao gồm 4 bánh, là xe điện, 5 chỗ và chạy được với vận tốc tối đa là 250km/hour (155 mph).

tesla_model_s = Vehicle.new(4, 'electric', 5, 250)

4 wheels + electric tank + 5 seats + 250km/hour maximum speed = tesla_model_s.

tesla_model_s
# => <Vehicle:0x0055d516903a08 @number_of_wheels=4, @type_of_tank="electric", @seating_capacity=5, @maximum_velocity=250>

Vậy là ta đã set up lên Tesla’s attributes. Nhưng truy cập vào bằng cách nào?

Tất nhiên là bằng cách gửi tin tới object để hỏi về chúng.

class Vehicle
  def initialize(number_of_wheels, type_of_tank, seating_capacity, maximum_velocity)
    @number_of_wheels = number_of_wheels
    @type_of_tank = type_of_tank
    @seating_capacity = seating_capacity
    @maximum_velocity = maximum_velocity
  end

  def number_of_wheels
    @number_of_wheels
  end

  def set_number_of_wheels=(number)
    @number_of_wheels = number
  end
end

Trong ví dụ trên, ta dùng hai cách number_of_wheels và set_number_of_wheels. Hay còn được biết tới là getter and setter. Đầu tiên là ta lấy một giá trị với `get`, thứ hai ta có thể đặt ra một giá trị với set.

Trong Ruby, ta có thể dùng những phương pháp trên với attr_reader, attr_writer và attr_accessor.

  • attr_reader: áp dụng phương pháp getter
class Vehicle
  attr_reader :number_of_wheels

  def initialize(number_of_wheels, type_of_tank, seating_capacity, maximum_velocity)
    @number_of_wheels = number_of_wheels
    @type_of_tank = type_of_tank
    @seating_capacity = seating_capacity
    @maximum_velocity = maximum_velocity
  end
end

tesla_model_s = Vehicle.new(4, 'electric', 5, 250)
tesla_model_s.number_of_wheels # => 4
  • attr_writer: áp dụng phương pháp setter
class Vehicle
  attr_writer :number_of_wheels

  def initialize(number_of_wheels, type_of_tank, seating_capacity, maximum_velocity)
    @number_of_wheels = number_of_wheels
    @type_of_tank = type_of_tank
    @seating_capacity = seating_capacity
    @maximum_velocity = maximum_velocity
  end
end

# number_of_wheels equals 4
tesla_model_s = Vehicle.new(4, 'electric', 5, 250)
tesla_model_s # => <Vehicle:0x0055644f55b820 @number_of_wheels=4, @type_of_tank="electric", @seating_capacity=5, @maximum_velocity=250>

# number_of_wheels equals 3
tesla_model_s.number_of_wheels = 3
tesla_model_s # => <Vehicle:0x0055644f55b820 @number_of_wheels=3, @type_of_tank="electric", @seating_capacity=5, @maximum_velocity=250>
  • attr_accessor: áp dụng cả 2 phương pháp trên
class Vehicle
  attr_accessor :number_of_wheels

  def initialize(number_of_wheels, type_of_tank, seating_capacity, maximum_velocity)
    @number_of_wheels = number_of_wheels
    @type_of_tank = type_of_tank
    @seating_capacity = seating_capacity
    @maximum_velocity = maximum_velocity
  end
end

# number_of_wheels equals 4
tesla_model_s = Vehicle.new(4, 'electric', 5, 250)
tesla_model_s.number_of_wheels # => 4

# number_of_wheels equals 3
tesla_model_s.number_of_wheels = 3
tesla_model_s.number_of_wheels # => 3

Ngoài ra ta còn có những phương pháp khác như “make_noise” method

class Vehicle
  def initialize(number_of_wheels, type_of_tank, seating_capacity, maximum_velocity)
    @number_of_wheels = number_of_wheels
    @type_of_tank = type_of_tank
    @seating_capacity = seating_capacity
    @maximum_velocity = maximum_velocity
  end

  def make_noise
    "VRRRRUUUUM"
  end
end

Khi ta call thì nó sẽ return với một string là “VRRRRUUUUM”.

v = Vehicle.new(4, 'gasoline', 5, 180)
v.make_noise # => "VRRRRUUUUM"

Encapsulation: Cất giấu thông tin

Encapsulation là cách giới hạn việc truy cập trực tiếp vào objects’ data đồng thời tạo điều kiện cho hoạt động cho data.

Nói cách khác những thông tin bên trong sẽ được giấu kín.

Như vậy, trong Ruby, ta sẽ dùng một phương pháp để truy cập dữ liệu trực tiếp:

class Person
  def initialize(name, age)
    @name = name
    @age  = age
  end
end

Như vậy, ta đã áp dụng Person class.

tk = Person.new("Leandro Tk", 24)

Vậy thì để truy cập được nhưng thông tin này thì phải làm sao? call name và age method?

tk.name
> NoMethodError: undefined method `name' for #<Person:0x0055a750f4c520 @name="Leandro Tk", @age=24>

Rõ ràng là không được. Đó là bởi chúng ta phải dùng phương thức truy cập trực tiếp như sau:

class Person
  def initialize(name, age)
    @name = name
    @age  = age
  end
  
  def name
    @name
  end
  
  def age
    @age
  end
end

Inheritance: behaviors và characteristics

Một số các objects  đều có những điểm chung với nhau: Behavior và characteristics.

Hãy thử tưởng tượng một chiếc xe với những attributes như số bánh xe, vận tốc tối đa, etc…

class Car
  attr_accessor :number_of_wheels, :seating_capacity, :maximum_velocity

  def initialize(number_of_wheels, seating_capacity, maximum_velocity)
    @number_of_wheels = number_of_wheels
    @seating_capacity = seating_capacity
    @maximum_velocity = maximum_velocity
  end
end

Car class đã được implement 🙂

my_car = Car.new(4, 5, 250)
my_car.number_of_wheels # 4
my_car.seating_capacity # 5
my_car.maximum_velocity # 250

Trong Ruby, chúng ta dùng < operator để chỉ định rằng một class được thừa kế từ class khác. Một ElectricCar class sẽ thừa kế từ Car class.

class ElectricCar < Car
end

Đơn giản vậy đấy, ta không cần dùng thêm phương pháp nào bởi class này đã có sẵn thông tin được thừa kế từ Car.

tesla_model_s = ElectricCar.new(4, 5, 250)
tesla_model_s.number_of_wheels # 4
tesla_model_s.seating_capacity # 5
tesla_model_s.maximum_velocity # 250

Module: Một Toolbox

Chúng ta có thể xem module như một toolbox chứa đựng một set các constants và phương pháp.

Một ví dụ của Ruby module là Math.

Math::PI # > 3.141592653589793

Và phương pháp .sqrt:

Math.sqrt(9) # 3.0

Chúng ta cũng có thể áp dụng module của mình và dùng nó trong class. Ta có một RunnerAthlete class:

class RunnerAthlete
  def initialize(name)
    @name = name
  end
end

Và áp dụng module Skill vào để có average_speed

module Skill
  def average_speed
    puts "My average speed is 20mph"
  end
end

Vậy làm sao để thêm module vào cho classes để nó có được tính cách trên (average_speed)? Bạn cứ đơn giản là ghi thẳng vào luôn!

class RunnerAthlete
  include Skill

  def initialize(name)
    @name = name
  end
end

Bạn có thể thấy phần “include Skill”! Giờ thì bạn đã có thể xài phương pháp này trong instance của RunnerAthlete class.

mohamed = RunnerAthlete.new("Mohamed Farah")
mohamed.average_speed # "My average speed is 20mph"

Tuy vậy bạn cần phải nhớ những điều sau:

  • module có thể không có instances
  • module có thể không có subclass
  • module được define bằng module

Nguồn: blog.topdev.vn via medium

Xem tin tuyển dụng IT lương cao tren TopDev

Là Freelance Developer, bạn nên “định giá” bản thân như thế nào?

Đã được hơn 6 năm kể từ khi tôi bắt đầu sự nghiệp làm freelancer với vị trí full-stack developer tại Tokyo. Trong những năm gần đây, tôi chỉ dành khoảng 30% thời gian của mình làm cho các công ty công nghệ, 70% còn lại tập trung vào các project riêng của chính tôi như Inkdrop nhưng vẫn có nguồn thu nhập tốt. Để có được điều này hoàn toàn nhờ vào giá trị mà những project mang lại.

Tôi thường làm việc với các start-up. Bắt đầu bằng buổi họp gặp mặt để giải thích những gì tôi có thể làm giúp họ. Lĩnh vực mà tôi có thể làm được trải dài từ designing UI, building front-end, back-end, mobile apps, operating databases, data analytics, etc. Sau khi đã thống nhất vị trí cũng như task đặt ra tôi sẽ thương thuyết về giá tiền cho dịch vụ của mình.

Phần lớn các freelancer hay ra giá theo giờ bởi bớt đi việc phải thương lượng cũng như tiết kiệm thời gian và công sức cho cả 2 bên. Nhưng nếu bạn là một freelancer đầy kinh nghiệm thì đây không phải là một cách hay bởi bạn đang mất đi một cơ hội tăng thêm nguồn thu nhập. Bởi chúng ta không phải là những lao động phổ thông, vì thế nên cái giá của bạn nên tùy thuộc vào giá trị của chính project đó, thay vì chỉ đơn giản là trả theo giờ. Nhờ đó mà bạn cũng sẽ cảm thấy nhẹ nhàng hơn khi thời gian biểu của mình dư dả, cũng như nó khuyến khích việc ta hoàn thành project thật nhanh và hiệu quả. Nhờ đó mà cả hai bên đều được lợi.

Nhưng làm cách nào để ra giá cho đúng? Thật đáng tiếc là không có một công thức, luật hay bất cứ cách hoàn hảo nào cho trường hợp này. Tuy vậy, vẫn sẽ có những tiêu chuẩn đặc biệt mà bạn cần để tâm tới khi thương lương với client.

Tin vào bản thân mình

Sau khi hiểu được yêu cầu của khách hàng, bạn cần cân nhắc nhiệm vụ của mình là gì với 4 tiêu chí là hiệu quả, tính cấp bách, lĩnh vực đòi hỏi cũng như năng suất. Nhưng bạn cũng nên có cho riêng mình một mức giá mà bạn muốn client trả cho bạn.

Sự tự tin của bạn ảnh hưởng rất lớn tới việc ra giá. Bạn càng không vững chắc thì giá sẽ càng hạ bởi bạn cho rằng mình không đủ khả năng. Bạn cần có kinh nghiệm với thành công nhằm có thể củng cố được sự tự tin của mình và có khả năng ra giá đúng theo mức mình muốn mà client vẫn chấp nhận được.

Hãy biết rõ giá thị trường

Bạn đã có một giá mà mình muốn, nhưng cũng phải biết cả giá cả của thị trường nhằm có được cái nhìn khách quan. Đừng chỉ dựa vào lương của nhân viên bởi nó không bao gồm các chi phí như điện, laptop, văn phòng. Bởi freelancer phải trả cả những thứ đó nên bạn cũng nên tính nó vào trong giá của mình.

Một cách khác là dựa theo giá được đưa ra từ những freelancer khác. Nhưng bạn nên cẩn thận bởi tùy theo vị trí địa lí cũng như khả năng mà sẽ có sự khác biệt.

Thế là giờ bạn đã có thể đưa ra một cái giá chung chung rồi đấy

Xác định mức giá cụ thể

Có 4 tiêu chí sẽ giúp bạn có thể đưa ra một cái giá phù hợp cho cả 2 bên.

Criteria #1 — Năng suất

Thật là vô lí nếu bạn tính giá theo giờ khi có thể hoàn thành một task nhanh gấp mấy lần người khác. Hơn nữa, nếu bạn là một chuyên gia và hiểu rõ mình cần làm gì thì việc mất công giao tiếp cũng không còn là vấn đề.

Criteria #2 — Tính cấp bách

Nếu bạn được yêu cầu phải hoàn thành task thật nhanh, bạn có quyền tăng giá. Tuy vậy, nó thường không an toàn bởi bạn có thể sẽ không có đủ thời gian để hoàn thành nó. Do đó bạn chỉ nên chấp nhận chúng khi cực kì tin tưởng vào khả năng của mình

Criteria #3 — Lĩnh vực

Có rất nhiều người có khả năng tạo ra WordPress websites nên những yêu cầu cho công việc trên thường có độ khó thấp và giá deal cũng sẽ thấp. Trong khi đó những task như tạo ra một image recognition system hay recommendation system sẽ đòi hỏi những kĩ năng chuyên sâu. Đây là lúc mà bạn có cơ hôi để tăng giá. Nó không quan trọng việc bạn thấy nó đơn giản thế nào, nếu không nhiều người có thể làm được như bạn thì giá sẽ càng tăng.

Criteria #4 — Hiệu quả

Tùy vào tay nghề của mỗi developer mà kết quả thu được sẽ khác nhau cho dù khởi đầu là như nhau cũng như cùng một yêu cầu. Bạn càng thỏa mãn được client thì giá bạn đưa ra sẽ càng dễ được chấp nhận cũng như hình ảnh của bạn càng tốt trong mắt của khách hàng.

Đừng bao giờ tự bán rẻ công sức mình

Như bạn đã thấy, 4 tiêu chí trên không phải là công thức giúp bạn có thể tính ra mức giá chính xác nhưng nó như là kim chỉ phương giúp bạn có thể đưa ra một mức giá thích hợp.

Việc hạ giá thấp cũng được xem là một chiến thuật nhưng đừng bao giờ bán rẻ sức lao động của mình. Nó sẽ chỉ khiến bạn vừa không có động lực mà kết quả cho ra cũng sẽ tệ hơn bình thường. Nếu như client bị hạn hẹp về tài chính, bạn có thể khuyên họ bỏ bớt một vài yêu cầu.

Cuộc thương lượng có thể diễn ra sau nhiều lần trao đổi nhưng điều quan trọng nhất là client hiểu và chấp nhận mức giá của bạn.

Một cách khác để giúp tăng mức giá của bạn là hãy để địa chỉ freelancer của mình ở bên California. Nó sẽ giúp ích rất nhiều cho bạn đấy.

Nguồn: Hackernoon

Thiết kế Mobile first – là gì vì sao phải quan tâm?

Mobile first là gì?

Khi nhắc đến Mobile First có hai vấn đề cơ bản cần được đề cập tách biệt: triết lý thiết kế và thao tác kỹ thuật. Tuy nhiên khi cụm từ Mobile Responsive xuất hiện lại gây ra một sự khó hiểu.

Xét về triết lý thiết kế, từ lâu các nhà thiết kế thường phát triển màn hình từ lớn nhất rồi mới đến nhỏ nhất, nghĩa là thiết kế đầu tiên – thiết kế “chính” – sẽ cho chế độ xem toàn màn hình lớn nhất và nhiều chức năng nhất.

Việc dành sự ưu tiên hàng đầu cho những người sử dụng laptop và desktop này có một nhược điểm rất lớn, bởi nghiên cứu cho thấy rằng có tới 25% người dùng ở Mỹ chỉ dùng điện thoại. Tại các khu vực khác trên thế giới, chẳng hạn như vùng nông thôn Trung Quốc, việc chỉ sử dụng điện thoại để kết nối mạng có thể chiếm đến 45% số người dùng (dựa theo báo cáo năm 2013 của On Device Research).

Rất nhiều tiện ích và chức năng cho cái nhìn và tính năng hoàn hảo trên laptop và desktop không thể chuyển đổi thành một giao diện mobile đem lại cho người dùng những trải nghiệm hoàn hảo. Trong trường hợp xấu nhất, chúng có thể khiến cho cả site không thể, hoặc cực kỳ khó để sử dụng và điều hướng.

Triết lý Mobile First giúp chúng ta khắc phục vấn đề này ngay từ đầu. Điều này không có nghĩa là bạn chỉ tập trung vào mỗi giao diện mobile, mà bạn bắt đầu từ thiết kế mobile với sự cân nhắc về các quy định và ràng buộc của giao diện này, và từ đó phát triển thành các màn hình lớn hơn. Khi đó, chúng ta phải xác định những thông tin cần thiết và phù hợp nhất cho một giao diện nhỏ, và ẩn hoặc loại trừ những tiện ích không cần thiết.

Ví dụ, khi nhận được một email quảng cáo giảm giá trong kỳ nghỉ lễ của Best Buy, đường link trong email đó sẽ đưa chúng ta đến những giao diện hoàn toàn khác nhau, tùy thuộc vào thiết bị mà ta đang sử dụng.

Trên phiên bản dành cho di động, chúng ta có thể thấy rất nhiều sự khác biệt: hero image và phần giới thiệu rất ngắn gọn, các danh mục được thu gọn theo mặc định và không gian chứa hình ảnh, các nút điều hướng được thiết kế rất hợp lý và thuận tiện…

Từ góc nhìn kỹ thuật, Mobile First có thể được thực hiện nhờ một số kỹ thuật như phát hiện server từ máy chủ của người dùng hay thiết kế responsive web của khách hàng. Ví dụ, thiết bị của khách hàng sẽ tìm kiếm các đánh dấu HTML và tìm file CSS tương ứng với các điều kiện cụ thể của thiết bị đó để tải kiểu dáng và thông tin tương ứng. Điều này sẽ tác động đáng kể đến khả năng sử dụng, và đặc biệt là thời gian tải – việc chọn lọc những thông tin phù hợp khiến dung lượng của phần mềm “nhẹ” hơn, và giúp tốc độ tải nhanh hơn.

Từ đó, việc phân biệt giữa Mobile First và Mobile Responsive trở nên rất quan trọng, vì Mobile Responsive có thể giảm kích thước của các thành phần từ bản website xuống chứ chưa chắc đã giảm được kích thước của file.

Vì vậy mặc dù Mobile Responsive có thể đáp ứng được tính thẩm mỹ của các giao diện website nhưng dung lượng lớn của nó tiêu tốn data một cách không cần thiết, và có thể khiến việc tải site chậm hơn và việc kết nối dữ liệu bị ngắt quãng.

Tại sao chúng ta cần quan tâm?

Đơn giản vì Mobile First sẽ giúp chúng ta thu được nhiều lợi nhuận hơn. Một ưu thế lớn của thiết kế Mobile First là giúp tải site của chúng ta nhanh hơn. Đầu tiên, cải thiện tốc độ trang web sẽ cải thiện Google Ranking của bạn. Google không chỉ coi trọng các site di động đã được tối ưu hóa cho giao diện này mà còn xem xét cả tốc độ tải như một nhân tố quan trọng. Google rất ít khi công bố những thành phần được tính để xếp hạng, nhưng điểm này được họ chính thức công nhận từ năm 2010.

Hơn nữa, thiết kế Mobile First sẽ giúp cắt giảm rất nhiều chi phí băng thông. Khách hàng càng ngày càng sử dụng mobile để thanh toán và mua hàng nhiều hơn, dữ liệu mới nhất từ Black Friday năm 2015 cho thấy số lượng mua hàng qua mobile chiếm 36.5% tổng số lượng đơn hàng, và trong Cyber Monday là 26%.

Một dữ liệu khác về thống kê sử dụng internet toàn cầu cho thấy lưu lượng băng thông của mobile đã vượt qua desktop, và từ đây chúng ta có thể thấy rằng, tại sao thiết kế theo Mobile First trở nên thực sự hữu ích cho việc kinh doanh trực tuyến.

Việc tối ưu hóa cho ứng dụng mobile đã trở nên quan trọng đến nỗi một số công ty thậm chí còn thực thi các hạn chế về tốc độ mạng nhằm mô phỏng các kết nối chậm. Facebook đã tổ chức “Thứ Ba 2G” để khuyến khích đội ngũ UX của họ thấu hiểu trải nghiệm mobile của hầu hết những người dùng không thể chi trả hoặc truy cập được những hệ thống kết nối tốt hơn.

Nhược điểm của Mobile first và cách khắc phục

Dẫu có những ưu thế rất lớn, nhiều nhà thiết kế website vẫn không lựa chọn hướng đi này. Đơn giản vì thực hiện nó chẳng vui vẻ hay dễ dàng gì. Chúng ta đâm đầu vào những hạn chế và quy định ngay từ bước đầu tiên. Chúng ta đau đầu hơn với một màn hình nhỏ hơn, ít tài nguyên hơn, và không gian hạn chế.

Nhưng phản biện này là không đủ để phủ nhận những lợi thế của Mobile First. Điều đó chỉ có nghĩa là các nhà thiết kế cần vượt qua chính mình, chấp nhận những thử thách đến từ hướng tiếp cận này, và chấp nhận rằng mình cần phải học hỏi và phát triển nhiều hơn về kĩ năng thiết kế UX.

Và cần phải nhấn mạnh rằng, Mobile First không có nghĩa là Mobile Only. Việc cắt giảm ngân sách thiết kế có thể khiến cho chúng ta nghĩ rằng chỉ thiết kế một giao diện mobile là đủ. Nhưng khi rất nhiều người dùng chuyển đổi linh hoạt giữa các giao diện để dành cho các tính năng khác nhau, việc chúng ta tập trung vào nội dung, điều hướng, và sự đồng nhất giữa các giao diện càng trở nên quan trọng.

Trong một báo cáo gần đây về mobile marketing, nhà sáng lập Smart Insights, Dave Chafey, đã phân tích các dữ liệu và kết luận:

“Dẫu thực tế là người dùng sử dụng di động nhiều hơn cho một số hoạt động như social media, nhắn tin, hay nắm bắt các tin đồn hay cập nhật tình hình thời sự mới, phần lớn người dùng ở thị trường phương Tây vẫn thường sử dụng desktop để xem các thông tin chi tiết, hay mua hàng điện tử.”

Trong quá trình thiết kế, không có một công thức cố định nào. Các dự án khác nhau sẽ cần những cách tiếp cận khác nhau, và chúng ta cần phải cân nhắc kĩ lưỡng khi thực hiện kế hoạch. Chúng ta cần phải quyết định dựa trên quyết định nào là tối ưu cho doanh nghiệp của mình, nhưng cần nhớ rằng, mobile và mobile apps đang càng ngày càng chiếm nhiều thị trường và phát triển càng mạnh mẽ.

Nguồn: Khóa học UI/UX Design

Mọi tutorial về framework của Javascript đều chỉ được viết cách đây 5 phút!

Roger mở ứng dụng Medium, cuộn xuống những bài viết cũ hướng dẫn cách trở nên sáng tạo hơn, cách trở thành nhà kinh doanh thành công… Ngay sau đó, 1 dòng tiêu đề đập ngay vào mắt:

“Quên Angular đi. Quên React đi. Hãy đến với Tupress – 1 framework Javascript tối ưu”

Hmm, Roger tự thấy đây là thời điểm thích hợp để học thêm 1 framework mới khi anh chỉ vừa nghiên cứu Javascript chỉ mới vài tháng. Và sau khi đọc bài viết tràn ngập những cụm từ như “trực quan”, “linh hoạt” và “đa năng”, Roger chính thức bị chinh phục.

Anh mở Macbook, search Google cụm “Tupress tutorial” và chọn kết quả đứng top. Tutorial này sẽ hướng dẫn cách xây dựng ứng dụng two-deux. Khi hoàn thành, ứng dụng này sẽ nhận 1 list danh sách các “số 2” trong Tiếng Anh (2, 2, 2, 2, 2, 2, 2) và chuyển sang tiếng Pháp (le 2, le 2, le 2, le 2, le 2, le 2).

Bước 1 là cài đặt Tupress.

Okie – Roger tự nhủ. Sau đó, anh phải cài Bistup – 1 wrapper nhẹ. Sau đó, anh phải cài Claster – Claster cung cấp 1 layer mỏng, unopinionated của methods và middleware. Dù không hiểu là cái gì nhưng Roger vẫn cứ cài đặt xem sao.

Cuối cùng, anh cài tiếp Pirend – 1 layer microservice RESTful API real-time để implement CRUD & AJAX bằng cách sử dụng JSON. Roger đoán là việc cài đặt này rất quan trọng, nếu không thì chắc không có nhiều từ viết tắt vậy đâu.

Quá trình cài đặt (credit: tutsplus)

Sau khi mọi thứ hoàn tất, Roger rất mong chờ được bắt tay vào viết vài dòng code. Nhưng theo tutorial thì vẫn còn vài bước nữa trước khi anh được làm chuyện đó. Đầu tiên, anh phải install Git, provision 1 database trên nền tảng cloud, tạo 1 RESTful API server, implement các endpoints API, cập nhật dependencies và set up 1 project structure theo component.

“Ehhh” – Roger ca thán. Quá sức phức tạp. Nhưng mình đã cài đặt hàng tá thứ rồi, không thể bỏ được.

Hai tuần sau, cùng với 179 lần search Google, Roger cuối cùng cũng hiểu được cách set up mọi thứ. Anh mở cửa sổ terminal và gõ “tupr start”. Sau đó, Roger mở Chrome và điều hướng đến localhost:3000. Theo tutorial thì anh sẽ được thấy “Tupress hoạt động!”

Nhưng thay đó, lại… chẳng có gì. Hoàn toàn không có gì. Tupress đã không chạy.

Roger thở dài, tiếp tục mở console trong các developer tools của Chrome.

Xem thêm các tin đăng tuyển dụng javascript trên TopDev

Và đây là những gì diễn ra.

Thật không ổn chút nào… (credit: Stack Overflow)

“Mình chỉ muốn viết vài dòng code và làm 1 ứng dụng đơn giản thôi mà” – Roger kêu thán. Không ngờ mọi việc lại trở nên khó khăn như này.

Nhưng anh vẫn không bỏ cuộc. Anh cut và paste từng console error lên Google, phát hiện trên Stack Overflow là tutorial mà anh xem 1 tháng trước đã sử dụng Tupress version 1.3.2, Bistup version 1.2.1, Claster version 3.7.2 và Pirend version 4.2.1.

Trong khi đó, Roger đã cài những version mới nhất của từng thứ và chúng đã không chạy được cùng nhau. Bên đó, Tupress 5 cũng vừa ra mắt và hoàn toàn khác với Tupress 1 (đã không có Tupress 2,3,4).

Trong 1 forum về lập trình khác, Roger phát hiện hầu hết dev đều cảm thấy không hài lòng với Bistup vì nó không đủ nhẹ, còn Claster không mỏng như những gì được hứa hẹn. Vì vậy, 1 lập trình viên ở Thụy Sĩ đã làm được 1 phương án thay thế khác (Focrux.js) tốt hơn nhiều.

7 tuần sau, sau khi uninstall và install lại mọi thứ nhiều lần, đọc lại hết trên Stack Overflow, xem từng video Youtube về các frameworks Javascript và đọc 13 quyển của bộ You Don’t Know S**t about Tupress, Roger cuối cùng cũng “giải thoát” hết các lỗi ra khỏi Chrome console.

“Oh yeah,” Roger reo lên.

Anh mở 1 cửa sổ terminal, gõ tupr start và khởi động localhost:3000– tại đây, cuối cùng những gì anh thấy là:

(credit: baserails)

Tham khảo thêm các vị trí tuyển lập trình viên tại Topdev