Home Blog Page 212

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

5 cách mà Deep Learning ảnh hưởng đến cuộc sống của bạn

Bạn có kế hoạch Netflix & Chill cuối tuần này? Thực chất phim bạn chọn sẽ bị ảnh hưởng nhiều bởi thuật toán tinh vi của Netflix. Tương tự, các quyết định nơi bạn chọn đi ăn tối hay những quần áo sẽ mặc đang ngày càng bị ảnh hưởng bởi các công nghệ tiên đoán dựa vào deep learning.

Dưới đây là 5 cách mà các công ty công nghệ phổ biến Netflix, Yelp, Yahoo, Stitch Fix, Google cải thiện trải nghiệm online của bạn với trí tuệ nhân tạo (AI).

Netflix tự động cá nhân hoá Layouts và Movie Thumbnails

Trong lịch sử, xem truyền hình là một kênh truyền thông uni-directional. Bạn xem được nôi dung, nhưng nó không phản hồi lại bất kỳ thông tin gì với nhà sản xuất. Với kĩ thuật số trực tuyến, history của bạn, click chuột và các cụm tự tìm kiếm đều được Netflix ghi nhận để tìm hiểu các lựa chọn của bạn và cung cấp nội dung có liên quan hơn.

Trong năm 2009, Netflix đã trao tặng 1 triệu USD trong cuộc thi mở cho các đội lập trình bên ngoài để cải thiện hệ thống dự báo của công ty. Đội chiến thắng đánh bại thuật toán ban đầu trên 10%.

Kể từ đó, việc giới thiệu các thuật toán machine learning nâng cao hơn giúp cho Netflix đạt được cấp độ mới về dự đoán và cá nhân hoá trên ranking, layout, catalog, new member onboarding, và nhiều hơn nữa. Tony Jebara, Giám đốc của Netflix, Giáo sư khoa học máy tính tại Columbia, giải thích tại hội thảo Deep Learning Summit của REWORK tại San Francisco cách Netflix không chỉ recommend phim tốt hơn, mà còn đưa ra hình ảnh thumbnails tốt hơn cho từng cá nhân.

Netflix Thumbnails Tony Jebara

Theo truyền thống, tối ưu hoá hình ảnh trên trang web ảnh hưởng bởi việc A/B testing hai lựa chọn trong một khoảng thời gian. Vấn đề với phương pháp này là bạn phải đau đớn chờ đợi trước khi có được quyết định tối ưu. Trong giai đoạn này, các đối tượng của bạn sẽ gặp các biến sub-optimal. Tổn thất này của quá trình thử được gọi là “regret”.

Netflix Regret Tony Jebara

Để giảm thiểu regret, Netflix sử dụng các thử nghiệm như mô hình multi-arm bandit. Các models có thể thay đổi lưu lượng truy cập đến quảng cáo tốt nhất và làm giảm thiểu regret.

Điều quan trọng là sự “tốt hơn” khác nhau đối với mỗi người khác nhau, Netflix sẽ đưa vào tài khoản cá nhân của bạn những hoạt động của bạn để khai thác theo từng cá nhân/ tận dụng khả năng tối ưu. Nếu bạn thường xuyên xem phim hài, họ sẽ sử dụng Robin Williams cho trang bìa của Good Will Hunting. Nếu bạn thích phim tình cảm lãng mạn, họ sẽ dùng ảnh Matt Damon hôn Minnie Driver để thay thế.

YELP hình ảnh đẹp nhất cho bất kỳ địa điểm nào

Một bức ảnh đẹp hơn cả ngàn lời nói. Khi bạn đang muốn chọn một chỗ lãng mạn để gây ấn tượng với ngày hẹn hò của mình, bạn sẽ muốn biết về việc sắp đặt món ăn và không khí phù hợp tâm trạng. Để giúp bạn lựa chọn được đúng nhà hàng, Alex Millers và nhóm của mình tại YELP đã dùng thuật toán deep learning để làm nổi bật hình ảnh tốt nhất của người dùng.

Trong khi các số liệu như lượt like và click có thể đánh giá hữu ích các hình ảnh, họ cũng có thể bị ảnh hưởng bởi clickbait và happenstance. Một giải pháp tốt hơn sẽ là đánh giá hình ảnh dựa trên nội dung vốn có và đặc tính – sâu hơn về field, contrast và alignment, nhưng với 25 triệu MAU (monthly active users) tải lên Yelp hàng nghìn bức ảnh mỗi ngày, sẽ không đủ nhân viên để thẩm định.

Tại Startup Machine Learning conference diễn ra tại San Francisco, Miller miêu tả làm thế nào mà team của mình sử dụng CNNs (convolutional neural networks) để xây dựng một model ghi nhận hình ảnh. Một proxy tốt cho hình ảnh đẹp thì có hay không việc chụp bằng DSLR, có thể được nhận ra dễ dàng bằng cách kiểm tra metadata EXIF của hình ảnh.

Team của Miller đã tận dụng fact này để tạo ra khả năng mở rộng, đào tạo bộ dữ liệu bằng cách sử dụng hình ảnh DSLR là một ví dụ tích cực, và không DSLR là một vì dụ tiêu cực. Thuật toán Deep Learning học được những tính chất tốt của hình ảnh từ thiết lập dữ liệu đào tạo và áp dụng cho tất cả các ảnh, cho dù có DSLR hay không.

Bên cạnh chất lượng điểm ảnh, team cũng thêm vào các bộ lọc và đa dạng hoá logic, vì vậy một nhà hàng nổi tiếng với các món ăn hoặc features đặc biệt sẽ không có hình ảnh của họ trong top 10 hình ảnh cùng chủ đề.

Yelp Alex Miller

Các kết quả trả về:

Yelp Alex Miller

Bạn có thể đọc thêm về quy trình kỹ thuật của Miller tại Yelp engineering blog.

YAHOO đảm bảo bạn chọn emoji tốt nhất cho mỗi tình huống

Với các texters lười biếng, emojis là cách dễ nhất để nói ít hiểu nhiều. Nhưng với hơn 1800 emojis, bạn có chắc chắn được một lựa chọn hoàn hảo cho những gì bạn muốn nói không?  

Đây là vấn đề của Stacey Svetlichnaya, một nhân viên kĩ thuật machine learning tại YAhoo, phải giải quyết. Khi người dùng soạn hoặc trả lời một tin nhắn, emojis nào nên xuất hiện trong đề xuất tự động? Lý tưởng nhất, bạn có thể chọn 5 emojis thường hay dùng nhất, người dùng có thể chọn.

Yahoo Emoji Yahoo Emoji Stacey Svetlichnaya

Sử dụng emojis rất năng động. Một số sử dụng để thay thế từ ngữ, một số sử dụng thể hiện cảm xúc, và một văn hoá sử dụng kì lạ. Ví dụ: Emoji con dê thường được sử dụng với ý nghĩa “Vĩ đại nhất mọi thời đại”.

Yahoo Emoji Yahoo Emoji Stacey Svetlichnaya

Một thách thức nữa là các biểu tượng khác nhau trên các platforms khác nhau, dẫn đến hiểu nhầm.

Yahoo Emoji Yahoo Emoji Stacey Svetlichnaya

Svetlichnaya và Yahoo Vision & Machine Learning team kiểm tra ba cách tiếp cận khác nhau: 1) FastText: một sự phân loại fast linear, 2) LTSM: một loại kiến trúc neural network và 3) WordCNN: một cách tiếp cận net approach cân bằng giữa hiệu xuất và tính phức tạp. Trong 3 cách, không ngạc nhiên với FastText chiến thắng về tốc độ nhưng người ta ưa thích các kết quả của LTSM hơn.

Yahoo không phải công ty duy nhất áp dụng machine learning cho các biểu tượng cảm xúc. Quay lại năm 2015, kỹ sư Instagram đã xuất bản một series hấp dẫn bởi kĩ sư Thomas Dimson gọi là “Emojineering: Machine Learning for emojis”

STITCH FIX nhanh chóng tìm kiếm cho bạn thời trang hoàn hảo

Trở nên fashinable rất khó, nhưng Stitch Fix đã làm nó trở nên dễ dàng. Startup về phong cách cá nhân (personal style) cho phép bạn cá nhân hoá các style profile của bạn và nhận được quần áo và phụ kiện được gửi đến tận nhà hàng tháng.

Xác định phong cách là một khái niệm mơ hồ. Sau tất cả, làm sao bạn có thể nói đến một chiếc áo sơ mi cụ thể là “urban boho chic” hay một chiếc váy là “gợi cảm nhưng không quá slutty”? Christopher Moody có một vài ý tưởng.

Stitchfix Christopher Moody

Moody là một Data Scientist tại Stitch Fix với background là statistics, astrophysics, và high-performance computing. Hoá ra những kĩ năng này đang làm nhu cầu trong thế giới thời trang.

Nhiều models deep learning là một chiếc hộp đen nơi bạn không hiểu tại sao từ một thuật toán có thể đi đến một kết luận cụ thể. Nghiên cứu của Moody tập trung về việc cải tiến các models để các chuyên gia có thể đưa ra phản hồi về hiệu xuất tương đối  của các thuật toán.

Một phương pháp được sử dụng là t-SNE (t-distributed stochastic neighbor embedding), một phương pháp giảm kích thước để giúp hình dung các đối tượng tương tự. Phương pháp giảm kích thước làm giảm flatten dữ liệu thành 2-3 điểm được hiểu dễ dàng hơn.

Moody cũng là một fan hâm mộ lớn của phương pháp k-SVD. k-SVD là một thế hệ của phương pháp k-means clustering. Về high-level non-technical, phân nhóm dữ liệu có tính chất tương tự kết hợp với các đối tượng khác nhau. Một lần nữa, rõ ràng là phân cụm có thể giúp con người  có thể xác định được các đặc trưng thống nhất, thêm các thẻ phù hợp như “tank tops” hay “statement pieces”.

Stitchfix Christopher Moody

GOOGLE DỊCH phương pháp tiếp cận con người

Trong tháng 9 năm 2016, Google Translate công bố họ đã thay thế phương pháp cũ với kiến trúc neural networks. Trước đây, Google Translate sở hữu một phương pháp thống kê gọi là phrase-based machine translation (PBMT)

Phương pháp PBMT thường tạo ra những câu ngữ pháp vụng về, đặc biệt nếu đầu vào và đầu ra khác biệt nhau nhiều trong ngôn ngữ của chúng. Chẳng hạn như Trung Quốc sang tiếng Anh. Để chỉnh sửa cho điều này cần bổ sung kỹ thuật phức tạp và nỗ lực nhiều hơn.

GOOGLE GNMT Translation Output

Hệ thống mới GNMT (Google Neural Machine Translation) sử dụng RNNs (recurrent neural networks) ánh xạ toàn bộ câu văn đầu vào của một ngôn ngữ thành một câu văn ở đầu ra của một ngôn ngữ khác. Điều này làm giảm sự phức tạp của các code trong khi vẫn duy trì tốc độ và cải thiện hiệu suất. Trong một số trường hợp như tiếng Pháp sang tiếng Anh, GNMT đã gần như là người dịch (human translation)

Google GNMT Performance

Nếu bạn muốn hiểu sự phát triển kĩ thuật của GNMT và làm thế nào team Google có thể lặp đi lặp lại cải tiến về thiết kế và hiệu suất, đọc Stephen Merity’s visual guide về quá trình này.

Kết luận

Nhiều người tiêu dùng không nhận ra việc trí tuệ nhân tạo cải thiện đáng kể cuộc sống của mình trong các sản phẩm kĩ thuật số. Mô hình thống kê truyền thống dự đoán kinh nghiệm tối ưu được nâng cao đáng kể bởi cách đột phá gần đây trong Big Data, Computational Power, Deep neural networks. Và ngày sẽ có nhiều công ty sử dụng các phương pháp này để tồn tại và cạnh tranh.

Nguồn: topbots.com

67 tools, libraries và resources giúp Web developer “dễ thở” hơn

Trong bài viết này, tôi sẽ không nói về các font end frameworks khủng như React, Angular, Vue etc… Hay các code editor vốn đã nổi tiếng như Atom, VS Code Sublime….mà chỉ đơn giản là một list các tools mà tôi thấy khá hữu dụng trong việc tiết kiệm thời gian khi bạn lập trình.

Điều hiển nhiên là bạn sẽ có thể đã biết hay từng dùng qua vài tool trong danh sách này vì thế mà list này rất thích hợp dành cho các bạn web developer mới vào nghề và cần học hỏi thêm.

Để cho dễ nhìn cũng như theo dõi, tôi sẽ sắp xếp các tool và chia chúng thành từng nhóm khác nhau.

Javascript libraries

Particles.js — Một library để tạo ra các special effect – hạt nổi lơ lửng trên trang web

Three.js —  Library dùng để tạo ra 3d objects và spaces trên web page

Typed.js — Typewriter effect

Waypoints.js — Kích hoạt một function khi bạn scroll một thứ bất kì

Highlight.js— Syntax highlighting for the web

Chart.js — Tạo ra các biểu đồ cực đẹp với javascript

Instantclick —  Giảm thời gian load time của website nhờ vào việc preloading resource.

Chartist — Một library khác về biểu đồ cực đẹp.

Motio —một library dành cho sprite dựa trên animations và panning

Animstion — Jquery plugin cho css animated page transitions

Barba.js — Fluid page transitions

TwentyTwenty —một visual tool để tìm ra những thay đổi, khác biệt

Vivus.js — một library cho việc vẽ animation trên SVG

Wow.js—  Chạy animations khi bạn scroll

Scrolline.js —  Cho bạn biết mình đã scroll được bao nhiều, và khi nào thì hết page.

Velocity.js —  javascript animations nhưng rất nhanh và mượt mà

Animate on scroll — Cái tên nói lên tất cả

Handlebars.js — Javascript templating

jInvertScroll — Parallax scrolling

One page scroll — Thư viện scrolling 1 trang

Parallax.js — Parallax Engine dành cho orientation của một thiết bị thông minh

Typeahead.js — Search completion

Dragdealer.js — Thư viện dragging

Bounce.js — Tạo các animations CSS3

Pagepiling.js — One page scroll

Multiscroll.js — Multi scroll một website, được chia thành các panels scroll theo chiều dọc

Favico.js — Dynamic favicons

Midnight.js — Switch fixed headers trên fly

Anime.js — Animation library

Keycode —  Lấy javascript keycode cho một button được nhấn

Sortable — Drag & drop

Flexdatalist — Autocomplete

Slideout.js — Slideout navigation menu cho mobile apps

Jquerymy —  data bindings 2 hướng sử dụng jquery

Cleave.js — Format content khi typing

Page — Client side routing cho single page applications

Selectize.js — Hybrid select box cho adding tags

Nice select — Jquery library để tao ra select boxes

Tether —  attach absolute positioned elements

Shepherd.js — Hướng dẫn users dùng app

Tooltip — Cái tên thể hiện tất cả

Select2 — Jquery replacement cho select boxes

IziToast — giúp việc dùng/tạo js notifications dễ dàng hơn

IziModal —  giúp việc dùng/tạo js modals dễ dàng hơn

CSS libraries / Design stuff

Animate.css — Animation library

Flat UI Colors — List các màu UI tiện lợi

Material design lite— Framework dựa trên Google’s material design

Colorrrs — Random color generator

Section separators — Css section dividers

Topcoat — Framework

Create ken burns effect — Ken burns effect sử dụng css3 animations

DynCSS — Thêm functions vào css, để khiến nó có ảnh hưởng hơn

Magic animations —  Quá dễ hiểu

CSSpin — Collection của css spinners

Feather icons — Icons

Ion icons — Icons

Font awesome — Icons

Font generator — Kết hợp nhiều fonts và tạo ra một mixture

On/Off switch —Tạo on/off switch trong css

UI Kit — Framework

Bootstrap — Framework

Foundation — Framework

Useful products / links

<head> cheatsheet —  list của mọi thứ có thể để vào trong <head> tag

Ghost — blogging platform dựa trên node.js

What runs — Chrome plugin để phân tích công nghệ được dùng trong một website.

Learn anything — mindmap dùng để phân tích một vật bất kì

Nguồn: topdev.vn via hackernoon

Kinh nghiệm phát triển sản phẩm chinh phục thị trường Châu Âu

Thị trường châu Âu và các nước phát triển luôn là những thị trường khó tính, với những hệ thống tiêu chuẩn cao, người dùng đòi hỏi những sản phẩm tốt nhất. Chính vì vậy, để phát triển sản phẩm thành công ở những thị trường này không chỉ đơn thuần là bài toán về công nghệ mà đó còn là việc ứng dụng công nghệ một cách thông minh để giải quyết vấn đề cốt lõi mà khách hàng đang gặp phải. Đi tìm lời giải cho nhưng vấn đề đó, chinh phục khách hàng khó tính đó là cả một hành trình dài nhiều gian truân nhưng cũng đầy thú vị.

Travel2Pay là một trong những Product thành công trong việc mang sản phẩm ra với thị trường châu Âu. Cùng lắng nghe những chia sẻ về quá trình phát triển sản phẩm, cũng như những kinh nghiệm trong quá trình làm sản phẩm từ anh Nguyễn Thế Dzung- CEO của Travel2Pay.

1. Anh có thể giới thiệu đôi nét về Travel2Pay cho cộng đồng lập trình viên được biết ?

Travel2Pay là công ty Product có vốn đầu từ nước ngoài (Đức), được thành lập từ năm 2013, Travel2Pay chuyên cung cấp giải pháp thanh toán toàn cầu cho các doanh nghiệp đa quốc gia có quy mô từ trung bình đến lớn ở các thị trường phát triển như châu Âu, Đức, Nhật Bản, và gần đây nhất là Trung Quốc

2. Xuất phát từ đâu anh có ý tưởng về một sản phẩm khá mới và lạ như vậy?

Ý tưởng phát triển sản phẩm đến từ ngài Chủ tịch hội đồng quản trị của công ty khi nhận thấy nhu cầu thực tế của một số công ty lớn trên thế giới về việc nhân viên của họ thường xuyên phải đi công tác ở trong và ngoài nước. Vấn đề lớn nhất mà các doanh nghiệp này gặp phải là giải quyết những bất tiện trong thu thập dữ liệu hóa đơn thanh toán khách sạn, vé tàu xe, tham gia hội nghị,…. Những thủ tục này thường tốn khá nhiều thời gian và gặp nhiều sai sót.

Không chỉ gây trở ngại với những người đi công tác, đối với bộ phận hành chính kế toán cũng rất vất vả khi phải xử lý số liệu lớn, phát hiện nhiều sai sót. Các sai sót đó có thể do khách quan hoặc chủ quan (có thể từ nơi phát hành hóa đơn, có thể là do nhân viên không tuân thủ các chính sách của công ty, v.v…), dù từ bất kì nguyên nhân nào thì những sai sót đó cũng phần nào gây khó khăn cho công ty.

Trước những vấn đề đặt ra đó, cộng với  sự kết nối tốt từ những nhà đầu tư của Travel2Pay với các đối tác: đặt phòng trực tuyến, cung cấp dịch vụ thanh toán, các công ty phát hành thẻ,…Travel2pay đã hình thành nên ý tưởng về 1 sản phẩm cung cấp các giải pháp mang lại lợi ích cho khách hàng – đối tác – và mang lại lợi ích cho chính mình.

Đó là giải pháp Win-Win-Win chứ không chỉ là giải pháp Win-Win.

3. Phát triển một sản phẩm quá mới như vậy thì Travel2Pay có gặp phải những khó khăn gì không?

Cũng như bất kỳ một sản phẩm nào mới tung ra thị trường, những ngày đầu đều gặp những khó khăn nhất định. Khi mới phát hành sản phẩm ra thị trường Travel2Pay cũng phải đối mặt với rất nhiều khó khăn, đặc biệt với 1 sản phẩm còn khá mới. Thách thức lớn nhất mà Travel2Pay phải đối mặt là làm sao để thị trường nhận biết được sản phẩm, và nhìn thấy được giá trị mà sản phẩm mang lại.

Hơn nữa với đặc thù sản phẩm mà Travel2Pay cung cấp nhắm đến các doanh nghiệp có quy mô từ trung bình đến lớn ở các quốc gia phát triển, và nó có ảnh hưởng trực tiếp đến quy trình của các doanh nghiệp đó. Vì vậy, đôi khi những doanh nghiệp này phải thay đổi quy trình của họ để phù hợp với quy trình sản phẩm của mình. Công việc này thường tốn khá nhiều thời gian, và chính từ việc tốn thời gian dài như vậy cũng gây không ít khó khăn cho 1 doanh nghiệp có quy mô không lớn như ở Travel2Pay.

4. Đối mặt với nhiều khó khăn, thử thách như vậy thì Travel2Pay đã giải quyết các vấn đề gặp phải như thế nào?

Kiên trì chính chí là chìa khóa cho mọi vấn đề. Kiên trì vào mục tiêu, tin tưởng vào giá trị cốt lõi mà mình theo đuổi, luôn luôn tin vào giải pháp của mình là giải pháp mang lại lợi ích cho khách hàng, đối tác, và cho chính bản thân công ty.

Không ngừng nổ lực, hoàn thiện giải pháp, hỗ trợ tốt nhất cho khách hàng hiện tại. Và sẵn sàng đón chờ các kết nối mới.

5. Được biết giải pháp mà Travel2Pay cung cấp có liên quan tới thanh toán trực tuyến, vậy vấn đề bảo mật thông tin trong thanh toán được Travel2Pay thực hiện như thế nào?

Giải pháp mà Travel2Pay cung cấp có liên quan đến thanh toán trực tuyến. Chính vì vậy, Travel2Pay cũng rất quan tâm tới vấn đề bảo mật thông tin trong thanh toán điện tử. Việc bảo đảm an toàn thông tin, không chỉ phụ thuộc vào một hay một vài doanh nghiệp nào có thể làm được, mà nó đã được chuẩn hóa, đặc biệt trong lĩnh vực có liên quan đến tín dụng, đó là cái chuẩn PCI DSS – được Hội đồng Tiêu chuẩn Bảo mật (Security Standards Council) phát hành dành cho thẻ thanh toán, bao gồm các thành viên ban đầu như: Visa, MasterCard, American Express (AMEX), Discover Financial Services, JCB International. Đây là tổ chức độc lập về an toàn thông tin trong giao dịch điện tử. Đó là một chuẩn đáng tin cậy trong hệ thống thông tin, hạ tầng hệ thống thông tin. Vấn đề bảo mật thông tin rất đa dạng và có nhiều thách thức nhưng nếu tuân thủ một cách nghiệm ngặt các quy chuẩn này thì vấn đề bảo mật thông tin hoàn toàn có thể bảo đảm được.

Hiện nay, xu thế thanh toán trực tuyến khá phổ biến, gần đây xuất hiện thêm 1 khái niệm mới –  thẻ thanh toán ảo, theo anh đây là một phương thức thanh toán mới có nhiều ưu điểm hơn so với thẻ thanh toán vật lý thông thường. Nhìn chung về tính năng thì dù là thẻ thanh toán ảo, hay thẻ thanh toán vật lý đều có chức năng như nhau. Nhưng về tính linh hoạt thì thẻ thanh toán ảo lại bộc lộ nhiều ưu điểm vượt trội hơn so với thẻ thanh toán truyền thống: về hạn mức thanh toán linh hoạt hơn, thời hạn thẻ linh hoạt hơn, mục đích sử dụng uyển chuyển hơn.

6. Anh có lo sợ những sự cố về bảo mật thông tin trong thanh toán gần đây có thể sẽ khiến khách hàng lo ngại khi sử dụng bên thứ 3 trong thanh toán?

Vì sản phẩm của Travel2Pay chủ yếu cung cấp cho thị trường khá phát triển. Bên họ có hệ thống giao dịch tài chính tương đối lâu đời, ngoài các quy định về nhà nước các tổ chức có thẩm quyền quy định, ngoài ra niềm tin còn được gầy dựng bằng uy tín của chính công ty, bằng nhận thức của người sử dụng bằng văn hóa của người dùng. Chính vì vậy, tính tin cậy trong giao dịch được đảm bảo.

Ở Việt Nam vấn đề này có chút khác biệt, nhưng theo anh nghĩ: mỗi vấn đề đều có 2 mặt tích cực và tiêu cực, xu thế là mọi người sẽ phát huy mặt tích cực và hạn chế mặt tiêu cực đó là điều chắc chắn, bất cứ một cái gì mới đều có rủi ro nhưng xu thế chung là giải pháp nào mang lại nhiều giá trị cho người dùng thì sớm hay muộn cũng sẽ được người dùng chấp nhận. Không riêng gì ở Việt Nam , mà nhìn chung ở các nước đang phát triển, dù hiện tại có thể hình thức thanh toán trực tuyến vẫn chưa được phổ biến, nhưng nó sẽ từ từ đi vào nề nếp trong tương lai, nó sẽ có trục trặc khó khăn ban đầu, chuyện đó là chuyện chắc chắc sẽ xảy ra, nhưng đừng quá lo lắng về điều đó. Điều quan trong nhất là cần phải rút ra được bài học kinh nghiệm gì từ những sự cố đó. Về phía doanh nghiệp cần tuân thủ các quy trình về an toàn bảo mật , thông tin các vấn đề đó tới khách hàng một cách đầy đủ, chính xác nhất. Niềm tin sẽ được củng cố theo thời gian.

7. Theo anh vì sao các lập trình viên tài năng nên chọn Travel2Pay để đầu quân?

Travel2Pay làm việc với các khách hàng ở các nước phát triển và đối tượng khách hàng là các doanh nghiệp tương đối lớn, ở đây khách hàng không chỉ là khách hàng mà còn là các chuyên gia trong lĩnh vực này. Theo anh nghĩ đây là một lợi thế khá lớn cho lập trình viên được học hỏi về kỹ năng, về thái độ làm việc, văn hóa, làm việc trong môi trường chuyên nghiệp. Đó là những lợi thế không phải nơi nào cũng có.

Thay vì tạo áp lực công việc cho mọi người thì sẽ tạo động lực bằng cách đặt ra các mục tiêu ngắn hạn và dài hạn. Thường xuyên quan tâm, nhắc nhở, hỗ trợ kịp thời để mọi người hoàn thành được các mục tiêu đề ra.

Travel2Pay luôn đánh giá cao những ứng viên say mê và trung thực. Những nổ lực của bạn sẽ luôn được đánh giá công bằng và nhận được mức đãi ngộ tương xứng với đóng góp của bạn.

8. Văn hóa công ty mà Travel2Pay đang hướng đến là văn hóa như thế nào?

Travel2Pay hướng đến một môi trường làm việc thân thiện, trao cơ hội cho các bạn tạo ra những sản phẩm mang giá trị thật, các bạn được tự do đóng góp, đưa ra ý kiến, và được tưởng thưởng cho đóng góp của mình. Travel2Pay mang đến cho các bạn không chỉ là công việc mà còn là hạnh phúc và niềm vui.

9. Anh có thể chia sẻ thêm về những kế hoạch, dự định trong thời gian tới của Travel2Pay?

Trong thời gian tới, Travel2Pay vẫn tập trung hoàn thiện sản phẩm tốt hơn, đáp ứng nhu cầu ngày càng cao của các khách hàng hiện tại. Hơn thế nữa, các đối tác mà Travel2Pay đang hợp tác cũng có tốc độ phát triển khá nhanh, đặt ra yêu cầu trước mắt là Travel2Pay cũng phải phát triển để tương thích với các đôi tác.

Còn trong tương lai xa hơn khi thị trường Việt Nam phát triển phù hợp, Travel2Pay mong muốn phát triển sản phẩm này cho thị trường Việt Nam.

Tham khảo: Các vị trí Travel2Pay tuyển dụng

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

Lương IT nghìn USD nếu thành thạo Cloud, Big Data, AI

lương it

Lương IT có mặt bằng chung khá cao, nhiều nhà tuyển dụng đang sẵn sàng chi mức lương nghìn USD cho ứng viên nhiều kinh nghiệm về các công nghệ “nóng” thời 4.0 như Cloud, Big Data, AI.

Số liệu quý II/2017 của TopDev khảo sát trên 5.500 ứng viên IT cả nước cùng hơn 150 nhà tuyển dụng cho biết, 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 đang được nhà tuyển dụng chiêu mộ với mức lương cạnh tranh, dao động khởi điểm $1000 – $1500 ở mức Junior với kiến thức cơ bản và đạt mức $2,500 – $4,500 ở mức Senior với kiến thức chuyên sâu.

Trải nghiệm công cụ tính lương gross to net chuẩn tại TopDev

  Biết đồng nghiệp cùng cấp nhận lương cao hơn mình, thay vì bực tức hay chán nản, hãy bình tĩnh làm những việc sau

Nguyên nhân có sự ưu ái mức lương này bởi đây là những công nghệ tiên tiến, không chỉ được các công ty lâu năm mà các startup cũng rất săn đón. Những thống kê gần đây nhất của TopDev cho hay, có đến 80% startup công nghệ đang dần áp dụng AI/Machine Learning, Bigdata và các công nghệ trên đám mây để tăng sự hiệu quả của hệ thống.

Đặc biệt, theo khảo sát, điện toán đám mây (Cloud Computing) đang 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.

Để 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ó được mạng tuyển dụng này dự báo 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.

lương it
Cloud, Big Data, AI đang là các công nghệ ‘hot’ thời 4.0 mà doanh nghiệp sẵn sàng chi lương cao cho ứng viên có am hiểu.

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 Á.

Cùng với đó, theo dự đoán của các chuyên gia, năm 2018 tiếp tục sẽ là 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) …

Ứng dụng của các công nghệ này hiện khá rộng rãi và được nhiều doanh nghiệp trong và ngoài nước theo đuổi để hoàn thiện giải pháp cho riêng mình.

  Chuyện Elon Musk sa thải trợ lý gắn bó với anh 12 năm vì đòi tăng lương và bài học dành cho tất cả chúng ta

Ví dụ như 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 hay 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…

lương it
Hơn 100 topic về Technical, Cloud, Ecommerce, Payment… đang đợi bạn. Đăng kí những slot vé ưu đãi đầu tiên tại đây!

“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.

Nguồn: vnexpress.net

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

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

Bạn có thể sử dụng Google Cloud Platform để xây dựng dịch vụ có thể mở rộng, hiệu quả và có khả năng để chuyển các recommend sản phẩm có liên quan đến người dùng trong một cửa hàng trực tuyến.

Cạnh tranh trong các trang web bán hàng trực tuyến chưa bao giờ trở nên khốc liệt như hiện nay. Khách hàng dành nhiều tiền hơn cho tất cả các nhà sản xuất nhưng họ chi tiêu ít hơn cho mỗi nhà bán lẻ. Kích thước trung bình của mỗi giỏ hàng đang giảm, một phần do sự cạnh tranh chỉ là một cú nhấp chuột. Cung cấp các khuyến nghị có liên quan đến khách hàng tiềm năng có thể đóng vai trò trung tâm trong việc chuyển đổi người xem sang người mua và kích thước đơn hàng tăng lên.

Sau khi đọc giải pháp này, bạn sẽ có thể thiết lập được một công cụ hỗ trợ cơ bản mà bạn có thể phát triển và cải tiến, dựa trên nhu cầu của khối lượng công việc cụ thể của bạn. Việc chạy một công cụ đề xuất trên Cloud Platform sẽ cung cấp cho bạn tính linh hoạt và khả năng mở rộng trong các giải pháp mà bạn muốn chạy.

Trong giải pháp này, bạn sẽ thấy cách một công ty cho thuê bất động sản có thể tính toán các đề xuất có liên quan và giới thiệu cho khách hàng đang xem trên trang của họ.

Scenario

Samantha đang tìm kiếm thuê một căn nhà cho những ngày nghỉ của cô. Cô có một hồ sơ trên một trang web cho thuê và trước đây đã thuê và đánh giá một số gói kỳ nghỉ. Sam đang tìm kiếm các đề xuất dựa trên sở thích của cô ấy. Hệ thống cần phải biết được thị hiếu của Sam. Rõ ràng cô ấy thích một kiểu nhà nào đấy, dựa trên trang xếp hạng của cô ấy. Hệ thống nên đề nghị một cái gì đó tương tự.

User interface enables renting vacation properties

Solution overview

Để cung cấp các đề xuất, cho dù theo thời gian thực trong khi khách hàng online hoặc qua email sau này, một vài điều cần phải xảy ra. Lúc đầu, trong khi bạn biết rất ít về thị hiếu và sở thích của người dùng, bạn có thể đề xuất các khuyến nghị về các thuộc tính một mình. Nhưng hệ thống của bạn cần có thể học hỏi từ người dùng, thu thập dữ liệu về thị hiếu và sở thích của họ. Theo thời gian và với đủ dữ liệu, bạn có thể sử dụng các thuật toán machine learning để thực hiện các phân tích hữu ích và đưa ra những đề xuất có ý nghĩa. Đầu vào của người dùng khác cũng có thể cải thiện kết quả, cho phép hệ thống được đào tạo theo định kỳ. Giải pháp này đề cập đến hệ thống recommend đã có đủ dữ liệu để có thể sử dụng các thuật toán Machine Learning.

Công cụ đề xuất thường xử lý dữ liệu thông qua bốn giai đoạn sau:

Kiến trúc của một hệ thống như vậy có thể được biểu diễn bằng sơ đồ sau:

Mỗi bước có thể được tùy chỉnh để đáp ứng các yêu cầu. Hệ thống bao gồm:

  • Một frontend có thể mở rộng để ghi lại tương tác người dùng để thu thập dữ liệu.
  • Lưu trữ vĩnh viễn mà có thể được truy cập bởi một nền tảng machine learning. Việc tải dữ liệu vào bộ nhớ này có thể bao gồm một vài bước, chẳng hạn như xuất nhập và chuyển đổi dữ liệu.
  • Một nền tảng machine learning có thể phân tích nội dung hiện có để tạo ra các khuyến nghị có liên quan.
  • Bộ nhớ có thể được sử dụng cho frontend, theo thời gian thực hoặc sau đó, dựa trên yêu cầu kịp thời cho các đề xuất.

Tham khảo: Machine Learing job in Vietnam

Choosing the components

Để đạt được sự kết hợp tốt giữa tốc độ, đơn giản, kiểm soát chi phí và độ chính xác, giải pháp này sử dụng  Google App EngineGoogle Cloud SQL, và Apache Spark chạy trên Google Compute Engine sử dụng bdutil.

App Engine có thể xử lý hàng chục ngàn truy vấn mỗi giây chỉ với một ít sự quản lý. Cho dù tạo trang web hoặc lưu dữ liệu vào bộ nhớ lưu trữ phụ trợ, App Engine cho phép bạn viết code của mình và triển khai nó tới sản phẩm chỉ trong vài giây.

Cloud SQL cung cấp sự đơn giản của việc triển khai. Cloud SQL có thể nâng cấp lên 32-core máy ảo với tối đa 208 GB RAM, và có thể phát triển dung lượng lưu trữ theo yêu cầu lên đến 10 TB với 30 IOPS trên GB và hàng ngàn kết nối đồng thời. Các thông số kỹ thuật này rất đầy đủ cho giải pháp ví dụ này và cho một số lượng lớn các công cụ thực tế. Cloud SQL cũng cung cấp lợi thế là nó có thể được truy cập trực tiếp từ Spark.

Spark cung cấp hiệu suất tốt hơn nhiều so với thiết lập Hadoop điển hình; Spark có thể nhanh gấp 10 đến 100 lần. Với Spark MLlib, bạn có thể phân tích hàng trăm triệu ratings trong vài phút, làm tăng sự nhanh nhẹn của các đề xuất, cho phép quản trị viên chạy thuật toán thường xuyên hơn. Spark cũng có xu hướng có các mô hình lập trình đơn giản, một API dễ sử dụng, và linh hoạt ngôn ngữ. Nó thúc đẩy bộ nhớ cho máy tính, nhiều nhất có thể, để giảm các vòng quay đĩa và để giảm thiểu I / O. Giải pháp này sử dụng Compute Engine để lưu trữ cơ sở hạ tầng phân tích. Compute Engine giữ giá phân tích thấp nhất có thể thông qua việc định giá theo mỗi yêu cầu trên 1 giây.

Biểu đồ sau đây hiển trước sơ đồ kiến ​​trúc, nhưng cũng hiển thị công nghệ đang sử dụng cho từng bước:

Collecting the data

Công cụ đề xuất có thể thu thập dữ liệu về người dùng dựa trên hành vi ngầm hoặc đầu vào rõ ràng của họ.

Dữ liệu hành vi dễ thu thập vì bạn có thể giữ lịch sử các hoạt động của người dùng. Thu thập dữ liệu này cũng đơn giản bởi vì nó không yêu cầu bất kỳ hành động bổ sung nào từ người dùng. Nhược điểm của cách tiếp cận này là nó khó phân tích hơn. Ví dụ, lọc các bản ghi thú vị từ những cái ít thú vị rất rườm rà. Để xem ví dụ về phân tích dữ liệu tiềm ẩn bằng cách sử dụng lịch sử, hãy xem Real-time Log Analysis sử dụng Fluentd và BigQuery.

Nhập dữ liệu có thể khó thu thập hơn bởi vì người dùng cần thực hiện các hành động bổ sung, chẳng hạn như viết bài đánh giá. Người dùng có thể không muốn cung cấp dữ liệu này vì nhiều lý do. Nhưng khi nói đến sự hiểu biết về sở thích người dùng, kết quả như vậy khá chính xác.

Storing the data

Bạn càng có nhiều dữ liệu cung cấp cho các thuật toán của mình, thì các đề xuất càng tốt. Điều này có nghĩa là bất kỳ dự án recommendation có thể nhanh chóng chuyển thành một dự án big data.

Loại dữ liệu bạn sử dụng để tạo đề xuất có thể giúp bạn quyết định loại lưu trữ để sử dụng. Bạn có thể chọn sử dụng một cơ sở dữ liệu NoSQL, một cơ sở dữ liệu SQL chuẩn, hoặc thậm chí một số loại lưu trữ đối tượng. Mỗi một trong các tùy chọn này khả thi tùy thuộc vào việc bạn đang nắm bắt đầu vào hoặc hành vi của người dùng và các yếu tố như dễ thực hiện, lượng dữ liệu mà bộ lưu trữ có thể quản lý, tích hợp với phần còn lại của môi trường và khả năng lưu động.

Khi lưu các rating hoặc sự kiện của người dùng, một cơ sở dữ liệu có thể mở rộng và giảm thiểu số lượng các tác vụ hoạt động cần thiết và giúp tập trung vào đề xuất. Cloud SQL đáp ứng cả hai nhu cầu này và cũng giúp dễ dàng tải dữ liệu trực tiếp từ Spark.

Ví dụ mã sau đây cho thấy các giản đồ của các bảng Cloud SQL.  Accommodation table đại diện cho mục hiển thị và Rating table thể hiện xếp hạng của người dùng cho một mục cụ thể.

CREATE TABLE Accommodation
(
  id varchar(255),
  title varchar(255),
  location varchar(255),
  price int,
  rooms int,
  rating float,
  type varchar(255),
  PRIMARY KEY (ID)
);

CREATE TABLE Rating
(
  userId varchar(255),
  accoId varchar(255),
  rating int,
  PRIMARY KEY(accoId, userId),
  FOREIGN KEY (accoId)
    REFERENCES Accommodation(id)
);

Spark có thể nhận dữ liệu từ nhiều nguồn khác nhau, chẳng hạn như Hadoop HDFS hoặc Cloud Storage. Giải pháp này nhận dữ liệu trực tiếp từ Cloud SQL bằng cách sử dụng Spark Java Database Connectivity (JDBC) connector. Bởi vì Spark chạy song song, đầu nối phải có sẵn trên tất cả các trường hợp.

Analyzing the data

Thiết kế giai đoạn phân tích đòi hỏi sự hiểu biết về các yêu cầu của ứng dụng. Những yêu cầu này bao gồm:

  • Tính kịp thời (timeliness) của một recommendation. Ứng dụng cần đưa ra các đề xuất nhanh như thế nào?
  • Cách tiếp cận lọc cho dữ liệu. Ứng dụng sẽ đưa ra khuyến cáo về sở thích của người dùng một cách đơn lẻ, xoay các dữ liệu dựa trên những gì người dùng khác nghĩ ra, hoặc xoay quanh những sản phẩm nào hợp lý với nhau?

Hiểu rõ timeliness

Yếu tố đầu tiên cần cân nhắc khi phân tích dữ liệu là bạn cần đưa ra các đề xuất cho người dùng nhanh như thế nào. Nếu bạn muốn đưa ra đề xuất ngay lập tức, chẳng hạn như khi người dùng đang xem một sản phẩm, bạn sẽ cần một loại phân tích linh hoạt hơn là khi bạn muốn gửi cho khách hàng một email có chứa các khuyến nghị vào một ngày sau đó.

  • Các hệ thống real time có thể xử lý dữ liệu khi nó được tạo ra. Loại hệ thống này thường bao gồm các công cụ có thể xử lý và phân tích các luồng sự kiện. Một hệ thống real time sẽ được yêu cầu để cung cấp cho các khuyến nghị trong một thời điểm.
  • Batch analysis yêu cầu bạn phải xử lý dữ liệu định kỳ. Phương pháp này hàm ý rằng cần phải tạo đủ dữ liệu để phân tích có liên quan, chẳng hạn như khối lượng bán hàng một ngày. Một batch system có thể làm việc tốt để gửi một e-mail vào một ngày sau đó
  • Near-real-time analysis cho phép bạn thu thập dữ liệu nhanh chóng để bạn có thể làm mới phân tích trong vài phút hoặc vài giây. Hệ thống gần thời gian thực có thể tốt cho việc cung cấp các đề xuất trong suốt phiên duyệt web giống nhau

Một đề xuất có thể thuộc bất kỳ loại nào trong ba loại thời gian này, nhưng đối với một công cụ bán hàng trực tuyến, bạn có thể cân nhắc điều gì đó giữa gần thời gian thực và xử lý hàng loạt, tùy thuộc vào lượng truy cập và người dùng nhập vào ứng dụng. Nền tảng chạy các phân tích có thể làm việc trực tiếp từ một cơ sở dữ liệu, nơi dữ liệu được lưu hoặc trên một dump saved được lưu định kỳ trong lưu trữ liên tục.

Filtering the data

Một thành phần cốt lõi của việc xây dựng một công cụ recommendation là filtering. Cách tiếp cận phổ biến nhất bao gồm:

  • Content-based: Một sản phẩm phổ biến, được đề nghị có các thuộc tính tương tự với những gì người dùng xem hoặc thích.
  • Cluster: Các sản phẩm được đề xuất liên kết tốt, cho dù người dùng khác đã làm gì.
  • Collaborative: Những người dùng khác, những người sử dụng các sản phẩm tương tự người dùng xem hoặc thích, cũng thích một sản phẩm được đề nghị

Mặc dù Cloud Platform có thể hỗ trợ bất kỳ phương pháp nào, nhưng giải pháp này tập trung vào lọc các liên kết, được thực hiện bằng cách sử dụng Apache Spark. Để biết thêm thông tin về lọc dựa trên nội dung hoặc lọc cụm, xem appendix.

Collaborative filter cho phép bạn tạo ra các thuộc tính sản phẩm trừu tượng và đưa ra các dự đoán dựa trên thị hiếu của người sử dụng. Đầu ra của lọc này dựa trên giả định rằng hai người dùng khác nhau thích những sản phẩm giống nhau trong quá khứ có thể sẽ giống như những sản phẩm tương tự hiện nay.

Bạn có thể diễn tả cho dữ liệu về xếp hạng hoặc tương tác như một bộ ma trận, với sản phẩm và người dùng làm thứ nguyên. Collaborative filter cố gắng dự đoán các ô bị thiếu trong ma trận cho một cặp sản phẩm người dùng cụ thể. Hai ma trận sau đây là tương tự, nhưng thứ hai là suy luận từ cái đầu tiên bằng cách thay thế xếp hạng hiện tại bằng số thứ nhất và thiếu xếp hạng theo số không. Ma trận kết quả là một bảng chân trị, trong đó số một thể hiện sự tương tác giữa người dùng với một sản phẩm.

Có hai cách tiếp cận riêng biệt để sử dụng collaborative filter:

  • Memory-based filtering tính toán sự tương đồng giữa các sản phẩm hoặc người dùng.
  • Model-based filtering cố gắng tìm hiểu cơ bản để chỉ ra cách người dùng đánh giá hoặc tương tác với các mặt hàng.

Giải pháp này sử dụng cách tiếp cận dựa trên mô hình, nơi mà người dùng đánh giá các mặt hàng.

Tất cả các phân tích các tính năng giải pháp này đòi hỏi có sẵn thông qua PySpark, cung cấp một giao diện Python với ngôn ngữ lập trình Spark. Các tùy chọn khác có sẵn bằng cách sử dụng Scala hoặc Java. Xem thêm tại Spark documentation

Training cho các models

Spark MLlib thực hiện thuật toán Alternating Least Squares (ALS) để huấn luyện các mô hình. Bạn sẽ sử dụng các kết hợp khác nhau của các thông số sau để có được sự thỏa hiệp tốt nhất giữa phương sai và xu hướng:

  • Rank: Số yếu tố không xác định khiến người dùng đưa ra xếp hạng. Các yếu tố này có thể bao gồm các yếu tố như tuổi, giới tính hoặc vị trí. Xếp hạng càng cao, khuyến cáo sẽ càng tốt ở một mức độ nào đó. Bắt đầu từ 5 và tăng trên 5 cho đến khi tốc độ cải tiến đề xuất chậm lại, bộ nhớ và CPU cho phép, là một cách tiếp cận tốt.
  • Lambda: Một thông số regularization để ngăn chặn overfitting, đại diện bởi phương sai cao, và xu hướng thấp. Sự khác biệt thể hiện mức độ dự báo dao động ở một điểm nhất định, qua nhiều lần chạy, so với giá trị chính xác về mặt lý thuyết cho điểm đó.Xu hướng thể hiện mức độ xa những dự đoán được tạo ra từ giá trị đích thực mà bạn đang dự đoán. Việc overfitting xảy ra khi mô hình hoạt động tốt trên việc huấn luyện dữ liệu bằng cách sử dụng các nhiễu số đã biết nhưng không thực hiện tốt trên dữ liệu thử nghiệm thực tế. Các lambda cao hơn, thấp hơn overfitting nhưng sự xu hướng lớn hơn. Các giá trị 0,01, 1 và 10 là các giá trị tốt để kiểm tra.
    Sơ đồ dưới đây cho thấy mối quan hệ giữa sự sai lệch và xu hướng. Các bullseye đại diện cho giá trị mà các thuật toán đang cố gắng để dự đoán.
Variance versus Bias (best is on the top left)

 

  • Iteration: Số lần huấn luyện sẽ chạy. Trong ví dụ này, bạn sẽ làm 5, 10, và 20 lặp cho các kết hợp khác nhau của cấp bậc và lambda.
from pyspark.mllib.recommendation import ALS
model = ALS.train(training, rank = 10, iterations = 5, lambda_=0.01)

Finding the right model

Việc collaborative filter sử dụng thuật toán ALS dựa trên ba bộ dữ liệu khác nhau:

  • Training set: Bao gồm dữ liệu có đầu ra đã biết. Bộ này là kết quả hoàn hảo. Trong giải pháp này, nó chứa các xếp hạng của người dùng.
  • Validating set: Bao gồm dữ liệu sẽ giúp điều chỉnh quá trình đào tạo để chọn đúng sự kết hợp của các thông số và chọn mô hình tốt nhất.
  • Testing set: Bao gồm dữ liệu sẽ được sử dụng để đánh giá hiệu suất của mô hình được đào tạo tốt nhất. Điều này sẽ tương đương với việc chạy phân tích trong một ví dụ thực tế.

Để tìm ra mô hình tốt nhất, bạn cần phải tính sai số gốc-trung bình-vuông (RMSE) dựa trên mô hình đã được tính toán, bộ xác nhận và kích thước của nó. Các RMSE thấp hơn, mô hình tốt hơn.

Tham khảo: Machine Learing job in Vietnam

(còn tiếp)

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

5 dấu hiệu đã đến lúc bạn nên nghỉ việc

5 dấu hiệu đã đến lúc bạn nên nghỉ việc

1. Bạn bị phân tâm suốt cả ngày làm việc

Luôn có những thời khắc mà tâm trí bạn không hoàn toàn đặt vào công việc và điều đó quả thật rất bình thường. Tuy nhiên, nếu bạn bị phân tâm suốt cả ngày và mỗi ngày trong tuần thì đó là dấu hiệu bạn đang gặp vấn đề. Khi tâm trí bạn lang thang đâu đó ngay cả khi bạn đang có rất nhiều công việc cần hoàn thành, thì đó là dấu hiệu của việc chán nản công việc hiện tại.

Quan trọng hơn, nếu bạn quá phân tâm đến mức không thể hoàn thành xong bất kỳ một công việc nào, và bạn hiểu rằng bạn đang khiến công ty thất thu nhưng không có một cảm xúc gì về việc này, thì đó chính là thời điểm bạn nên nghỉ việc. Hãy nhớ rằng nếu bạn thực sự yêu thích việc mình đang làm, bạn sẽ có cảm giác tội lỗi khi làm phí phạm thời gian quý báu và nguồn lực của công ty. Vì vậy, hãy nghỉ việc ngay trước khi quá muộn.

2.Bạn sợ thứ hai nhưng luôn mong ngóng đến thứ sáu

Thứ hai luôn là một ngày nặng nề nhưng nếu bạn bắt đầu cảm thấy thời gian trôi qua thật lâu mới đến thứ sáu và cuối tuần trôi qua trong nháy mặt thì đấy chính là thời điểm bạn nên cân nhắc nghỉ việc. Và nếu bạn cũng chẳng thể tận hưởng cuối tuần là mấy bởi nỗi lo nơm nớp thứ hai đang đến gần thì thực sự là bạn cần chuyển việc.

Cuối tuần nên là thời gian để bạn tận hưởng, thư giãn, và làm những việc bạn không có thời gian làm trong suốt tuần qua. Nếu bạn không thể thư giãn đơn giản bởi cái bóng đen đáng sợ của thứ hai thì bạn nên nghỉ việc và tìm kiếm một công việc khác, một công việc mà bạn luôn mong chờ đến thứ hai để được đi làm chứ không phải sợ ngày này. Cuối cùng, nếu bạn bắt đầu muốn nghỉ một ngày nào đó giữa tuần để khiến tuần làm việc ngắn lại, thì bạn nên xin nghỉ việc thay vì để bị công ty chấm dứt hợp đồng làm việc bởi kỷ luật lao động.

3. Giá trị bản thân bạn không còn phù hợp với công ty

Đây là một dấu hiệu rõ ràng và dễ nhận biết nhất về thời điểm nghỉ việc của bạn. Đây cũng là dấu hiệu duy nhất cạn có thể sử dụng như là lý do xin nghỉ việc trong buổi phỏng vấn với một công ty khác mà không gây hại đến cơ hội có được công việc làm mới.

Khi giá trị của bạn không còn phù hợp với công ty nữa, bạn sẽ bắt đầu nghi ngờ mọi thứ mà họ nói với bạn. Các mục tiêu nghề nghiệp bắt đầu mờ dần và rời ra khỏi những ảnh hưởng của công ty lên hiệu suất làm việc của bạn. Để trở thành người làm việc hiệu quả và chuyên nghiệp nhất, điều quan trọng nhất là bạn cần tin vào mục tiêu mà cậu và công ty đang làm việc hết sức mình để đạt được. Nếu bạn nhận ra rằng giá trị của bạn không còn phù hợp với công ty nữa, hãy nghỉ việc.

4. Bạn lập tức cho công ty ra khỏi đầu ngay khi vừa bước ra khỏi văn phòng

Công ty là một phần cuộc sống của bạn. Những người yêu thích những gì họ làm luôn suy nghĩ về việc làm cách nào để tăng thêm giá trị của bản thân vào các công việc trong công ty ngay cả khi họ đã rời khỏi công sở. Họ nghĩ về điều họ muốn làm trong ngày tiếp theo và lên kế hoạch về những việc bạn cần đạt được vào ngày mai. Nếu tâm trí của bạn đóng lại ngay sau khi bạn rời công sở, đó chính là thời điểm bạn nên rời công ty.

Bạn không cần suy nghĩ về công việc mỗi ngày nhưng khi bạn không hề nghĩ gì đến công việc nữa thì đó là dấu hiệu đáng để lo lắng. Nếu bạn coi công việc chỉ là công việc, đây chính xác là điều sẽ diễn ra. Có lẽ đã đến lúc bạn nên tìm xem đâu là niềm đam mê đích thực của bạn và theo đuổi nó thay vì cứ mãi ở lại công ty mà bạn không muốn làm việc

5. Bạn hay phàn nàn về công việc với người khác

Chắc chắn rằng có những người trong công sở luôn phàn nàn về công việc nơi công sở. Bạn chắc chắn đã gặp những người này trước đây và cố gắng tránh họ như tránh dịch bệnh để sự tiêu cực từ họ không lây lan sang bạn. Khi bạn bắt đầu trở thành người như họ và thực sự tận hưởng việc đi cùng với họ để cùng phàn nàn, rên rỉ và bức xúc về công việc, đó chính là thời điểm bạn nên nói lời tạm biệt.

Sự tiêu cực nơi công sở không bao giờ là điều tốt. Nó sẽ kéo bạn xuống và ngăn bạn hoàn thành công việc được giao. Trước khi nhận ra nó, bạn sẽ mang theo cảm giác tiêu cực này ngay cả khi rời khỏi công sở. Bạn sẽ bắt đầu kể về những điều tiêu cực nơi công sở với gia đình, bạn bè, và ngay cả với những người không muốn nghe bạn nói. Điều này là không lành mạnh và bạn cần dành năng lượng của bản thân để làm những việc khác trong công sở.

Quyết định nghỉ việc và theo đuổi những điều bạn đam mê không nên là quyết định hời hợt. Dĩ nhiên luôn có những yếu tố bạn cần xem xét và những dấu hiệu ở trên là chất xúc tác khiến bạn ra quyết định nhanh hơn.

Thái độ của bạn đối với công việc là thước đo để biết rõ bạn cần quyết định nghỉ hay không. Tuy nhiên, trước khi ra bất kỳ quyết định gì, bạn cần thay đổi cách nhìn nhận của mình về công việc và xem mình có thể thay đổi được bất kỳ điều gì hay không. Nếu không, đấy đúng là thời điểm để bạn tìm kiếm và khám phá những cơ hội việc làm khác ở ngoài kia.

Nguồn: Applancer Careers

12 điều cực “cool” mà bạn có thể làm với Github

#1 Edit code trên GitHub.com

Bắt đầu với điều mà hẳn mọi người đều đã biết khi vào Github.

Với GitHub, khi bạn truy cập vào một file, có một icon hình bút chì ở phía trên góc phải màn hình. Nếu bạn click vào thì sẽ được cho phép edit file. Sau khi xong thì nhấn Propose file change và GitHub sẽ cập nhật fork repo cho bạn và tạo một pull request. Tất cả đều hoàn toàn tự động.

Đây là một cách rất hay để sửa typo và edit code.

#2 Paste images

Bạn sẽ không cần phải lo việc bị giới hạn chỉ với text trong comment và issue descriptions. Github còn cho phép việc ta paste trực tiếp hình ảnh từ clipboard. Nó sẽ được upload và markdown hiển thị hình ảnh ngay sau khi bạn chọn.

Khá là tuyệt đúng không?

#3 Format code

Nếu bạn muốn viết một code block, hãy bắt đầu với 3 backticks  – như những gì bạn học được sau khi đọc bài Mastering Markdown – Và GitHub sẽ đoán ngôn ngữ bạn đang viết là gì.

Tuy nhiên nếu bạn muốn post một snippet kiểu như Vue, Typescript hay JSX, bạn có thể chỉ rõ ra nhằm để được highlight đúng.

Lưu ý rằng  ```jsx ở dòng đầu tiên:

… Có nghĩa rằng snippet đã được render đúng:

Sau đây là list các lệnh hỗ trợ cú pháp.

#4 Close issues với thần chú trong PRs

Giả sử như bạn đang tạo một pull request để sửa issue #234. Bạn có thể thêm dòng “fixes #234” vào mục description của PR. Sau đó PR sẽ tự động close issue đó.

Bạn nên vào đây để tìm hiểu thêm.

#5 Link vào comments

Có những lúc bạn hẳn muốn link một comment đặc biệt nào đó nhưng lại không biết làm thế nào chưa? Đó là vì bạn chỉ chưa biết phương pháp thôi. Ta chỉ cần nhấn vào dòng hiển thị thời gian ngay kế bên tên sẽ cho phép bạn link comment.

#6 Link tới code

Thế còn link với code thì làm sao?

Hãy thử cách sau: khi vào file, click vào số thứ tự dòng code nằm kế bên code.

Ngay lập tức URL sẽ được update với dòng code đó.

#7 Dùng GitHub URL như command line

Navigate trong GitHub bằng UI hẳn là điều mà bạn vẫn thường làm. Nhưng đôi khi cách nhanh nhất là cứ type trực tiếp vào URL. Ví dụ như ta muốn nhảy thẳng tới một branch đang làm và xem sự khác biệt giữa nó với master, tôi sẽ dùng `/compare/branch-name` ngay sau tên của repo.

Còn nếu đang làm trên một integration branch thì cứ type /compare/integration-branch...my-branch

Phím tắt mà bạn cần dùng là ctrl+L or cmd+L sẽ di chuyển chuột vào URL ngay lập tức.

Ngoài ra, dùng phím mũi tên để di chuyển giữa các gợi ý từ Chrome’s auto-complete và bấm  shift+delete để xóa một item ra khỏi history.

#8 Tạo lists, trong issues

Bạn có muốn tạo một list các check box trong một issue

Và bạn có muốn thanh hiển thị chất lừ như thế này khi xem issue trong một list không?

Nếu có thì thật là tuyệt, bởi bạn có thể tạo ra chúng bằng những cú pháp sau:

- [ ] Screen width (integer)
- [x] Service worker support
- [x] Fetch support
- [ ] CSS flexbox support
- [ ] Custom elements

Không chỉ thế thanh hiển thị cũng sẽ cho bạn thấy được tiến độ của project

#9 Project boards trong GitHub

Với những project lớn tôi luôn dùng Jira và Trello cho những project nhỏ, solo.

Tuy vậy Github cũng có project board của riêng mình. Sau đây là project board của Trello:

Dưới đây là của Github:

Sức mạnh của Github project board nằm ở việc nó tích hợp toàn bộ repository nên bạn sẽ muốn add những issues có trong repo vào nó.

Nhấn vào Add Cards ở phía trên bên phải và tìm thứ mà bạn muốn thêm vào. Sau đây là những search syntax giúp bạn tìm kiếm dễ dàng hơn.

 

Không thì bạn có thể convert các notes thành những issue:

Cuối cùng, khi bạn đang xem issue, có thể add nó vào một project với panel ở phía bên phải:

Bạn sẽ thấy lợi ích của việc có ‘task’ ngay trong cùng repo khi code đang thực hiện task đó lớn đến chừng nào khi bẵng đi một thời gian và bạn phải lục lại đám code cũ kĩ. Ngay lập tức, chỉ vài giây là đã kiếm ra liền thay vì phải tốn hàng giờ có khi vài ngày tìm kiếm nếu bạn dùng Jira/Trello.

Tuy vậy với những project đòi hỏi sự tính toán chính xác về toán học, vận tốc,…. thì Github board lại không mấy là lựa chọn nổi bật.

#10 GitHub wiki

Đây là một nguồn thông tin vô cùng tuyệt vời. Nó hoạt động tương tự như wiki vậy.

Dù rằng nếu bạn muốn một nguồn thông tin có sự sắp sếp rõ ràng, đàng hoàng với những tính năng thoải mái thì có lẽ Github wiki không phải là nơi bạn sẽ muốn tới.

Nhìn qua hẳn bạn cũng hiểu nó sẽ không thể đấu lại so với GitBook nhưng ít ra cũng đươc 80%.

Tôi khuyên là bạn nên cân nhắc tới Gwiki khi đã chán đọc những hướng dẫn khô khan trong  README.md file. Sau đó nếu bạn cảm thấy Gwiki thật sự quá khó sử dụng cũng như “rối rắm” thì hãy kiếm những nguồn khác.

#11 GitHub Pages (với Jekyll)

Bạn hẳn cũng đã biết ta có thể dùng GitHub Pages để host một site số liệu. Tuy vậy, điều đặc biệt ở đây là ta sẽ dùng tới Jekyll để tạo ra một site.

Nói một cách đơn giản là GitHub Pages + Jekyll sẽ render README.md trong một theme khá đẹp.

Nếu tôi click vào ‘settings’ tab trong GitHub, mở GitHub Pages, và chọn một Jekyll theme…

Tôi sẽ có được một Jekyll-themed page:

Kể từ đây tôi đã có thể tạo ra một site hoàn chỉnh với markdown files vốn rất dễ edit, nói cách khác GitHub như là CMS vậy.

Đó cũng chính là cách React và Bootstrap sites được tạo ra.

Nhưng cần lưu ý rằng nó sẽ phải có Ruby để chạy (run locally).

Cứ mỗi lần tôi nhìn vào một GitHub Pages + Jekyll, tôi càng nhận ra nó thật là lạ. Ý tưởng đơn giản mọi thứ trong website của bạn rất là hay. Tuy vậy bạn vẫn sẽ phải set up nhiều thứ để cho nó chạy được, nói cách khác, sẽ phải dùng rất nhiều CLI commands chỉ để cho thứ mà ta cho là “đơn giản”.

#12 Dùng GitHub như một CMS

Giả sử như bạn có một website với text trong đó, nhưng bạn không muốn lưu trữ text đó vào trong HTML markup.

Thay vào đó, bạn muốn lưu vào chỗ nào đấy để cho các bạn không phải là developer vẫn có thể edit nó được.

Theo tôi, hãy dùng markdown files có trong repository để chứa những text đó. Sau đó, có một component trong front end  để fetch text và render nó lên page.

Tôi thì hay xài React nên sau đây là một ví dụ của  <Markdown> component, với chức năng fetch, parse và render text như HTML.

class Markdown extends React.Component {
    constructor(props) {
      super(props);
      
      // replace with your URL, obviously
      this.baseUrl = 'https://raw.githubusercontent.com/davidgilbertson/about-github/master/text-snippets';
      
      this.state = {
        markdown: '',
      };
    }

    componentDidMount() {
      fetch(`${this.baseUrl}/${this.props.url}`)
        .then(response => response.text())
        .then((markdown) => {
          this.setState({markdown});
        });
    }

    render() {
      return (
        <div dangerouslySetInnerHTML={{__html: marked(this.state.markdown)}} />
      );
    }
}

Trong ví dụ trên, tôi có sẵn một số markdown files trong /text-snippets.

Bạn sẽ phải dùng những component như thế này:

const Page = () => (
  <div className="page">
    <div className="about-us">
      <Markdown url="about-us.md" />
    </div>
    
    <div className="disclaimer">
      <p>A very important disclaimer:</p>
      
      <Markdown url="disclaimers/home-page-disclaimer.md" />
    </div>
  </div>
);

GitHub  giờ là như một CMS. Tuy vậy, nó chỉ dẫn đến markdown sau khi component đã được gắn trong trình duyệt web. Nếu bạn muốn một site dữ liệu thì sẽ phải server-render nó.

Bonus – GitHub tools!

Tôi thường dùng Octotree Chrome extension và sự thật là nó khá là tuyệt. Thế nên bạn cũng hãy thử dùng qua.

 

Từ clip này, tôi học về octobox, một inbox cho GitHub issues. Phải nói là nó giúp ích rất nhiều cho công việc của bạn.

Ngoài ra, để cho thêm phần dễ nhìn, tôi có dùng Stylish Chrome extension, GitHub Dark style và Atom One Dark Theme dành cho Chrome.

Nguồn: blog.topdev.vn via Hackernoon

Tham khảo việc làm GIT lương cao tại TopDev