Home Blog Page 173

Bỏ túi Cheatsheet React cho năm 2023 (kèm ví dụ thực tế)

Nhắc đến Cheatsheet thì bài viết này không hẳn chỉ là bản tóm tắt những tính năng của React. Trong quá trình làm việc với React, tôi đã đúc kết một số kiến thức thực tế và pattern từ kinh nghiệm bản thân. Mỗi phần trong bài viết này sẽ hướng dẫn chi tiết về React cùng những ví dụ thực tế.

CORE CONCEPTS

Các element và JSX

  • Cú pháp căn bản cho một React element:
// In a nutshell, JSX allows us to write HTML in our JS
// JSX can use any valid html tags (i.e. div/span, h1-h6, form/input, etc)
<div>Hello React</div>
  • Cú pháp JSX là expressions
// as an expression, JSX can be assigned to variables...
const greeting = <div>Hello React</div>;

const isNewToReact = true;

// ... or can be displayed conditionally
function sayGreeting() {
  if (isNewToReact) {
    // ... or returned from functions, etc.
    return greeting; // displays: Hello React
  } else {
    return <div>Hi again, React</div>;
  }
}
  • JSX cho phép nest expressions
const year = 2020;
// we can insert primitive JS values in curly braces: {}
const greeting = <div>Hello React in {year}</div>;
// trying to insert objects will result in an error
  • JSX cho phép nest các elements:
// to write JSX on multiple lines, wrap in parentheses: ()
const greeting = (
  // div is the parent element
  <div>
    {/* h1 and p are child elements */}
    <h1>Hello!</h1>
    <p>Welcome to React</p>
  </div>
);
// 'parents' and 'children' are how we describe JSX elements in relation
// to one another, like we would talk about HTML elements
  • HTML và JSX có sự khác biệt một ít về cú pháp
// Empty div is not <div></div> (HTML), but <div/> (JSX)
<div/>

// A single tag element like input is not <input> (HTML), but <input/> (JSX)
<input name="email" />

// Attributes are written in camelcase for JSX (like JS variables
<button className="submit-button">Submit</button> // not 'class' (HTML)
  • App React cơ bản nhất yêu cầu 3 thứ
  • ReactDOM.render() để render app
  • Một JSX element (được gọi là root node)
  • Một DOM element để mount app (thường là một div với một id của root trong index.html file)
// imports needed if using NPM package; not if from CDN links
import React from "react";
import ReactDOM from "react-dom";

const greeting = <h1>Hello React</h1>;

// ReactDOM.render(root node, mounting point)
ReactDOM.render(greeting, document.getElementById("root"));

Component và Prop của React

  • Cấu trúc cho một component React cơ bản
import React from "react";

// 1st component type: function component
function Header() {
  // function components must be capitalized unlike normal JS functions
  // note the capitalized name here: 'Header'
  return <h1>Hello React</h1>;
}

// function components with arrow functions are also valid
const Header = () => <h1>Hello React</h1>;

// 2nd component type: class component
// (classes are another type of function)
class Header extends React.Component {
  // class components have more boilerplate (with extends and render method)
  render() {
    return <h1>Hello React</h1>;
  }
}
  • Cách sử dụng components
// do we call these function components like normal functions?

// No, to execute them and display the JSX they return...
const Header = () => <h1>Hello React</h1>;

// ...we use them as 'custom' JSX elements
ReactDOM.render(<Header />, document.getElementById("root"));
// renders: <h1>Hello React</h1>
  • Component có thể sử dụng lại trong app
// for example, this Header component can be reused in any app page

// this component shown for the '/' route
function IndexPage() {
  return (
    <div>
      <Header />
      <Hero />
      <Footer />
    </div>
  );
}

// shown for the '/about' route
function AboutPage() {
  return (
    <div>
      <Header />
      <About />
      <Testimonials />
      <Footer />
    </div>
  );
}
  • Data có thể chuyển đến component với prop
// What if we want to pass data to our component from a parent?
// I.e. to pass a user's name to display in our Header?

const username = "John";

// we add custom 'attributes' called props
ReactDOM.render(
  <Header username={username} />,
  document.getElementById("root")
);
// we called this prop 'username', but can use any valid JS identifier

// props is the object that every component receives as an argument
function Header(props) {
  // the props we make on the component (i.e. username)
  // become properties on the props object
  return <h1>Hello {props.username}</h1>;
}
  • Props không thể thay đổi được (mutated)
// Components must ideally be 'pure' functions.
// That is, for every input, we be able to expect the same output

// we cannot do the following with props:
function Header(props) {
  // we cannot mutate the props object, we can only read from it
  props.username = "Doug";

  return <h1>Hello {props.username}</h1>;
}
// But what if we want to modify a prop value that comes in?
// That's where we would use state (see the useState section)
  • Chúng ta có thể dùng children prop khi muốn chuyển element/component như là props đến các component khác
// Can we accept React elements (or components) as props?
// Yes, through a special property on the props object called 'children'

function Layout(props) {
  return <div className="container">{props.children}</div>;
}

// The children prop is very useful for when you want the same
// component (such as a Layout component) to wrap all other components:
function IndexPage() {
  return (
    <Layout>
      <Header />
      <Hero />
      <Footer />
    </Layout>
  );
}

// different page, but uses same Layout component (thanks to children prop)
function AboutPage() {
  return (
    <Layout>
      <About />
      <Footer />
    </Layout>
  );
}
  • Hiển thị có điều kiện các components với ternaries và short-circuiting
// if-statements are fine to conditionally show , however...
// ...only ternaries (seen below) allow us to insert these conditionals
// in JSX, however
function Header() {
  const isAuthenticated = checkAuth();

  return (
    <nav>
      <Logo />
      {/* if isAuth is true, show AuthLinks. If false, Login  */}
      {isAuthenticated ? <AuthLinks /> : <Login />}
      {/* if isAuth is true, show Greeting. If false, nothing. */}
      {isAuthenticated && <Greeting />}
    </nav>
  );
}
  • Fragment là các components được dùng để hiển thị các loại component mà không cần thêm element vào DOM.
  • Fragments phù hợp với conditional logic
// we can improve the logic in the previous example
// if isAuthenticated is true, how do we display both AuthLinks and Greeting?
function Header() {
  const isAuthenticated = checkAuth();

  return (
    <nav>
      <Logo />
      {/* we can render both components with a fragment */}
      {/* fragments are very concise: <> </> */}
      {isAuthenticated ? (
        <>
          <AuthLinks />
          <Greeting />
        </>
      ) : (
        <Login />
      )}
    </nav>
  );
}
  5 dự án React buộc phải có trong porfolio của bạn
  React: Thử làm ứng dụng đổi tỷ giá

List và key

Dùng .map() để chuyển mảng list of data  vào list of elements:

const people = ["John", "Bob", "Fred"];
const peopleList = people.map(person => <p>{person}</p>);

.map() cũng được dùng cho components như là elements:

function App() {
  const people = ['John', 'Bob', 'Fred'];
  // can interpolate returned list of elements in {}
  return (
    <ul>
      {/* we're passing each array element as props */}
      {people.map(person => <Person name={person} />}
    </ul>
  );
}

function Person({ name }) {
  // gets 'name' prop using object destructuring
  return <p>this person's name is: {name}</p>;
}

Mỗi React element được lặp lại cần một ‘key’ props. Keys là nhân tố cần thiết để React theo dõi từng element được lặp lại với map.

Nếu không có Keys thì sẽ khó để update các element khi data thay đổi. Và Keys phải là các giá trị duy nhất để thể hiện rằng các elements này tách biệt với nhau.

function App() {
  const people = ['John', 'Bob', 'Fred'];

  return (
    <ul>
      {/* keys need to be primitive values, ideally a generated id */}
      {people.map(person => <Person key={person} name={person} />)}
    </ul>
  );
}

// If you don't have ids with your set of data or unique primitive values,
// you can use the second parameter of .map() to get each elements index
function App() {
  const people = ['John', 'Bob', 'Fred'];

  return (
    <ul>
      {/* use array element index for key */}
      {people.map((person, i) => <Person key={i} name={person} />)}
    </ul>
  );
}

Events và Event Handlers

Events trong React và HTML có sự khác biệt nhỏ

// Note: most event handler functions start with 'handle'
function handleToggleTheme() {
  // code to toggle app theme
}

// in html, onclick is all lowercase
<button onclick="handleToggleTheme()">
  Submit
</button>

// in JSX, onClick is camelcase, like attributes / props
// we also pass a reference to the function with curly braces
<button onClick={handleToggleTheme}>
  Submit
</button>

Hai thứ quan trọng nhất trong React events là onClick và onChange

  • onClick xử lý click events trên JSX element (được gọi là buttons)
  • onChange thì xử lý keyboard events (được gọi là inputs)
function App() {
  function handleChange(event) {
    // when passing the function to an event handler, like onChange
    // we get access to data about the event (an object)
    const inputText = event.target.value;
    const inputName = event.target.name; // myInput
    // we get the text typed in and other data from event.target
  }

  function handleSubmit() {
    // on click doesn't usually need event data
  }

  return (
    <div>
      <input type="text" name="myInput" onChange={handleChange} />
      <button onClick={handleSubmit}>Submit</button>
    </div>
  );
}

React Hooks

State và useState

useState cho phép chúng ta khai báo local state trong Function Component:

import React from 'react';

// create state variable
// syntax: const [stateVariable] = React.useState(defaultValue);
function App() {
  const [language] = React.useState('javascript');
  // we use array destructuring to declare state variable

  return <div>I am learning {language}</div>;
}

Ghi chú: Bất kỳ hook trong phần này được lấy từ React packafe và có thể import riêng lẻ.

import React, { useState } from "react";

function App() {
  const [language] = useState("javascript");

  return <div>I am learning {language}</div>;
}

useState cũng cho chúng ta chức năng ‘setter’ để update các state mà nó tạo

function App() {
  // the setter function is always the second destructured value
  const [language, setLanguage] = React.useState("python");
  // the convention for the setter name is 'setStateVariable'

  return (
    <div>
      {/*  why use an arrow function here instead onClick={setterFn()} ? */}
      <button onClick={() => setLanguage("javascript")}>
        Change language to JS
      </button>
      {/*  if not, setLanguage would be called immediately and not on click */}
      <p>I am now learning {language}</p>
    </div>
  );
}

// note that whenever the setter function is called, the state updates,
// and the App component re-renders to display the new state

useState có thể sử dụng một hoặc nhiều lần với single component:

function App() {
  const [language, setLanguage] = React.useState("python");
  const [yearsExperience, setYearsExperience] = React.useState(0);

  return (
    <div>
      <button onClick={() => setLanguage("javascript")}>
        Change language to JS
      </button>
      <input
        type="number"
        value={yearsExperience}
        onChange={event => setYearsExperience(event.target.value)}
      />
      <p>I am now learning {language}</p>
      <p>I have {yearsExperience} years of experience</p>
    </div>
  );
}

useState chấp nhận các value primitive hay object để quản lý state:

// we have the option to organize state using whatever is the
// most appropriate data type, according to the data we're tracking
function App() {
  const [developer, setDeveloper] = React.useState({
    language: "",
    yearsExperience: 0
  });

  function handleChangeYearsExperience(event) {
    const years = event.target.value;
    // we must pass in the previous state object we had with the spread operator
    setDeveloper({ ...developer, yearsExperience: years });
  }

  return (
    <div>
      {/* no need to get prev state here; we are replacing the entire object */}
      <button
        onClick={() =>
          setDeveloper({
            language: "javascript",
            yearsExperience: 0
          })
        }
      >
        Change language to JS
      </button>
      {/* we can also pass a reference to the function */}
      <input
        type="number"
        value={developer.yearsExperience}
        onChange={handleChangeYearsExperience}
      />
      <p>I am now learning {developer.language}</p>
      <p>I have {developer.yearsExperience} years of experience</p>
    </div>
  );
}

Nếu state mới phụ thuộc vào state trước đó, để đảm bảo update đã hoàn tất, chúng ta có thể dùng một function trong setter function đưa ra chính xác state trước đó.

function App() {
  const [developer, setDeveloper] = React.useState({
    language: "",
    yearsExperience: 0,
    isEmployed: false
  });

  function handleToggleEmployment(event) {
    // we get the previous state variable's value in the parameters
    // we can name 'prevState' however we like
    setDeveloper(prevState => {
      return { ...prevState, isEmployed: !prevState.isEmployed };
      // it is essential to return the new state from this function
    });
  }

  return (
    <button onClick={handleToggleEmployment}>Toggle Employment Status</button>
  );
}

Side effects và useEffect

useEffect cho phép thực hiện side effect bên trong các function component. Vậy các side effect là những gì?

  • Sử dụng side effects khi chúng ta cần “đụng” đến thế giới bên ngoài. Ví dụ như fetching data từ API hay làm việc với DOM.
  • Side effect là các hành động có thể thay đổi component state.

useEffect chấp nhận callback function (hay còn được gọi là ‘effect’ function), được chạy mặc định mỗi lần re-render. Nó chạy một lần khi component mount, cũng là thời điểm phù hợp để thực hiện side effect trong một lifecycle của component.

// what does our code do? Picks a color from the colors array
// and makes it the background color
function App() {
  const [colorIndex, setColorIndex] = React.useState(0);
  const colors = ["blue", "green", "red", "orange"];

  // we are performing a 'side effect' since we are working with an API
  // we are working with the DOM, a browser API outside of React
  useEffect(() => {
    document.body.style.backgroundColor = colors[colorIndex];
  });
  // whenever state is updated, App re-renders and useEffect runs

  function handleChangeIndex() {
    const next = colorIndex + 1 === colors.length ? 0 : colorIndex + 1;
    setColorIndex(next);
  }

  return <button onClick={handleChangeIndex}>Change background color</button>;
}

Để tránh thực hiện callback sau mỗi lần render, chúng ta có thể tạo arguement thứ 2 là một array (mảng) trống:

function App() {
  ...
  // now our button doesn't work no matter how many times we click it...
  useEffect(() => {
    document.body.style.backgroundColor = colors[colorIndex];
  }, []);
  // the background color is only set once, upon mount

  // how do we not have the effect function run for every state update...
  // but still have it work whenever the button is clicked?

  return (
    <button onClick={handleChangeIndex}>
      Change background color
    </button>
  );
}

useEffect cho phép chúng ta thực hiện các effect với các mảng dependencies.

Mảng dependencies là arguement thứ hai, nếu có một trong những giá trị trong mảng thay đổi, thì effect function sẽ chạy lại.

function App() {
  const [colorIndex, setColorIndex] = React.useState(0);
  const colors = ["blue", "green", "red", "orange"];

  // we add colorIndex to our dependencies array
  // when colorIndex changes, useEffect will execute the effect fn again
  useEffect(() => {
    document.body.style.backgroundColor = colors[colorIndex];
    // when we use useEffect, we must think about what state values
    // we want our side effect to sync with
  }, [colorIndex]);

  function handleChangeIndex() {
    const next = colorIndex + 1 === colors.length ? 0 : colorIndex + 1;
    setColorIndex(next);
  }

  return <button onClick={handleChangeIndex}>Change background color</button>;
}

useEffect cho phép chúng ta unsubscribe những effect nhất định bằng cách trả lại function vào lúc cuối:

function MouseTracker() {
  const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });

  React.useEffect(() => {
    // .addEventListener() sets up an active listener...
    window.addEventListener("mousemove", event => {
      const { pageX, pageY } = event;
      setMousePosition({ x: pageX, y: pageY });
    });

    // ...so when we navigate away from this page, it needs to be
    // removed to stop listening. Otherwise, it will try to set
    // state in a component that doesn't exist (causing an error)

    // We unsubscribe any subscriptions / listeners w/ this 'cleanup function'
    return () => {
      window.removeEventListener("mousemove", event => {
        const { pageX, pageY } = event;
        setMousePosition({ x: pageX, y: pageY });
      });
    };
  }, []);

  return (
    <div>
      <h1>The current mouse position is:</h1>
      <p>
        X: {mousePosition.x}, Y: {mousePosition.y}
      </p>
    </div>
  );
}

// Note: we could extract the reused logic in the callbacks to
// their own function, but I believe this is more readable

Fetching data với useEffect

Nên chú ý khi xử lý các promise với các cú pháp async/await ngắn gọn yêu cầu phải tạo thêm function riêng biệt (Vì effect callback function không thể async.)

const endpoint = "https://api.github.com/users/codeartistryio";

// with promises:
function App() {
  const [user, setUser] = React.useState(null);

  React.useEffect(() => {
    // promises work in callback
    fetch(endpoint)
      .then(response => response.json())
      .then(data => setUser(data));
  }, []);
}

// with async / await syntax for promise:
function App() {
  const [user, setUser] = React.useState(null);
  // cannot make useEffect callback function async
  React.useEffect(() => {
    getUser();
  }, []);

  // instead, use async / await in separate function, then call
  // function back in useEffect
  async function getUser() {
    const response = await fetch("https://api.github.com/codeartistryio");
    const data = await response.json();
    setUser(data);
  }
}

Performance và useCallback

useCallback là một hook được sử dụng để cải thiện performance của component.

Nếu có một component thường xuyên re-render, useCallback sẽ ngăn chặn tình trạng callback functions trong component được tạo lại mỗi lần component re-render (đồng nghĩa với việc function component re-run).

useCallback re-run chỉ khi một trong những dependencies thay đổi.

// in Timer, we are calculating the date and putting it in state a lot
// this results in a re-render for every state update

// we had a function handleIncrementCount to increment the state 'count'...
function Timer() {
  const [time, setTime] = React.useState();
  const [count, setCount] = React.useState(0);

  // ... but unless we wrap it in useCallback, the function is
  // recreated for every single re-render (bad performance hit)
  // useCallback hook returns a callback that isn't recreated every time
  const inc = React.useCallback(
    function handleIncrementCount() {
      setCount(prevCount => prevCount + 1);
    },
    // useCallback accepts a second arg of a dependencies array like useEffect
    // useCallback will only run if any dependency changes (here it's 'setCount')
    [setCount]
  );

  React.useEffect(() => {
    const timeout = setTimeout(() => {
      const currentTime = JSON.stringify(new Date(Date.now()));
      setTime(currentTime);
    }, 300);

    return () => {
      clearTimeout(timeout);
    };
  }, [time]);

  return (
    <div>
      <p>The current time is: {time}</p>
      <p>Count: {count}</p>
      <button onClick={inc}>+</button>
    </div>
  );
}

Memorization và useMemo

useMemo khá tương tự với useCallback và để cải thiện hiệu năng. Thay vì dùng để callback, nó được dùng để lưu lại kết quả của hàm nào và những giá trị nào sẽ làm thay đổi kết quả đó.

// useMemo is useful when we need a lot of computing resources
// to perform an operation, but don't want to repeat it on each re-render

function App() {
  // state to select a word in 'words' array below
  const [wordIndex, setWordIndex] = useState(0);
  // state for counter
  const [count, setCount] = useState(0);

  // words we'll use to calculate letter count
  const words = ["i", "am", "learning", "react"];
  const word = words[wordIndex];

  function getLetterCount(word) {
    // we mimic expensive calculation with a very long (unnecessary) loop
    let i = 0;
    while (i < 1000000) i++;
    return word.length;
  }

  // Memoize expensive function to return previous value if input was the same
  // only perform calculation if new word without a cached value
  const letterCount = React.useMemo(() => getLetterCount(word), [word]);

  // if calculation was done without useMemo, like so:

  // const letterCount = getLetterCount(word);

  // there would be a delay in updating the counter
  // we would have to wait for the expensive function to finish

  function handleChangeIndex() {
    // flip from one word in the array to the next
    const next = wordIndex + 1 === words.length ? 0 : wordIndex + 1;
    setWordIndex(next);
  }

  return (
    <div>
      <p>
        {word} has {letterCount} letters
      </p>
      <button onClick={handleChangeIndex}>Next word</button>
      <p>Counter: {count}</p>
      <button onClick={() => setCount(count + 1)}>+</button>
    </div>
  );
}

Refs và useRef

Ref là attribute đặc biệt và luôn có sẵn trên tất cả React components. Chúng cho phép chúng ta tạo ra reference đến element/component có sẵn khi mount component.

useRef cho phép chúng ta sử dụng React Refs một cách dễ dàng. Chúng ta gọi useRef (ở top của component đó) và đính kèm giá trị trả về vào attribute ref của element đó để tham chiếu.

Khi đã tạo reference, chúng ta sử dụng property hiện có để chỉnh sửa (modify-mutate) các properties của element đó. Hoặc chúng ta có thể call bất kỳ methods nào trên element đó (như .focus() để focus một input).

function App() {
  const [query, setQuery] = React.useState("react hooks");
  // we can pass useRef a default value
  // we don't need it here, so we pass in null to ref an empty object
  const searchInput = useRef(null);

  function handleClearSearch() {
    // current references the text input once App mounts
    searchInput.current.value = "";
    // useRef can store basically any value in its .current property
    searchInput.current.focus();
  }

  return (
    <form>
      <input
        type="text"
        onChange={event => setQuery(event.target.value)}
        ref={searchInput}
      />
      <button type="submit">Search</button>
      <button type="button" onClick={handleClearSearch}>
        Clear
      </button>
    </form>
  );
}

Hooks nâng cao

Context và useContext

Trong React, chúng ta nên tránh tạo ra các multiple props để chuyển data xuống 2 hay nhiều level từ một parent component:

// Context helps us avoid creating multiple duplicate props
// This pattern is also called props drilling:
function App() {
  // we want to pass user data down to Header
  const [user] = React.useState({ name: "Fred" });

  return (
   {/* first 'user' prop */}
    <Main user={user} />
  );
}

const Main = ({ user }) => (
  <>
    {/* second 'user' prop */}
    <Header user={user} />
    <div>Main app content...</div>
  </>
);

const Header = ({ user }) => <header>Welcome, {user.name}!</header>;

Context khá hữu ích dùng để chuyển props xuống các tầng levels của child 

// Here is the previous example rewritten with Context
// First we create context, where we can pass in default values
const UserContext = React.createContext();
// we call this 'UserContext' because that's what data we're passing down

function App() {
  // we want to pass user data down to Header
  const [user] = React.useState({ name: "Fred" });

  return (
    {/* we wrap the parent component with the provider property */}
    {/* we pass data down the computer tree w/ value prop */}
    <UserContext.Provider value={user}>
      <Main />
    </UserContext.Provider>
  );
}

const Main = () => (
  <>
    <Header />
    <div>Main app content...</div>
  </>
);

// we can remove the two 'user' props, we can just use consumer
// to consume the data where we need it
const Header = () => (
  {/* we use this pattern called render props to get access to the data*/}
  <UserContext.Consumer>
    {user => <header>Welcome, {user.name}!</header>}
  </UserContext.Consumer>
);

useContect hook có thể xóa render props pattern này, tuy nhiên, để có thể consume context trong bất kỳ function component nào:

const Header = () => {
  // we pass in the entire context object to consume it
  const user = React.useContext(UserContext);
  // and we can remove the Consumer tags
  return <header>Welcome, {user.name}!</header>;
};

Reducers và useReducer

Reducer là function khá đơn giản, được dùng để lấy state object trước đó và một action object và trả về một state object mới. Ví dụ:

// let's say this reducer manages user state in our app:
function reducer(state, action) {
  // reducers often use a switch statement to update state
  // in one way or another based on the action's type property
  switch (action.type) {
    // if action.type has the string 'LOGIN' on it
    case "LOGIN":
      // we get data from the payload object on action
      return { username: action.payload.username, isAuth: true };
    case "SIGNOUT":
      return { username: "", isAuth: false };
    default:
      // if no case matches, return previous state
      return state;
  }
}

React useReducer hook là một cách hữu ích để quản lý state trong React bên cạnh useState, và nó có thể kết hợp với context dùng để quản lý state trong một ứng dụng mà có thể không cần sử dụng đến redux

Ngoài ra, sự kết hợp useReducer và useContext có thể là hệ thống quản lý state cho apps.

const initialState = { username: "", isAuth: false };

function reducer(state, action) {
  switch (action.type) {
    case "LOGIN":
      return { username: action.payload.username, isAuth: true };
    case "SIGNOUT":
      // could also spread in initialState here
      return { username: "", isAuth: false };
    default:
      return state;
  }
}

function App() {
  // useReducer requires a reducer function to use and an initialState
  const [state, dispatch] = useReducer(reducer, initialState);
  // we get the current result of the reducer on 'state'

  // we use dispatch to 'dispatch' actions, to run our reducer
  // with the data it needs (the action object)
  function handleLogin() {
    dispatch({ type: "LOGIN", payload: { username: "Ted" } });
  }

  function handleSignout() {
    dispatch({ type: "SIGNOUT" });
  }

  return (
    <>
      Current user: {state.username}, isAuthenticated: {state.isAuth}
      <button onClick={handleLogin}>Login</button>
      <button onClick={handleSignout}>Signout</button>
    </>
  );
}

Các hooks custom

Các hooks được tạo ra nhằm tái sử dụng behavior dễ dàng giữa các component. Chúng là pattern dễ hiểu hơn các loại khác của class components, như higher-order component hay render props. Chúng ta có thể tự tạo ra hook của riêng mình tùy thuộc vào nhu cầu từng dự án, bên cạnh những gì React đã có sẵn:

// here's a custom hook that is used to fetch data from an API
function useAPI(endpoint) {
  const [value, setValue] = React.useState([]);

  React.useEffect(() => {
    getData();
  }, []);

  async function getData() {
    const response = await fetch(endpoint);
    const data = await response.json();
    setValue(data);
  };

  return value;
};

// this is a working example! try it yourself (i.e. in codesandbox.io)
function App() {
  const todos = useAPI("https://todos-dsequjaojf.now.sh/todos");

  return (
    <ul>
      {todos.map(todo => <li key={todo.id}>{todo.text}</li>}
    </ul>
  );
}

Các quy tắc của hooks:

Khi sử dụng React hooks thì có 2 nguyên tắc không nên vi phạm:

  1. Hooks chỉ có thể đuợc call trên top của components (chúng không thể ở trong conditionals, loops hay nested functions).
  2. Hooks chỉ có thể sử dụng trong function components (chúng không thể dùng trong Javascript function bình thuờng hay class components).
function checkAuth() {
  // Rule 2 Violated! Hooks cannot be used in normal functions, only components
  React.useEffect(() => {
    getUser();
  }, []);
}

function App() {
  // this is the only validly executed hook in this component
  const [user, setUser] = React.useState(null);

  // Rule 1 violated! Hooks cannot be used within conditionals (or loops)
  if (!user) {
    React.useEffect(() => {
      setUser({ isAuth: false });
      // if you want to conditionally execute an effect, use the
      // dependencies array for useEffect
    }, []);
  }

  checkAuth();

  // Rule 1 violated! Hooks cannot be used in nested functions
  return <div onClick={() => React.useMemo(() => doStuff(), [])}>Our app</div>;
}

Có rất nhiều kiến thức React để học hỏi nhưng trên đây là những gì được trình bày tại bài viết này là những lớp gạch cơ bản nhất trên con đường React master trong năm 2023. Keep coding và chờ những bài viết tiếp theo nhé.

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

Xem thêm việc làm về React trên TopDev

TopDev via Freecodecamp

 

71 trích đoạn code Python cho các vấn đề hàng ngày của bạn

Để bắt đầu, mình sẽ khởi động bằng cách chuyển tất cả trích đoạn code trong bài viết này tới Jupyter Notebooks (1 nguồn mở cho phép bạn tạo và chia sẻ các live code, phương trình, hiệu ứng hình ảnh cũng như các văn bản, v..v..). Nếu bạn có hứng thú với các loại project như vầy, thì hãy tiếp tục tới the GitHub repo nhé. Mình sẽ rất trân trọng sự giúp đỡ này!

Các Vấn đề thường gặp 

Trong phần này, chúng ta sẽ xem thử các kịch bản phổ biến khác nhau thường phát sinh và làm thế nào để giải quyết chúng với code Python. Đặc biệt, mình sẽ chia sẻ qua lời giải thích ngắn gọn về vấn đề với 1 danh sách các giải pháp với code Python. Sau đó, mình sẽ link tất cả các nguồn tài nguyên mà mình có. 

Tìm việc làm python lương cao

Đảo ngược Dictionary

Đôi khi chúng ta có 1 dictionary trong tay, và muốn có thể nhảy tới đúng key và value của nó. Dĩ nhiên, có nhiều mối lo lắng như “làm cách nào để chúng ta có thể đối phó với các ‘clone value’?” và “sẽ ra sao nếu các value đang không ‘hashable’?”. Điều đó nói rằng, trong các trường hợp đơn giản, sẽ có vài cách hóa giải:

# Use to invert dictionaries that have unique values
my_inverted_dict = dict(map(reversed, my_dict.items()))

# Use to invert dictionaries that have unique values
my_inverted_dict = {value: key for key, value in my_dict.items()}

# Use to invert dictionaries that have non-unique values
from collections import defaultdict
my_inverted_dict = defaultdict(list)
{my_inverted_dict[v].append(k) for k, v in my_dict.items()}

# Use to invert dictionaries that have non-unique values
my_inverted_dict = dict()
for key, value in my_dict.items(): 
  my_inverted_dict.setdefault(value, list()).append(key)

# Use to invert dictionaries that have lists of values
my_dict = {value: key for key in my_inverted_dict for value in my_map[key]}

Để hiểu rõ hơn, hãy xem thử bài viết của mình có tựa đề “How to Invert a Dictionary in Python”. Nó bao gồm cách giải cho mỗi giải pháp, các metric hiệu suất và khi chúng có thể áp dụng được. Ngoài ra, mình còn có 1 video Youtube, cũng cover cùng đề tài này luôn.

Cộng các Element của 2 List

Hãy nói rằng bạn có 2 list, và bạn muốn merge chúng lại với nhau thành 1 list cùng element. Nói cách khác, bạn muốn thêm element đầu tiên của list thứ 1 tới element đầu của list thứ 2 và lưu trữ kết quả trong 1 list mới. Vâng, có vài cách để thực hiện điều này:

ethernet_devices = [1, [7], [2], [8374163], [84302738]]
usb_devices = [1, [7], [1], [2314567], [0]]

# The long way
all_devices = [
  ethernet_devices[0] + usb_devices[0], 
  ethernet_devices[1] + usb_devices[1], 
  ethernet_devices[2] + usb_devices[2], 
  ethernet_devices[3] + usb_devices[3], 
  ethernet_devices[4] + usb_devices[4]
]

# Some comprehension magic
all_devices = [x + y for x, y in zip(ethernet_devices, usb_devices)]

# Let's use maps
import operator 
all_devices = list(map(operator.add, ethernet_devices, usb_devices))

# We can't forget our favorite computation library
import numpy as np 
all_devices = np.add(ethernet_devices, usb_devices)

Nếu bạn muốn hiểu sâu hơn, hãy xem thử bài viết mang tựa đề “Cách tính tổng các phần tử của hai danh sách trong Python” của mình. Vốn đang mang 1 thử thách thú vị. Ngoài ra, bạn cũng có thể nhận vài thứ bổ ích từ video Youtube với cùng tựa đề của mình.

Kiểm tra 1 File có đang Tồn tại

Một trong những đặc quyền tuyệt vời của Python là nhờ sự quản lý các file 1 cách dễ dàng của nó. Không giống như Java, Python có 1 syntax built-in cho việc đọc và viết 1 file.
Kết quả là, kiểm tra 1 file nếu nó đang tồn tại là 1 nhiệm vụ khá đơn giản:

# Brute force with a try-except block (Python 3+)
try: 
  with open('/path/to/file', 'r') as fh: 
    pass
except FileNotFoundError: 
  pass

# Leverage the OS package (possible race condition)
import os 
exists = os.path.isfile('/path/to/file')

# Wrap the path in an object for enhanced functionality
from pathlib import Path
config = Path('/path/to/file') 
if config.is_file(): 
  pass

Chuyển đổi 2 List vào 1 Dictionary

Trước đó, chúng ta đã nói về Gộp 2 List trong Python. Cũng như hóa ra là, có rất nhiều thứ chúng ta có thể làm với 2 list. Ví dụ: chúng ta có thể thử map 1 cái trên 1 cái khác để tạo dictionary.

Cũng nhiều như các vấn đề này, có 1 vài sự lo ngại ở đây. Ví dụ: Sẽ ra sao nếu 2 list không cùng 1 size? Ngoài ra, sẽ ra sao nếu các key không ‘unique’ hay ‘hashable’? Điều đó có nghĩa là, trong vài trường hợp cơ bản, có 1 vài giải pháp đơn giản như sau:

column_names = ['id', 'color', 'style']
column_values = [1, 'red', 'bold']

# Convert two lists into a dictionary with zip and the dict constructor
name_to_value_dict = dict(zip(column_names, column_values))

# Convert two lists into a dictionary with a dictionary comprehension
name_to_value_dict = {key:value for key, value in zip(column_names, column_values)}

# Convert two lists into a dictionary with a loop
name_value_tuples = zip(column_names, column_values) 
name_to_value_dict = {} 
for key, value in name_value_tuples: 
  if key in name_to_value_dict: 
    pass # Insert logic for handling duplicate keys 
  else: 
    name_to_value_dict[key] = value

1 lần nữa, bạn có thể tìm cách giải thích cho mỗi giải pháp trong bài “Cách chuyển đổi 2 danh sách thành từ điển trong Python” của mình. Nếu bạn là 1 người trực quan, bạn có thể sẽ kết video Youtube của mình, với nội dung cover các mapping list tới các dictionaries.

  10 Lý do nên học Python trong năm 2024

Kiểm tra Nếu 1 List đang Trống (Empty)

Nếu bạn đang xài 1 ngôn ngữ thuộc loại  “statical” như Java hay C, bạn có thể lo ngại bởi sự thiếu hụt các loại static trong Python. Mình cam đoan rằng, việc không rành về các lọai của variable có thể gây khó chịu 1 vài lúc, nhưng không sao vì đã có vài “perk” – đặc quyền bên cạnh. Ngay lập tức, chúng ta có thể kiểm tra nếu 1 List đang trống bởi loại cơ động (flexibility) của riêng nó – bên cạnh cách phương pháp khác:

my_list = list()

# Check if a list is empty by its length
if len(my_list) == 0: 
  pass # the list is empty

# Check if a list is empty by direct comparison (only works for lists)
if my_list == []: 
  pass # the list is empty

# Check if a list is empty by its type flexibility **preferred method**
if not my_list: 
  pass # the list is empty

Tạo Bản sao (cloning) cho 1 List

1 trong những đối tượng (subject) yêu thích của mình trong lập trình chính là ‘copy các loại data – copying data types’. Sau tất cả, không có gì là dễ dàng trong thế giới dựa trên sự tương quan – reference-based mà ta đang sống, và điều này cũng tương tự trong Python. May mắn thay, nếu ta muốn copy 1 list, có vài cách để thực hiện điều này:

my_list = [27, 13, -11, 60, 39, 15]

# Clone a list by brute force
my_duplicate_list = [item for item in my_list]

# Clone a list with a slice
my_duplicate_list = my_list[:]

# Clone a list with the list constructor
my_duplicate_list = list(my_list) 

# Clone a list with the copy function (Python 3.3+)
my_duplicate_list = my_list.copy() # preferred method

# Clone a list with the copy package
import copy
my_duplicate_list = copy.copy(my_list)
my_deep_duplicate_list = copy.deepcopy(my_list)

# Clone a list with multiplication?
my_duplicate_list = my_list * 1 # do not do this

Khi nói đến ‘cloning’, việc nhận thức về sự khác biệt giữa các bản sao nông và sâu (shallow & deep copies) khá là quan trọng. May mắn thay (1 lần nữa), mình đã có 1 bài viết cover về chủ đề này.

Khôi phục Mục sau cùng của 1 List

(Retrieving the Last Item of a List)

Vì chúng có chung đề tài của các list, hãy nói về việc lấy mục sau cùng của 1 list. Trong hầu hết các ngôn ngữ, điều này khá liên quan tới một số biểu thức toán học phức tạp liên quan đến độ dài của danh sách. Và nếu mình nói với bạn rằng có vài giải pháp thú vị trong Python thì bạn cảm thấy thế nào?

my_list = ['red', 'blue', 'green']

# Get the last item with brute force using len
last_item = my_list[len(my_list) - 1]

# Remove the last item from the list using pop
last_item = my_list.pop() 

# Get the last item using negative indices *preferred & quickest method*
last_item = my_list[-1]

# Get the last item using iterable unpacking
*_, last_item = my_list

Như trên, đọc thêm bài viết “Cách lấy mục cuối cùng của danh sách trong Python”, kèm theo thử thách, metric hiệu năng và, dĩ nhiên rồi, 1 video Youtube về nó.

  Tại sao bạn nên sử dụng Python Generator

Tạo 1 Lối tắt cho Script Python

Đôi lúc khi bạn tạo 1 script, bạn sẽ muốn để chạy nó 1 cách tiện lợi bởi cú nhấp vào 1 nút. Dĩ nhiên rằng, có vài cách để thực hiện nó.

Đầu tiên, chúng ta có thể tạo 1 lối tắt Windows với thiết lập như sau:

\path\to\trc-image-titler.py -o \path\to\output

Bên cạnh, chúng ta cũng có thể tạo 1 file batch với đoạn code sau đây:

@echo off
\path\to\trc-image-titler.py -o \path\to\output

Cuối cùng, chúng ta có thể tạo 1 script batch với code sau:

#!/bin/sh
python /path/to/trc-image-titler.py -o /path/to/output

Nếu bạn đang tìm giải thích chi tiết hơn, hãy xem thử bài “Cách tạo lối tắt tập lệnh Python với các đối số”.

Sắp xếp 1 List các String

Sắp xếp là 1 task thông thường mà bạn sẽ được mong đợi để biết cách triển khai thực hiện trong ngành Khoa học Máy tính. Cho dù việc sắp xếp các thuật toán trong hầu hết các chương trình giảng dạy cần sự tập trung cao độ, không ai sẽ nói cho bạn biết về độ phức tạp mà việc sắp xếp mang lại. Ví dụ: sắp xếp các con số khá đơn giản, vậy còn sắp xếp các string sẽ ra sao? Làm cách nào để ta quyết định 1 thứ tự thích hợp? Không sao cả, có khá nhiều sự lựa chọn trong Python:  

my_list = ["leaf", "cherry", "fish"]

# Brute force method using bubble sort
my_list = ["leaf", "cherry", "fish"]
size = len(my_list)
for i in range(size): 
  for j in range(size): 
    if my_list[i] < my_list[j]: 
       temp = my_list[i] 
       my_list[i] = my_list[j] 
       my_list[j] = temp

# Generic list sort *fastest*
my_list.sort()

# Casefold list sort
my_list.sort(key=str.casefold)

# Generic list sorted
my_list = sorted(my_list) 

# Custom list sort using casefold (>= Python 3.3)
my_list = sorted(my_list, key=str.casefold) 

# Custom list sort using current locale 
import locale
from functools import cmp_to_key
my_list = sorted(my_list, key=cmp_to_key(locale.strcoll)) 

# Custom reverse list sort using casefold (>= Python 3.3)
my_list = sorted(my_list, key=str.casefold, reverse=True)

Phân tích 1 Bảng tính

(Parsing a Spreadsheet)
1 trong những trường hợp sử dụng thú vị cho Python là vì ‘data science’. Nhưng không may, tuy nhiên, điều đó có nghĩa là bạn phải xử lý rất nhiều ‘raw data’ trong các định dạng khác nhau như file văn bản và bảng tính. May mắn rằng, Python có nhiều tiện ích được built-in cho việc đọc các định dạng file khác nhau. Ví dụ, chúng ta có thể phân tích 1 bảng tính 1 cách dễ dàng bằng cách:  

# Brute force solution
csv_mapping_list = []
with open("/path/to/data.csv") as my_data: 
  line_count = 0 
  for line in my_data: 
    row_list = [val.strip() for val in line.split(",")] 
    if line_count == 0: 
      header = row_list 
    else: 
      row_dict = {key: value for key, value in zip(header, row_list)}
      csv_mapping_list.append(row_dict) 
    line_count += 1

# CSV reader solution
import csv
csv_mapping_list = []
with open("/path/to/data.csv") as my_data: 
  csv_reader = csv.reader(my_data, delimiter=",") 
  line_count = 0 
  for line in csv_reader: 
    if line_count == 0: 
      header = line 
    else: 
      row_dict = {key: value for key, value in zip(header, line)} 
      csv_mapping_list.append(row_dict) 
    line_count += 1

# CSV DictReader solution
import csv
with open("/path/to/dict.csv") as my_data: 
  csv_mapping_list = list(csv.DictReader(my_data))

Trong trường hợp này, chúng ta có thể lấy output của mình trong list các dictionary. Nếu bạn muốn biết thêm về cách hoạt động của việc này, hãy xem bài viết đầy đủ “Cách phân tích bảng tính bằng Python” của mình.

Sắp xếp 1 List các Dictionary

1 khi bạn đã có 1 list các dictionary, bạn có thể sẽ muốn tổ chức chúng trong vài trật tự cụ thể. Ví dụ: nếu các dictionary có 1 key cho date, ta có thể thử sắp xếp chúng theo thứ tự theo niên đại. May thay, sắp xếp là một nhiệm vụ tương đối nhẹ nhàng: 

csv_mapping_list = [
  { "Name": "Jeremy", "Age": 25, "Favorite Color": "Blue" }, 
  { "Name": "Ally", "Age": 41, "Favorite Color": "Magenta" }, 
  { "Name": "Jasmine", "Age": 29, "Favorite Color": "Aqua" }
]

# Custom sorting
size = len(csv_mapping_list)
for i in range(size): 
  min_index = i 
  for j in range(i + 1, size): 
    if csv_mapping_list[min_index]["Age"] > csv_mapping_list[j]["Age"]: 
      min_index = j 
      csv_mapping_list[i], csv_mapping_list[min_index] = csv_mapping_list[min_index], csv_mapping_list[i]

# List sorting function
csv_mapping_list.sort(key=lambda item: item.get("Age"))

# List sorting using itemgetter
from operator import itemgetter
f = itemgetter('Name')
csv_mapping_list.sort(key=f)

# Iterable sorted function
csv_mapping_list = sorted(csv_mapping_list, key=lambda item: item.get("Age"))

Các cách giải và nhiều chú thích hơn trong bài “Cách sắp xếp danh sách từ điển trong Python“.

Viết 1 List Comprehension

1 trong những đề tài Python yêu thích của mình là nói về các list comprehension. Như những ai đã có thời gian dài sử dụng các ngôn ngữ nhu Java, C/C++ và C#, mình chưa từng thấy thứ gì giống như là 1 list comprehension cho tới khi mình tập tành với Python. Giờ đây, mình khá là bị cuốn hút với chúng. Kết quả là, mình đã đặt chúng cùng nhau trong 1 list toàn bộ:

# Define a generic 1D list of constants
my_list = [2, 5, -4, 6]

# Duplicate a 1D list of constants
[item for item in my_list]

# Duplicate and scale a 1D list of constants
[2 * item for item in my_list]

# Duplicate and filter out non-negatives from 1D list of constants
[item for item in my_list if item < 0]

# Duplicate, filter, and scale a 1D list of constants
[2 * item for item in my_list if item < 0]

# Generate all possible pairs from two lists
[(a, b) for a in (1, 3, 5) for b in (2, 4, 6)]

# Redefine list of contents to be 2D
my_list = [[1, 2], [3, 4]]

# Duplicate a 2D list
[[item for item in sub_list] for sub_list in my_list]

# Duplicate an n-dimensional list
def deep_copy(to_copy): 
  if type(to_copy) is list: 
    return [deep_copy(item) for item in to_copy] 
  else: 
    return to_copy

Xem thêm về cách giải thích chính thức về tất cả các code này trong bài “Cách viết 1 danh sách bằng Python”. Như là quà khuyến mãi, mình có 1 video Youtube, vốn chia sẻ vài ví dụ về các list comprehension.

Gộp 2 Dictionary

Trong bộ sưu tập này, ta đã nói rất nhiều về việc xử lý các cấu trúc data như list và dictionary. Vâng, cái này cũng sẽ tương tự. Cụ thể hơn là, chúng ta đang xem về việc gộp 2 dictionary lại với nhau. Dĩ nhiên, việc hợp nhất 2 dictionary sẽ mang vài rủi ro. Ví dụ: Nếu có các key bị lặp (duplicate key) thì sẽ ra sao? Thật may vì ta sẽ có các giải pháp cho nó:

yusuke_power = {"Yusuke Urameshi": "Spirit Gun"}
hiei_power = {"Hiei": "Jagan Eye"}
powers = dict()

# Brute force
for dictionary in (yusuke_power, hiei_power): 
  for key, value in dictionary.items(): 
    powers[key] = value

# Dictionary Comprehension
powers = {key: value for d in (yusuke_power, hiei_power) for key, value in d.items()}

# Copy and update
powers = yusuke_power.copy()
powers.update(hiei_power)

# Dictionary unpacking (Python 3.5+)
powers = {**yusuke_power, **hiei_power}

# Backwards compatible function for any number of dicts
def merge_dicts(*dicts: dict): 
  merged_dict = dict() 
  for dictionary in dicts: 
    merge_dict.update(dictionary) 
  return merged_dict

Nếu bạn cũng thích, mình có 1 bài vốn cover ngay đúng đề tài này với tên “Cách hợp nhất 2 từ trong Python”, kèm theo 4 giải pháp cũng như metric hiệu năng.

Định dạng 1 String

Dù thích hay không, chúng ta cũng sẽ tự thấy rằng mình mình hay vùi dập các lệnh print xuyên suốt dòng code cho mục đích debug nhanh hơn. Sau tất cả, 1 lệnh print được đặt đúng chỗ có thể giúp bạn tiết kiệm được khá nhiều thời gian. Tuy nhiên, không phải lúc này cũng dễ dàng và tiện lợi để hiển thị đúng thứ ta muốn. Nhưng không sao cả, Python có khá nhiều lựa chọn cho ‘format’: 

name = "Jeremy"
age = 25

# String formatting using concatenation
print("My name is " + name + ", and I am " + str(age) + " years old.")

# String formatting using multiple prints
print("My name is ", end="")
print(name, end="")
print(", and I am ", end="")
print(age, end="")
print(" years old.")

# String formatting using join
print(''.join(["My name is ", name, ", and I am ", str(age), " years old"]))

# String formatting using modulus operator
print("My name is %s, and I am %d years old." % (name, age))

# String formatting using format function with ordered parameters
print("My name is {}, and I am {} years old".format(name, age))

# String formatting using format function with named parameters
print("My name is {n}, and I am {a} years old".format(a=age, n=name))

# String formatting using f-Strings (Python 3.6+)
print(f"My name is {name}, and I am {age} years old")

Hãy nghĩ rằng các giải pháp này không cần phải được dùng với lệnh print. Nói cách khác, bạn cứ thoải mái sử dụng các cách giải này như f-string bất kỳ đâu mà bạn cần.

Bài viết “Cách định dạng chuỗi trong Python” sẽ giúp bạn hiểu rõ thêm. Nếu bạn thích dùng các ‘snippet’ này, đừng quên check video Youtube của mình, có tựa là “6 Ways to Format a String in Python Featuring My Cat”.

Print trên cùng 1 Dòng

Đi cùng với dòng tương tự như việc định dạng các string, đôi lúc bạn chỉ cần để print trên cùng 1 dòng trong Python. Cũng như lệnh “ print “ hiện tại được thiết kế, nó tự động áp dụng 1 dòng mới tới cuối dòng string của bạn. May thay, có 1 vài cách bên cạnh đó:

# Python 2 only
print "Live PD",

# Backwards compatible (also fastest)
import sys
sys.stdout.write("Breaking Bad")

# Python 3 only
print("Mob Psycho 100", end="")

Xem thêm về các giải pháp này tại bài viết “Cách In trên cùng 1 dòng trong Python” cho các cách sử dụng khác và caveat của nó. 

Kiểm tra Hiệu năng

Cuối cùng, bạn đôi lúc chỉ muốn so sánh 1 vài đoạn code. Và Python có vài sự lựa chọn đơn giản dành cho bạn: 

# Brute force solution
import datetime
start_time = datetime.datetime.now()
[(a, b) for a in (1, 3, 5) for b in (2, 4, 6)] 
# example snippet
end_time = datetime.datetime.now()
print end_time - start_time

# timeit solution
import timeit
min(timeit.repeat("[(a, b) for a in (1, 3, 5) for b in (2, 4, 6)]"))

# cProfile solutionimport cProfile
cProfile.run("[(a, b) for a in (1, 3, 5) for b in (2, 4, 6)]")

Đừng quên xem thêm bài viết đầy đủ “Cách kiểm tra hiệu suất mã python” này nhé.

Dịch từ therenegadecoder.com

Xem thêm các bài viết hay về Python tại đây:

Cơ hội việc làm Software hấp dẫn tại TopDev đang chờ bạn!

FE CREDIT “PHÁ LỆ” TUYỂN DỤNG MẠNH – HOÀN THÀNH VÒNG 2 CỦA CHƯƠNG TRÌNH TECHSPEC LỚN NHẤT NĂM 2020

Sáng ngày 8 tháng 2, các ứng viên đã có mặt để tham gia vòng Test của chương trình TECHSPEC 2020. Chương trình được tổ chức bởi FE CREDIT, dành cho các bạn trẻ trong lĩnh vực CNTT muốn thử thách bản thân để bứt phá trong sự nghiệp, nắm bắt mọi cơ hội, học hỏi, cập nhật những công nghệ tiên tiến nhất, và đạt được kỹ năng chuyên môn thông qua những dự án cùng đội ngũ chuyên nghiệp tại FE CREDIT.

Được giới chuyên môn đánh giá cao, TECHSPEC 2020 là một trong những chương trình tuyển dụng được đầu tư nhiều nhất trong năm 2020, với lộ trình đào tạo chuyên sâu và mở ra cơ hội phát triển sự nghiệp bền vững tại , hứa hẹn chính là sự lựa chọn tốt nhất cho các bạn lập trình viên mong muốn phát triển kỹ năng một cách toàn diện. Tại buổi tuyển dụng, Anh Hà Nguyễn Khánh Luân – Leader của IT BA tại FE CREDIT chia sẻ:

“FE CREDIT cần xây dựng những sản phẩm có thể cạnh tranh với các công ty đối thủ, những quy trình mà có thể giảm thiểu được độ “cồng kềnh” và phức tạp của một công ty FinTech. Đây là môi trường tốt nhất để đào tạo các bạn chưa có kinh nghiệm hay fresher. Khái niệm bên mình khá rõ ràng, khả năng bạn đến đâu và có thể improve những gì? Bên mình vẫn chào đón những bạn developer chuyển ngành sang BA. Khi bạn có mindset, có kiến thức và logic về lập trình và hệ thống, mà chỉ hơi yếu về quy trình, hay giải pháp, kiến trúc về hệ thống thì FE CREDIT có thể đào tạo những điều này. Điều quan trọng nhất chính là nằm ở mindset. Với một mindset tốt các bạn có thể sẽ nhanh chóng đạt được sự trưởng thành ở các mặt, trưởng thành hơn trong việc ra quyết định, giải pháp, cũng như trưởng thành trong các kỹ năng giao tiếp quan trọng.”

Với nhu cầu và sự thay đổi chóng mặt của thị trường fintech ngày càng cạnh tranh một cách khốc liệt, đòi hỏi các công ty càng phải nâng cấp công nghệ để phù hợp với xu hướng chuyển đối số, FE CREDIT cũng không nằm ngoài cuộc chơi đó. Trong những năm vừa qua, FE CREDIT đã có những bước tăng trưởng vượt bậc bằng những sản phẩm công nghệ đột phá của mình. Vì vậy nhu cầu tuyển dụng nhân sự trong lĩnh vực này càng gia tăng mạnh mẽ với 4 nhóm nghề chính bao gồm Software Development, Business Analysis, Project Management, và Quality Assurance. Đại diện bộ phận tuyển dụng phía FE CREDIT cho biết:

“Đây là lần đầu tiên FE CREDIT giới thiệu chương trình đến TECHSPEC đến với các bạn ứng viên trong cộng đồng công nghệ thông tin. Vì vậy, chương trình vẫn còn khá mới mẻ đối với các bạn. Đa phần các bạn ứng viên trong đợt tuyển dụng này đều rất tiềm năng. FE CREDIT là một trong những tổ chức tiên phong trong việc ứng dụng các công nghệ mới với nhiều dự án liên phòng ban. Vì vậy, chúng tôi mong muốn tìm kiếm các ứng viên có tinh thần ham học hỏi, sẵn sàng đón nhận các thử thách mới, có khả năng làm việc nhóm và thích ứng nhanh.”

Đây cũng được xem là một trong những chương trình hiếm hoi về Tech tại Việt Nam, tuyển dụng lượng nhân sự lớn dưới 3 năm kinh nghiệm với nhiều vòng thi tuyển lựa chọn kỹ lưỡng. Vượt qua hàng trăm hồ sơ, đã có rất nhiều ứng viên ứng tuyển thành công, họ là những người từng làm việc tại nhiều công ty và các dự án lớn. Bạn Bùi Thiên Hương – ứng viên vị trí Project Management cho biết:

“Mình cảm thấy quy trình tuyển dụng của 2 vòng vừa qua rất bài bản và chuyên nghiệp, ấn tượng với những phúc lợi cũng như những cơ hội nghề nghiệp mà các anh chị nhân sự chia sẻ. Mình rất muốn được bắt tay vào công việc tại đây để được trải nghiệm những dự án . Sau này nếu được mình cũng muốn học được đủ kiến thức để có thể tự lead một dự án của riêng mình tại FE CREDIT như các anh chị Senior khác tại đây.”

Trong thời điểm hiện tại, ngành IT nói chung và ngành FinTech nói riêng đang được đánh giá là một trong những ngành mũi nhọn cho Việt Nam. Hơn 153 cơ sở tổ chức đào tạo được khoảng 50,000 nhân sự cho ngành IT. Tuy nhiên vẫn có sự thiếu hụt mạnh do việc đào tạo chưa thực sự đáp ứng được toàn bộ nhu cầu của doanh nghiệp, vì vậy các doanh nghiệp lớn như FE CREDIT đã chủ trương tuyển dụng nhiều Junior hơn nhằm đào tạo vào xây dựng một đội ngũ trong tương lai. Bạn Hồ Đông Triều – ứng viên Software Development chia sẻ tại buổi thi tuyển:

“Hiện tại mình đang muốn thử sức với lĩnh vực tài chính cụ thể là ứng dụng công nghệ mobile vào FinTech. Mình tin rằng FE Credit sẽ là một một trường tốt giúp mình có thể có được nhiều kiến thức hơn về việc kết hợp giữa tài chính và công nghệ. Trong tương lai mình hy vọng sẽ phấn đấu để có thể trở thành leader của một team software tại FE CREDIT.”

Sau hơn 2 tháng tuyển dụng, vòng 2 của chương trình TECHSPEC 2020 cũng đã kết thúc tốt đẹp. Vòng phỏng vấn sẽ diễn ra vào cuối tháng 2, các ứng viên sẽ sớm có tin vui trong kỳ tuyển dụng năm nay. 

Timeline các vòng tuyển dụng của TECHSPEC 2020

  • Nộp hồ sơ: 2/12/2019 – 17/01/2020
  • Kiểm tra năng lực: 10/02/2020 – 14/02/2020
  • Phỏng vấn: 17/02/2020 – 29/02/2020
  • Thông báo kết quả: 3/2020
  • Bắt đầu làm việc: 4/2020

Contact:

Mobile: (028) 3911 5212 – Ext: 10594

Facebook: FE CREDIT CAREER HUB

Tạo hiệu ứng trong react với React Spring

Trong bài viết này chúng ta sẽ tìm hiểu về cách tạo animation với thư viện React Spring cho các element trong React

Cài đặt

Để bắt đầu chúng ta khởi tạo project với create-react-app trong command line tool.

create-react-app react-animations

Sau đó chúng ta di chuyển đến thư mục react-animations và cài đặt react spring library.

cd react-animations
npm i react-spring
npm start

Tạo hiệu ứng đầu tiên với Spring component

Trong App.js ta xoá đi các dòng code mặc định ban đầu và thêm vào đoạn code bên dưới:

import React from "react";
import { Spring } from "react-spring";
import "./styles.css";

function App() {
  return (

   <Spring
     from={{ opacity: 0.6, marginTop: -50 }}
     to={{ opacity: 1, marginTop: 50 }}
   >
     {props => (
        <div style={props} className="App">
          <article className="post">
            <h1>My first posts</h1>
            <p>
              Lorem ipsum dolor sit amet consectetur adipisicing elit.
              Cupiditate rerum reprehenderit consectetur porro similique
              reiciendis ex consequuntur tempore! Similique, pariatur
              harum.Facilis, accusantium quam labore incidunt soluta
              suscipit ipsa omnis.
            </p>
          </article>
        </div>
      )}
    </Spring>
  );
}

export default App;

Trong đoạn code trên chúng ta import component Spring từ react-spring. Trong component Spring ta sử dụng 1 props là function trả về React Element, và component Spring sẽ render giá trị trả về của hàm đó thay vì trực tiếp render React Element như thông thường.

Sau đó truyền props parameter vào style attribute của thẻ div.

Với Spring component chúng ta sẽ tạo hiệu ứng di chuyển các elements và nó nhận vào 2 props khác là from (initial value) và to (final value):

From: vị trí ban đầu.

To: vị trí khi kết thúc hiệu ứng

Tạo hiệu ứng cho nhiều elements

Để có thể tạo hiệu ứng cho nhiều component spring cung cấp một component là Trail.

Tạo component AllPosts và import Trail từ react-spring theo ví dụ sau đây:

import React from "react";
import { Trail } from "react-spring";
import "./styles.css";
 
const posts = [
  { title: "My first post", id: 1 },
  { title: "My second post", id: 2 },
  { title: "My Third post", id: 3 },
  { title: "My Fourth post", id: 4 }
];
 
function AllPosts() {
  return (
 
   <Trail
     items={posts}
     keys={post => post.id}
     from={{ marginLeft: -20, opacity: 0 }}
     to={{ marginLeft: 20, opacity: 1 }}
   >
     {post => props => (
        <div style={props} className="post">
             {post.title}
        </div>
      )}
    </Trail>
  );
}
 
export default AllPosts

Trail nhận vào 4  props là items, keys, from và to.

Items: là array các element chúng ta cần tạo hiệu ứng

keys: là unique key prop cho mỗi item trong array.

Spring config

Spring cho phép chúng ta  điều chỉnh các thông số delays, tension, friction, resets props là config

Ngoài ra bạn có thể sử dụng các preset có sẵn của spring thay vì chỉnh tay từng thông số

Property Value
config.default { tension: 170, friction: 26 }
config.gentle { tension: 120, friction: 14 }
config.wobbly { tension: 180, friction: 12 }
config.stiff { tension: 210, friction: 20 }
config.slow { tension: 280, friction: 60 }
config.molasses { tension: 280, friction: 120 }

Ví dụ: chúng ta tạo component navbar và sử dụng preset slow của Spring component để tạo hiệu ứng cho thanh navbar như sau:

import React from "react";
import ReactDOM from "react-dom";
import {Spring,config} from "react-spring";
import "./styles.css";
 
function NavBar() {
  return (
 
   <Spring from={{ number: 0 }} to={{ number: 100 }} config={config.slow}>
     {props => (

       <div style={{ width: props.number + "%" }}>
         <nav className="nav-bar">
            <a href="#">Home</a>
            <a href="#"> Posts</a>
            <a href="#">Contact</a>
          </nav>
        </div>
      )}
    </Spring>
  );
}
 
export default NavBar;

Kết luận:

Trên đây là những ví dụ cơ bản về cách sử dụng thư viện React Spring thông qua render props api. Thư viện React spring có thể đáp ứng hầu hết các hiệu ứng liên quan đến UI của bạn. Nó cung cấp cho bạn các công cụ đủ linh hoạt để tự tin đưa ý tưởng của bạn vào các chuyển động trên giao diện.

Tuyển dụng React lương cao mới nhất trong tháng

TopDev via Devnow

Cùng một công việc, Java đòi hỏi nhiều dòng code hơn Python?

Vì sao những ngôn ngữ như Java đòi hỏi phải code nhiều hơn Python khi thực hiện cùng một công việc?

Có rất nhiều lí do, nhưng đầu tiên thì tôi muốn nói rõ là tôi đã sử dụng Python một cách thành thạo được 10 năm rồi. Tôi không có vấn đề gì với Python cả, thậm chí tôi còn thấy nó rất tốt cho việc học.

“Code dài hơn hơn khi thực hiện cùng một công việc”

Đúng vậy. Nói chung là lập trình Java sẽ cần phải gõ nhiều hơn Python đấy. Nhưng nếu đó là vấn đề lớn với bạn, hãy kiếm IDE khác tốt hơn hoặc học cách đánh máy nhanh hơn.
Code của Python ngắn gọn hơn, nhưng cái giá phải trả là gì?
Cùng xem nhé…
def getCustomer(id):
Hàm này sẽ trả về gì nhỉ? Hay không trả về bất cứ gì cả? Biến “id” là kiểu gì? Số? Chuỗi? “CustomerID” object?
Cùng xem Java nào…
public CustomerRecord getCustomer(CustomerID id){
Số lượng code dài gấp đôi. Nhưng chúng ta có thể thấy rõ là hàm sẽ trả về kiểu nào, code làm gì trong đó. Những đoạn code của Java rõ ràng như những điều khoản được viết ra trong hợp đồng vậy. Đây điều mà Python không có.
Tôi nghĩ là Python phù hợp cho việc học và có thể làm nhiều thứ cao cấp hơn nữa. Nhưng công việc gần nhất của tôi về Python đòi hỏi viết hơn 100,000 dòng code.
Ứng tuyển các vị trí việc làm Java lương cao trên TopDev
Trong 100,000 dòng code đó, ví dụ mà tôi đưa ra ở trên sẽ xảy ra hơn 1000 lần, với hơn 1000 biến không xác định và hơn 1000 kết quả trả về cũng không xác định luôn. Chúng sẽ không được kiểm tra tại thời gian biên dịch mà là vào lúc chạy chương trình, đây là sự khác biệt quan trọng. Bug trong Python sẽ không được tìm thấy lúc biên dịch. Đọc lại lần nữa đi. Đây. thực. sự. là. một. vấn. đề. lớn.
Bên cạnh việc kiểm tra kiểu dữ liệu thì Threading là 1 trong những nguyên nhân chính vì sao người ta lại sử dụng Java.
  Hiểu hơn về cách hoạt động của JavaScript Engine

Python không hỗ trợ Threading một cách hiệu quả.

Lần đầu tiên đọc về nó, tôi cho rằng mình đã nhẫm lẫn chỗ nào rồi. Nhưng tiếc là tôi chả đọc sai gì cả. Tôi sẽ kết thúc câu trả lời này bằng lời khuyên của mình…
Đừng quá tôn thờ bất kỳ ngôn ngữ nào cả, chúng không phải 1 thứ tôn giáo, chỉ là những công cụ mà thôi. Vài ngôn ngữ tốt hơn những ngôn ngữ khác ở mặt này, nhưng lại thua kém ở các mặt khác.
Java không phải ác quỷ. Nó không hề tệ. Đơn giản là nó khác biệt với Python. Có việc thì nó thực hiện tốt hơn, có việc thì nó tệ hơn.
Tôi nghĩ việc có sự gắn bó cảm xúc với ngôn ngữ đầu tiên bạn học là khá phổ biến. Nhưng cái cảm xúc đó sẽ ngăn cản bạn trở thành một lập trình viên chuyên nghiệp.
Có thể bạn quan tâm:
Xem thêm việc làm Python tại TopDev
Tác giả: Moray Taylor
TopDev via Quora

50 keywords mà mọi JAVA developer nên biết

Java hiện là ngôn ngữ lập trình phổ biến hàng đầu tại Việt Nam và rất nhiều sinh viên CNTT muốn theo đuổi ngôn ngữ này để phát triển sự nghiệp của mình. Có không ít khó khăn bạn cần phải vượt qua để làm chủ ngôn ngữ đầy rắc rối ấy và việc đầu tiên là hiểu những keywords – những từ khóa trong lập trình java. Việc này sẽ làm tiền đề giúp bạn trong việc tự học, tự trải nghiệm thách thức từ java.

Xem thêm cơ hội việc làm java developer tốt nhất thị trường

  5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Abstract: Khai báo lớp, phương thức và interface trừu tượng không có thể hiện (instance) cụ thể

Assert: Kiểm tra điều kiện đúng hay sai (hay dùng trong Unit Test)

Boolean: Khai báo biến kiểu logic với hai giá trị: True or False

Break: Lệnh switch-case hoặc dùng để thoát khỏi vòng lặp

Byte: Các giá trị nguyên chiếm 8 bit (1byte)

Case: Trường hợp được chọn theo Switch (chỉ dùng khi được đi kèm Switch)

Catch: Dùng để bắt ngoại lệ, dùng kèm với try để xử lý những ngoại lệ nảy sinh trong chương trình

Char: Là kiểu ký tự Unicode, mỗi ký tự có 16 bit (2 byte)

Class: Dùng để định nghĩa class

Const: Không thể dùng trong java bởi nó chưa được sử dụng

Continue: Được dùng để dừng chu trình (interation) lặp hiện tại và bắt đầu chu trình kế tiếp

Tham khảo các job đang được global cybersoft tuyển dụng

Default: Mặc định được thực thi nếu không có case nào trả về giá trị True – được dùng trong Switch case.

Do: Dùng ở  vòng lặp While

Double: Là kiểu số thực có các giá trị được biểu diển bởi dấu phẩy động 64 bit (8byte)

Else: Rẽ nhánh điều kiện ngược với If

Enum: Kiểu dữ liệu Enum – tương đối giống với kiểu dữ liệu mảng. Khác biệt ở chỗ các phần tử của kiểu này có thể bổ sung thêm các phương thức.

Extends: Dùng để định nghĩa lớp con kế thừa những thuộc tính và phương thức từ lớp cha.

Final: Dùng để chỉ ra các biến – phương thức không thay đổi sau khi đã được định nghĩa. Những phương thức final không được kế thừa và override.

Finally: Thực hiện một khối lệnh đến cùng, bỏ qua các ngoại lệ – dùng trong Try-cactch.

Float: Kiểu số thực – Các giá trị được biểu diện bởi dạng dấu phẩy động 32 bit.

For: Dùng trong vòng lặp for – Các bước lặp đã xác định từ trước.

Goto: Chưa được sử dụng

If: Là lệnh chọn theo điều kiện logic

Implements: Xây dựng 1 lớp mới cài đặt những phương thức từ interface xác định trước

Import: Dùng để yêu cầu 1 hay 1 vài lớp ở các gói chỉ định cần nhập vào để sử dụng trong ứng dụng hiện thời

Long: Là kiểu số nguyên lớn – Các giá trị chiếm 64 bit (8 byte)

Native: Sử dụng khi lập trình viên muốn dùng code bằng ngôn ngữ khác

New: Khởi tạo đối tượng

Package: Sử dụng khi xác định 1 gói sẽ chứa một số lớp trong file mã nguồn

Private: Khai báo biến dữ liệu, phương thức riêng trong từng lớp và chỉ cho phép truy cập trong lớp đó.

Protected: Dùng để khai báo biến dữ liệu – Chỉ được truy cập ở lớp cha và những lớp con của lớp đó.

Public: Dùng để khai báo biến dữ liệu, lớp – Phương thức công khai có thể tự truy cập ở mọi hệ thống.

Return: Kết thúc phương thức, trả về giá trị cho phương thức.

Short: Kiểu số nguyên ngẵn – giá trị chiếm 16 bit (2byte)

Static: Định nghĩa biến, phương thức của một lớp có thể được truy cập trực tiếp từ lớp mà không thông qua khởi tạo đối tượng của lớp.

Super: Biến chỉ tới đối tượng ở lớp cha

Switch: Sử dụng trong câu lệnh điều khiển Switch case

Synchronized: Chỉ ra là ở mõi thời điểm chỉ có 1 đối tượng hay 1 lớp có thể truy nhập đến biến dữ liệu hoặc phương thức loại đó – Thường được sử dụng trong lập trình đa luồng (multithreading).

This: Biến chỉ tới đối tượng hiện thời

Throw: Tạo một đối tượng Exception nhằm chỉ định 1 trường hợp ngoại lệ xảy ra

Throw: Chỉ định cho qua ngoại lệ nếu exception xảy ra

Transient: Chỉ định rằng nếu một đối tượng được Serialized, giá trị của biến sẽ không cần được lưu trữ

Try: Thử thực hiện cho đến khi xảy ra 1 ngoại lệ

Void: chỉ định 1 phương thức không trả về giá trị

Volatile: Báo cho chương trình dịch biết là biến khai báo volatile có thể thay đổi tùy ý trong các luồng (thread)

While: Sử dụng trong lệnh điều khiển While

TopDev via SmartJob

Xem thêm các việc làm tuyển dụng front-end hấp dẫn tại TopDev

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

Những công việc trong ngành công nghệ phần mềm

Tác giả: Đoàn Văn Tuyển

Sinh viên CNTT thường hay thắc mắc ra trường sẽ làm gì, thực ra CNTT rất rộng có đến hàng trăm công việc khác nhau. Nếu xét riêng về công nghệ phần mềm thì cũng đã có rất nhiều công việc liên quan rồi. Mình xin nêu ra một số công việc liên quan trong ngành Công nghệ Phần Mềm (Software Engineering). Mình xin nêu ra một số những vị trí và kỹ năng cần có.

Chú ý rằng trông một công ty nhỏ thì một người có thể kiêm nhiều vai trò khác nhau bên dưới, trong công ty lớn thì việc phân biệt rõ ràng hơn. Mình cũng nói qua về những kỹ năng cần thiết cho mỗi vị trí, nó ko chỉ cần những kỹ năng đó, nhưng đó là kỹ năng quan trọng nhất.

Người viết: Tuyền Đoàn

– Lập trình — Programmer/Developer 

(tất nhiên ai cũng nghĩ đến đầu tiên): Riêng lập trình các bạn có thể chọn hàng chục ngôn ngữ khác nhau như Java, .Net, PHP, Python, Swift, Kolin, NodeJS, GoLang, JavaScript… Ngoài ra các bạn cũng có những vị trí lập trình khác nhau như backend, frond-end, data engineering, database programming…. Ở VN mọi người thường nghĩ đến việc chỉ lập trình đến năm 30 tuổi sau đó thì làm quản lý. Thực tế trên thế giới nghề lập trình có thể làm đến già, những người làm càng lâu càng biết sâu và trở thành chuyên gia trong lĩnh vực của họ. Thực tế rất nhiều CTO (Giám đốc Công nghệ) vẫn phải đảm nhận những công việc lập trình khó. Ví trí này thông thường cần kỹ năng giải quyết vấn đề, ngoài ra khả năng trừu tượng hoá cũng là cái cần có của một Developer.

Thiết kế phần mềm hay thiết kế hệ thống (System Architect):

Thông thường ở VN thì công việc này thường kiêm nhiệm (có thể CTO hoặc Tech Lead kiêm nhiệm luôn vị trí này). Ở vị trí này yêu cầu hiểu biết sâu về lập trình, database, server và product development. Hiểu được những vấn đề ngắn hạn và dài hạn có thể gặp phải khi phát triển, cũng phải hiểu tính chất, điểm yếu điểm mạnh của từng thứ ngôn ngữ lập trình, DB, Server… Nói chung phải là người có trí tưởng tượng tốt để hình dung ra những vấn đề gặp phải sau này. Vừa là kiến trúc sư phần mềm, cũng vừa hiểu những thực tế của việc phát triển phần mềm. Vị trí này cần nhất kỹ năng strategic & planning.

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

UX designer:

Là vị trí hiểu được những thứ người dùng sử dụng. Họ phải mô tả được cho team việc phần mềm sau khi làm ra thì có những thành phần nào tham gia, họ sẽ tiếp cận sản phẩm như thế nào… (tìm hiểu khái niệm customer Jouney Mapping). Ngoài ra họ cũng phải mô tả được về những thứ nhìn thấy như giao diện, những màn hình cần có, các thành phần được bố trí thế nào, các luồng màn hình thế nào (click vào cái gì thì đi đâu)… Cũng giống như system Architect, UX Designer ở VN thường cũng là vị trí kiêm nhiệm của Product Manager hoặc UI Designer… Đối với UX Designer thì sự tỷ mỉ chi tiết, và khả năng tưởng tượng là những thứ cần thiết nhất.

Business Analysis (BA), Product Owner:

Là người chịu trách nhiệm về yêu cầu công việc. Thông thường sẽ là vị trí trung gian làm cầu nối giữa một bên là những vị trí phi kỹ thuật như Marketing, Sale, CEO… với những vị trí kỹ thuật như bên trên. Họ có thể nói được cả 2 tiếng nói cả kỹ thuật và phi kỹ thuật. Họ phải làm sao để mô tả những yêu cầu của các team khác dưới ngôn ngữ kỹ thuật, UX Designer, Developer… có thể triển khai được những thứ team khác mong muốn. BA/PO đôi khi cũng phải là người nghĩ ra những hướng đi cho dự án. Kỹ năng cần thiết nhất của BA/PO là kỹ năng phân tích và đánh giá nhu cầu của các thành phần liên quan.

Tham khảo các vị trí tuyển dụng product owner cho SV mới ra trường

Quản lý dự án Project Manager / Scrum Master 

(cái này ko biết dịch sao): là vị trí liên quan nhiều đến quản lý, bố trí ai làm việc gì, là người chịu trách nhiệm làm sao để team đi đúng hướng. Họ phải hiểu điểm mạnh, điểm yếu của từng người để bố trí. Họ là người biến những thứ mong muốn của BA/PO trở thành hiện thực thông qua việc làm việc với những thành viên khác. PM đôi khi đảm nhận cả vai trò của BA/PO (PM truyền thống), thậm chí cả System Architect + UX Designer cũng được PM kiêm luôn. Tuy nhiên cách làm này thường hay khiến team bị bottleneck ở vị trí của PM, khiến cho team bị chậm. Ở VN thì PM thường được coi là “sếp”, nhưng thực tế PM cũng chỉ là 1 vị trí trong team chứ ko phải là sếp hay gì. Trong đó PM thì cần nhất khả năng giao tiếp và trao quyền, kỹ năng lập kế hoạch cũng quan trọng không kém.

Xem thêm các vị trí tuyển IT Project Manager, tuyển dụng lập trình viên Scrum Master

Tester/QA/QC:

Là vị trí đảm bảo những gì Developer làm ra đúng với yêu cầu của BA/PO. Tester/QA thường là những người Executive, những người kiểm tra trực tiếp sản phẩm, đảm bảo những gì làm dev làm ra là đúng và…hợp lý. QC là người kiểm soát về quy trình, đảm bảo quy trình được thực thi đúng. Khi quy trình đúng thì gián tiếp đảm bảo chất lượng sản phẩm. Đối với QA thì quan trọng nhất là sự tỷ mỉ và cẩn thận.

Tìm hiểu thêm các vị trí tuyển dụng QA, tuyển dụng QC tại Topdev.

Quản trị hệ thống (System Administrator) / Dev-op:

Là những người đảm bảo môi trường phát triển cho team. Là những người thực hiện việc cài cắm server, Backup, thiết lập môi trường, thiết lập môi trường phát triển, vận hành hệ thống… Đối với những người non-tech thì đây là ông chuyên đi cài Win với Restart modem khi cần. Quản trị hệ thống thì việc kỹ năng ra quyết định, sự cẩn thận là những thứ quan trọng nhất.

Tham khảo thêm vị trí tuyển dụng System Admin lương cao

Kỹ sư dữ liệu (Data Engineering) / Data Analysis / Data Scientist:

Ở VN vị trí này tương đối mới mẻ, thực tế có lẽ chưa có trường nào đào tạo. 3 vị trí này có điểm chung là cùng làm việc với dữ liệu, tuy nhiên có sự khác nhau như sau: Data Engineering là người biết lập trình vừa hiểu cách phân tích data, biết viết những chương trình phầm mềm để xử lý data đưa ra báo cáo gì đó. Data Analysis là người sử dụng công cụ hoặc kết quả làm ra của Data Engineering để đưa ra được hành động hoặc kết luận phục vụ cho những vị trí khác về bussiness. Data Scientist là người ở tấng cao hơn, trừu tượng hơn so với Data Engineering, họ có thể ko biết lập trình, ko hiểu data như DA, tuy nhiên họ hiểu thuật toán xử lý dữ liệu và hướng dẫn Data Engineering xử lý được Data theo thuật toán mà họ hướng dẫn. Đối với những vị trí trên thì sự hiểu data và khả năng phân tích dữ liệu để đưa ra đánh giá là những thứ cần thiết nhất (Nhất là với DA/DE)

Tham khảo các vị trí tuyển dụng Data Engineer, lập trình Data Analyst, tuyển Data Science

Product Manager:

Vị trí này tương đối giống với Project Manager. Tuy nhiên Product Manager thường nói đến vị trí để ý nhiều hơn đến sản phẩm, ít chú ý đến việc quản lý. Vị trí Product Manager yêu cầu kinh nghiệm rất đa dạng. Thông thường phải có kiến thức của tất cả các phần trên, đặc biệt là phải có kinh nghiệm của một UX Designer, BA, System Architect, Developer và cả về Business nữa. Nói chung để đảm nhận về vị trí Product Manager thường yêu cầu kinh nghiệm khá toàn diện. Vị trí Product Manager cần rất nhiề u kỹ năng, kỹ năng phân tích, tư duy chiến lược cần có nhưng sự tỷ mỉ chi tiết cũng cần luôn. Nói chung đây là vị trí rất khỏ cấn có nhiều kỹ năng để có thể làm được.

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

Bên trên là những vị trí chính trong ngành CNPM, có rất nhiều những vị trí khác nữa, tuỳ thuộc vào từng công ty vị trí trên có thể được chia nhỏ hoặc phát sinh những vị trí mới. Trên đây là tóm tắt theo kinh nghiệm bản thân, có thể có những chỗ chưa đúng, mong mọi người góp ý.

24 code ES6 tân tiến để khắc phục các lỗi thực hành JavaScript

Tôi đích thân tự chọn vài trích đoạn những code hữu ích nhất từ trang ‘30secondsofcode’, vốn đã là 1 nguồn tài nguyên tuyệt vời. Và bạn cũng đừng ngại chi mà hãy ủng hộ nó hết mình nhé.

Trong đề tài này tôi đã cố sắp xếp dựa theo cách sử dụng các thực hành của chúng. Và trả lời các câu hỏi thường gặp mà bạn có thể phải đối mặt trong dự án của mình:

  Học Javascript 1: Syntax Parser, Execution Context, Lexical Environment là gì

  Những thứ kỳ quặc của Javascript?

1. Cách để ẩn hết các yếu tố quy định?

const hide = (...el) => [...el].forEach(e => (e.style.display = 'none'));

// Example
hide(document.querySelectorAll('img')); // Hides all <img> elements on the page

2. Làm thế nào để kiểm tra nếu yếu tố đó có lớp quy định?

const hasClass = (el, className) => el.classList.contains(className);

// Example
hasClass(document.querySelector('p.special'), 'special'); // true

3. Cách để chuyển đổi 1 lớp cho 1 yếu tố?

const toggleClass = (el, className) => el.classList.toggle(className);

// Example
toggleClass(document.querySelector('p.special'), 'special'); 
// The paragraph will not have the 'special' class anymore

4. Làm thế nào để lấy vị trí cuộn của trang hiện tại?

const getScrollPosition = (el = window) => ({
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});

// Example
getScrollPosition(); // {x: 0, y: 200}

5. Cách để cuộn-mượt hơn tới đầu trang?

const scrollToTop = () => {
  const c = document.documentElement.scrollTop || document.body.scrollTop;
  if (c > 0) {
    window.requestAnimationFrame(scrollToTop);
    window.scrollTo(0, c - c / 8);
  }
};

// Example
scrollToTop();

6. Làm thế nào để kiểm tra nếu yếu tố ‘parent’ đang mang yếu tố ‘child’?

const elementContains = (parent, child) => parent !== child && parent.contains(child);

// Examples
elementContains(document.querySelector('head'), document.querySelector('title')); 
// true
elementContains(document.querySelector('body'), document.querySelector('body')); // false

7. Cách để kiểm tra nếu yếu tố quy định có thể hiển thị trong viewport?

const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
  const { top, left, bottom, right } = el.getBoundingClientRect();
  const { innerHeight, innerWidth } = window;
  return partiallyVisible
    ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
        ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
    : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
};

// Examples
elementIsVisibleInViewport(el); // (not fully visible)
elementIsVisibleInViewport(el, true); // (partially visible)

8. Làm thế nào nạp tất cả hình ảnh vào trong 1 yếu tố?

const getImages = (el, includeDuplicates = false) => {
  const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src'));
  return includeDuplicates ? images : [...new Set(images)];
};

// Examples
getImages(document, true); // ['image1.jpg', 'image2.png', 'image1.png', '...']
getImages(document, false); // ['image1.jpg', 'image2.png', '...']

9. Cách để nhận dạng 1 thiết bị di động hay 1 máy bàn/ laptop?

const detectDeviceType = () =>
  /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
    ? 'Mobile'
    : 'Desktop';

// Example
detectDeviceType(); // "Mobile" or "Desktop"

10. Làm thế nào để lấy URL hiện tại? 

const currentURL = () => window.location.href;

// Example
currentURL(); // 'https://google.com'

11. Cách để tạo 1 object chứa thông số của URL hiện tại?

const getURLParameters = url =>
  (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(
    (a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a),
    {}
  );

// Examples
getURLParameters('http://url.com/page?n=Adam&s=Smith'); // {n: 'Adam', s: 'Smith'}
getURLParameters('google.com'); // {}

12. Làm thế nào để mã hóa 1 set các yếu tố hình thức như 1 object?

const formToObject = form =>
  Array.from(new FormData(form)).reduce(
    (acc, [key, value]) => ({
      ...acc,
      [key]: value
    }),
    {}
  );

// Example
formToObject(document.querySelector('#form')); // { email: 'test@email.com', name: 'Test Name' }
13. Cách để lấy lại 1 set các thuộc tính được chỉ định bởi các selector đã cho từ 1 vật thể?
const get = (from, ...selectors) =>
  [...selectors].map(s =>
    s
      .replace(/\[([^\[\]]*)\]/g, '.$1.')
      .split('.')
      .filter(t => t !== '')
      .reduce((prev, cur) => prev && prev[cur], from)
  );
const obj = { selector: { to: { val: 'val to select' } }, target: [1, 2, { a: 'test' }] };

// Example
get(obj, 'selector.to.val', 'target[0]', 'target[2].a'); // ['val to select', 1, 'test']

14. Làm thế nào để gọi chức năng đã cung cấp sau khi chờ (đơn vị mili-giây)?

const delay = (fn, wait, ...args) => setTimeout(fn, wait, ...args);
delay(
  function(text) {
    console.log(text);
  },
  1000,
  'later'
); 

// Logs 'later' after one second.

15. Cách để kích hoạt 1 sự kiện cụ thể trong yếu tố cho đi, tùy chọn chuyển dữ liệu tùy chỉnh?

const triggerEvent = (el, eventType, detail) =>
  el.dispatchEvent(new CustomEvent(eventType, { detail }));

// Examples
triggerEvent(document.getElementById('myId'), 'click');
triggerEvent(document.getElementById('myId'), 'click', { username: 'bob' });

16. Làm thế nào gỡ bỏ 1 event listener từ 1 yếu tố?

const off = (el, evt, fn, opts = false) => el.removeEventListener(evt, fn, opts);

const fn = () => console.log('!');
document.body.addEventListener('click', fn);
off(document.body, 'click', fn); // no longer logs '!' upon clicking on the page

17. Cách để lấy định dạng có thể đọc được của số ml giây đã cho?

const formatDuration = ms => {
  if (ms < 0) ms = -ms;
  const time = {
    day: Math.floor(ms / 86400000),
    hour: Math.floor(ms / 3600000) % 24,
    minute: Math.floor(ms / 60000) % 60,
    second: Math.floor(ms / 1000) % 60,
    millisecond: Math.floor(ms) % 1000
  };
  return Object.entries(time)
    .filter(val => val[1] !== 0)
    .map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`)
    .join(', ');
};

// Examples
formatDuration(1001); // '1 second, 1 millisecond'
formatDuration(34325055574); // '397 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds'

18. Làm thế nào để lấy sự khác biệt (đơn vị ngày) giữa 2 date?

const getDaysDiffBetweenDates = (dateInitial, dateFinal) =>
  (dateFinal - dateInitial) / (1000 * 3600 * 24);

// Example
getDaysDiffBetweenDates(new Date('2017-12-13'), new Date('2017-12-22')); // 9

19. Cách để tạo 1 yêu cầu ‘GET’ tới URL đã thông?

const httpGet = (url, callback, err = console.error) => {
  const request = new XMLHttpRequest();
  request.open('GET', url, true);
  request.onload = () => callback(request.responseText);
  request.onerror = () => err(request);
  request.send();
};

httpGet(
  'https://jsonplaceholder.typicode.com/posts/1',
  console.log
); 

// Logs: {"userId": 1, "id": 1, "title": "sample title", "body": "my text"}
20. Làm thế nào để tạo 1 yêu cầu ‘POST’ tới URL đã thông qua?
const httpPost = (url, data, callback, err = console.error) => {
  const request = new XMLHttpRequest();
  request.open('POST', url, true);
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.onload = () => callback(request.responseText);
  request.onerror = () => err(request);
  request.send(data);
};

const newPost = {
  userId: 1,
  id: 1337,
  title: 'Foo',
  body: 'bar bar bar'
};
const data = JSON.stringify(newPost);
httpPost(
  'https://jsonplaceholder.typicode.com/posts',
  data,
  console.log
); 

// Logs: {"userId": 1, "id": 1337, "title": "Foo", "body": "bar bar bar"}

21. Cách để tạo ra 1 counter với phạm vi, bước và độ dài nhất định cho selector được chỉ định?

const counter = (selector, start, end, step = 1, duration = 2000) => {
  let current = start,
    _step = (end - start) * step < 0 ? -step : step,
    timer = setInterval(() => {
      current += _step;
      document.querySelector(selector).innerHTML = current;
      if (current >= end) document.querySelector(selector).innerHTML = end;
      if (current >= end) clearInterval(timer);
    }, Math.abs(Math.floor(duration / (end - start))));
  return timer;
};

// Example
counter('#my-id', 1, 1000, 5, 2000); // Creates a 2-second timer for the element with id="my-id"

22. Làm thế nào để copy 1 string tới clipboard? 

const listener = (e: ClipboardEvent) => {
  e.clipboardData.setData('text/plain', text);
  e.preventDefault();
};

document.addEventListener('copy', listener);
document.execCommand('copy');
document.removeEventListener('copy', listener);

23. Cách để nhận biết nếu tab trình duyệt của trang được focus?

const isBrowserTabFocused = () => !document.hidden;

// Example
isBrowserTabFocused(); // true

24. Làm thế nào để tạo 1 danh mục, nếu nó không tồn tại?

const fs = require('fs');
const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined);

// Example
createDirIfNotExists('test'); // creates the directory 'test', if it doesn't exist

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

Đừng quên xem thêm các bài viết về JavaScript: 

Cơ hội việc làm javascript Developers hấp dẫn tại TopDev đang chờ bạn!

5 dự án React buộc phải có trong porfolio của bạn

Trước khi bắt đầu với dự án React, bạn đã vun trồng cho công việc của mình khá nhiều. Và giờ bạn đã có kiến thức khá vững vàng về thư viện React. 

Trên hết, bạn đã có kiến thức về JavaScript và đặt những ‘feature’ hữu ích nhất để đưa vào sử dụng cho code React của mình.

Bạn đã tự thỏa thuận để thúc đẩy bản thân.. nhưng tới bây giờ bạn đã làm được gì rồi ?

Làm cách nào để bạn lấp đầy những lỗ hổng giữa việc thấu hiểu nền tảng React. Và trở thành 1 Lập trình viên chuyên nghiệp ?

Rất nhiều lập trình viên gặp phải vấn đề này khi họ đã đạt tới giai đoạn trung cấp về việc học React hay với bất kỳ thư viện JavaScript nào. Bản thân họ đều biết rõ hầu hết thư viện cũng như về JavaScript để dùng 1 cách hiệu quả. Nhưng họ đều không biết phải làm gì sau đó. 

Tìm kiếm cơ hội việc làm React hấp dẫn các công ty HOT

Tại sao bạn nên dựng app

Sau khi đã học phần cơ bản của React, bạn nên dựng các app dễ chịu với các kĩ năng mà bạn có. Bài thực hành này nằm ngay phần trọng tâm về việc trở thành 1 lập trình viên React hiệu quả. Và là để biết cách tự làm nên các app cũng như sử dụng bộ công cụ phù hợp trong ecosystem của React để dựng nó. 

Nhưng những ứng dụng nào bạn nên làm với React để nâng cấp khả năng của bạn như 1 lập trình viên ?

Trong bài viết này, chúng ta sẽ đi qua 5 loại ứng dụng khác nhau mà bạn nên xem để tạo thử sau các ứng dụng cơ bản trước đó. Ưu điểm tuyệt vời nhất của việc dựng nên các ứng dụng chính là 1 khi đã triển khai, nó có thể liên kết với portfolio của bạn theo 1 cách mạnh mẽ, trực tiếp để cho các nhà tuyển dụng nhìn thấy chuyên môn của bạn.

Cho mỗi loại ứng dụng, mình sẽ cover lại các ví dụ phổ biến để bạn có thể dùng nó như nguồn cảm hứng, các bộ công cụ mình gợi ý để tạo từng feature cho ứng dụng, kèm theo demo ngắn cho mỗi cái mà mình đã cá nhân làm khi dùng React.

  ReactJS: Props và State
  React Native hoạt động như thế nào?

Cách bắt đầu dựng app với React 

Không giống như việc học React, nơi bạn có thể tìm thấy hàng tá các bài viết để lặn sâu vào bất cứ ý tưởng liên quan nào, quá trình tạo ra 1 ứng dụng là 1 hoạt động định hướng cho bản thân mà không cần phải được chỉ dẫn nhiều.

Nếu bạn đang bắt đầu tạo các ứng dụng của riêng mình, mình sẽ gợi ý bạn nghiên cứu các bài viết dạy cho bạn phần cơ bản của việc tạo ra 1 ứng dụng và nhúng nó vào source code ứng dụng mà chúng cung cấp. Ngay cả quá trình đọc code cũng sẽ làm bạn thành 1 nhà lập trình tốt hơn. 

Vì những ví dụ này làm bạn cảm thấy khá chán nản khi phải dựng 1 mình, hãy ghi nhớ rằng những gì 1 lập trình viên React phải biết – là để chia các ứng dụng thành các thành phần có thể tổng hợp. Mỗi ứng dụng phải được dựng theo kiểu ‘mảnh theo mảnh’, ‘thành phần theo thành phần’.

Hãy tập trung vào việc tạo ra feature vào đúng thời điểm. Với các bài thực hành bạn sẽ có cảm nhận tốt hơn về những bộ công cụ bạn sẽ cần cho những feature cũng như các mô hình phổ biến đằng sau việc dựng ứng dụng nói chung.

Ghi chú: Có 1 quan niệm sai lầm của tôi cho rằng khi tạo ra ứng dụng thật sự như vậy thì tôi phải tự dựng hoàn toàn phần backend / API với Node hay Python để có được chức năng mà mình cần. Nhưng bạn không cần phải làm thế.
Hãy nhìn vào các công nghệ không-server (serverless) mạnh mẽ như Firebase, AWS Amplify hay Hasura và chúng sẽ mang cho bạn trọn vẹn phần backend nằm sẵn trong hộp mà không cần phải tạo và khai triển cái của riêng bạn. Khai thác vào các bộ công cụ sẽ làm bạn năng suất hơn và tiết kiệm thời gian. 

Dựng App Truyền thông Xã hội

Nếu như mình chỉ được gợi ý 1 app duy nhất cho bạn để thêm vào portfolio, thì nó chính là app về truyền thông xã hội (social media). Twitter, Facebook và Instagram khá là tinh vi, bao gồm số lượng feature ngày càng tăng để giữ tương tác với người dùng. Trên hết, chúng là loại app mà bạn có thể biết tốt nhất về cách nó nên hoạt động.

Có 1 số lượng các feature phổ biến trong hầu hết các app truyền thông xã hội: 

    • Cho người dùng có khả năng để tạo post với văn bản (text) và/hay tệp tin media,
    • Nguồn cung cấp dữ liệu trực tiếp (live feed) cho các bài đăng đó,
    • Cho phép người dùng khác để ‘Thích’ và ‘Bình luận’ trên bài đăng,
    • Cũng như xác thực người dùng (user authentication)

Và khi bạn đã làm xong những việc này, bạn có thể thêm profile cho mỗi người dùng. Nơi họ có thể cả nhân hóa tài khoản của mình cũng như quản lý những người theo dõi họ. 

5 dự án react buộc phải có cho portfolio của bạn

Các ví dụ App: Instagram, Twitter, Snapchat, Reddit 

Các công nghệ nên dùng:

    • Tạo app React hay Next.js để làm UI sinh động cho các bài đăng, lượt thích và tin nhắn 
    • Firebase, AWS Amplify hay Hasura (hãy dùng GraphQL với ‘Đăng ký’) cho data thời gian thực
    • Các chức năng không máy chủ như AWS Lambda hay Các chức năng Firebase cho tính năng thông báo 
    • Bộ lưu trữ Cloudinary hay Firebase cho đăng tải hình ảnh và video

Dựng App Thương mại điện tử (E-Commerce)

Hãy chọn vài web yêu thích của bạn và tôi đảm bảo ít nhất 1 trong số chúng có 1 app e-commerce đã được nhúng sẵn trong đó. Dù nó chỉ là storefront nhỏ. Các app E-commerce khá phổ cập. Và tôi cá rằng bạn sẽ được yêu cầu để tạo chúng 1 lúc nào đó trong sự nghiệp lập trình viên của mình. 

Khá là hấp dẫn để dựng 1 nền tảng e-commerce ấn tượng và quy mô lớn như Amazon, nhưng tôi sẽ khuyên bạn nên làm 1 cái nhỏ và cụ thể hơn. 

Thay vì 1 thị trường cung cấp tất cả mọi thứ cho tất cả mọi người, hãy chọn ngành công nghiệp nào gây hứng thú với bạn. Ví dụ: nếu bạn thích các sản phẩm gia đình, bạn nên xem thử những gì Crate & Barrel hay Williams-Sonoma đã dựng cho các website của họ. 

Bên cạnh sản phẩm, các app e-commerce có thể cung cấp 1 dịch vụ đến khách hàng. Nếu nó là dạng dịch vụ tự cung cấp, 1 map tương tác có thể được thêm vào app để cung cấp cho người cung cấp dịch vụ. Và đó là để họ biết được địa điểm của nhau. Các app giao đồ ăn như UberEats và Doordash, đều yêu cầu vị trí của người đặt thức ăn. 

Bất kể những gì được bán, dù là vật thật (physical) hay vật ảo (virtual), mỗi app e-commerce sẽ bao gồm vài ‘storefront’ với sản phẩm hay chi tiết dịch vụ. Nếu người dùng có thể trả tiền nhiều sản phẩm cùng lúc, thì nó nên có 1 ‘xe đẩy shopping’. Vì đó là nơi người dùng có thể quản lý các sản phẩm họ muốn mua.
Cuối cùng, mỗi app e-commerce cần 1 quá trình kiểm tra nơi người dùng có thể mua sản phẩm của họ ẩn danh hoặc một khi chúng được xác thực.

5 dự án react buộc phải có cho portfolio của bạn

Những ví dụ phổ biến: Airbnb, Uber, UberEats, Doordash, Etsy, Udemy

Các công nghệ nên dùng: 

    • Tạo app React hay Gatsby cho storefront và hiển thị sản phẩm
    • Vạch với gói ‘yếu tố-vạch-react’ để lo liệu quá trình thanh toán
    • Chức năng không máy chủ như Netlify / AWS Lambda để lo liệu quá trình kiểm tra thanh toán
    • Algolia cho việc tìm kiếm sản phẩm nhanh-như-chớp 
    • Snipcart cho việc tạo xe shopping dễ dàng và quản lý các sản phẩm trong đó

Dựng App Giải trí

Đây chính là phần rộng nhất trong tất cả các hạng mục. Ý tôi là gì khi nói về giải trí? 1 app tập trung vào 1 thứ nhất định của truyền thông. Nó có thể là những phim màn bạc, podcast, hay âm nhạc, v..v..
1 số ví dụ điển hình của nó, tương ứng với từng hạng mục, như Netflix, Audible và Soundcloud hay Spotify. Nếu bạn sẽ bao gồm nghệ thuật hay thiết kế trong hạng mục này. Bạn sẽ phải thêm những trang như Behance hay Dribble vào danh sách. 

Điều làm mục này thú vị là vì nhiều ứng dụng giải trí được giáp trên các ứng dụng truyền thông xã hội. Ví dụ: 1 app như Tiktok, với các video mang đặc tính ngắn, dễ hình dung, được thúc đẩy bởi lượng tương tác khủng của người dùng. Những app khác như Youtube nằm trung tâm giữa các tương tác người dùng như ‘lượt thích’ , ‘bình luận’ và ‘đăng ký’.

Hãy nghĩ về dạng truyền thông hay giải trí làm bạn thích thú nhất và xem nếu bạn có thể xây dựng 1 nền tảng đơn giản quanh nó. Nơi người dùng có thể đăng nhập và lưu các nội dung mà họ thích. Sau đó, hãy nhìn vào việc thêm các yếu tố xã hội và làm nó khả dụng việc thêm bình luận vào nội dụng, ‘thích’ nó và ‘chia sẻ’ nó với các người dùng trên nền tảng đó. 

5 dự án react buộc phải có cho portfolio của bạn

Các ví dụ điển hình: Youtube, Netflix, Audible, Spotify, Tiktok 

Các công nghệ nên dùng: 

    • Tạo app React, Next.js hay Gatsby để tạo app UI
    • Gói npm ‘react-player’ cho các ‘playing-media’
    • Bộ lưu trữ Cloundiary hay Firebase cho đăng tải media
    • Algolia cho việc tìm kiếm media theo tên (như là audiotrack, video, movie, v..v..)

Dựng App Nhắn tin

App nhắn tin khá là quan trọng. Dường như bạn sẽ phải có dịch vụ tin nhắn miễn phí như WhatsApp hay Viber như 1 app trên điện thoại của bạn. Hay là 1 cái được dựng vào nền tảng truyền thông xã hội của bạn, như Facebook Messenger. Các dịch vụ như Intercom với tin nhắn trực tiếp cũng khả dụng cho các app web. Vì thế các công ty có thể cung cấp hỗ trợ khách hàng ngay lập tức tới các người dùng của họ.

Bất cứ app nhắn tin nào cũng se bao gồm 1 đoạn hội thoại với 2 hay nhiều người hơn nơi tin nhắn được gửi đi trong thời gian thực. Tương tự như app truyền thông xã hội, tôi sẽ khuyên bạn bạn 1 dịch vụ như Firebase hay Hasura mà có thể chuyển data qua WebSockets để hiển thị các tin nhắn ngay lập tức trong cuộc hội thoại.

Đa số các app nhắn tin đều trên thiết bị di động hay máy tính bảng. Nếu đây không phải là app clone đầu tiên của bạn, thì bạn sẽ có cơ hội tuyệt với để vượt qua trang web và dựng 1 app di động với React Native. Tốt hơn hết, bạn có thể dựng 1 trang web và app tin nhắn di động được giả lập với 1 gói như là React Native Web. 

5 dự án react buộc phải có cho portfolio của bạn

Các ví dụ điển hình: WhatsApp, Viber, Discord, Messenger, Slack

Các công nghệ nên dùng:

    • React Native hay React Native Web để dựng như 1 app di động hay 1 app hỗn hợp (web + di động)
    • Firebase, AWS Amplify, hay Hasura (dùng GraphQL subscription) để gửi tin nhắn thời gian thật
    • Bộ lưu trữ Cloudinary or Firebase cho việc gửi tin nhắn chứa nội dung hình ảnh hay video
    • Gói npm ‘emoji-mart’ cho lựa chọn emoji như cho một công cụ chọn emoji giống như Slack để người dùng đưa vào tin nhắn của họ 

Dựng App Năng suất

Đây chắc hằn là loại app dễ nhất để bắt đầu, mình xem xét và thấy rất nhiều hướng dẫn về các ứng dụng năng suất cơ bản ngoài kia. Khi nói về các app Năng suất, tôi đang liên tưởng tới các app ghi chép, app để quản lý team và danh sách công việc. Nói chung, bất cứ gì có thể giúp bạn hoàn thành 1 công việc nhất định hay để tăng năng suất hơn. 

Điều tuyệt vời đầu tiên về việc dựng app năng suất chính là cho bạn 1 lời giới thiệu tốt để dựng app. Bởi vì sự đơn giản tương đối của nhiều tính năng. Bạn có thể bắt đầu với cái gì đó đơn giản. Như là ‘text editor’ để dễ dàng viết các văn bản được định dạng với markdown, sau đó mở rộng theo nó. Sau đó thêm khả năng lưu văn bản như những tệp độc lập trên máy tính của bạn. Sau đó, 1 tính năng để xuất markdown đó như HTML để viết các email được định dạng. 

Để bắt đầu dựng 1 app năng suất, hãy hỏi các tính năng nào mà 1 app có thể làm cho kế hoạch hàng ngày của bạn dễ dàng hơn và bắt đầu từ đó.

5 dự án react buộc phải có cho portfolio của bạn

Những ví dụ điển hình: Todoist, Notion, Things, v..v..

Các công nghệ nên dùng: 

    • Tạo app React cho web hay React Native cho mobile
    • Gói npm react-markdown để hiển thị markdown trong UI app của bạn
    • Gói npm react-codemirror2 cho việc viết code trong note của bạn
    • và Gói npm react-draggable cho việc sắp xếp lại nội dung danh sách bởi việc ‘nhấp và kéo’

Tiếp theo sẽ là gì?

Nếu bạn đang hỏi bản thân, “Tại sao tôi phải tự làm điều này? Tại sao không có hướng dẫn nào tốt hơn ngoài kia cho cách dựng các app React như vầy?”

Thì bây giờ chính là lúc. 

Tôi rất hào hứng để thông báo 1 serie hoàn toàn mới cho các khóa siêu thực hành, nhập vai có tên là React12

Mỗi tháng trong năm, chúng tôi đều từng bước làm lại việc dựng 1 app clone thế giới-thật hoàn chỉnh. Với React mà cách nhìn và hoạt động của nó như 1 app thật sự. 

Nếu bạn theo con đường này 1 cách đầy đủ, bạn sẽ thấy cách để tạo 12 dự án tuyệt vời từ sơ khai đến lúc triển khai. 

Nó sẽ có tính năng của tất cả các app yêu thích của bạn (gợi ý: nhiều trong số chúng đều nằm trong bài viết này), bao gồm Instagram, Twitter, và Youtube, thêm 9 cái tên khác nữa. 

Bạn có thể bắt đầu ngay tại React12.io

Tuy nhiên, hãy hành động nhanh. Khóa tiếp theo sẽ bắt đầu sớm thôi!

Chúc may mắn với hành trình tạo ra app của bạn và hẹn gặp lại trong bài viết tiếp theo.

Topdev via codeartistry.io

Đừng bỏ lỡ bài viết hay về React:

Những concept JavaScript bạn cần biết trước khi học React

Cách tôi viết document cho react component

 React: Thử làm ứng dụng đổi tỷ giá

Xem thêm Tuyển dụng ngành CNTT hấp dẫn tại TopDev

3 công cụ ngon bổ rẻ cho Front-End developer

Front-end, như chúng ta đã biết, là bộ mặt của một web hay app, giao diện đẹp, bắt mắt sẽ dễ gây thiện cảm và thích thú với nhiều người hơn, developer chính là người sẽ tạo nên bộ mặt đó, nhưng việc đó là không dễ dàng. Là developer đã khổ rồi, 3 công cụ dưới đây sẽ khiến dân trong nghề “dễ thở” hơn trong việc tìm kiếm các giải pháp front-end cho mình. 

1. Lunar Popup 

3 công cụ ngon bổ rẻ cho Front-End developer

Đây là một thư viện cung cấp cho dev bộ popup, không những với thiết kế đẹp cực xịn mà còn có animation vô cùng mượt, và quan trọng nhất là hoàn toàn miễn phí. 

Cách sử dụng cực kỳ đơn giản, chỉ với 3 bước phía dưới, dev đã có thể sử dụng các source, design template và animation xịn xò, đẹp đẽ cho website của mình. 

3 công cụ ngon bổ rẻ cho Front-End developerNhưng khoan, đừng vội mừng, các bạn sẽ hoang mang khi click nút download lại bị chuyển vào trang gumroad rồi sẽ tự thắc mắc “ủa sao kêu miễn phí mà giờ lại bắt mua?”. Đừng lo, chỉ cần nhập con số như hình phía dưới xong cứ mạnh mẽ nhấn nút “I want this” để download nha (các bạn cũng đừng hỏi mình lý do vì sao vì chính mình cũng không biết lý do.

3 công cụ ngon bổ rẻ cho Front-End developer

  9 dự án mới nhất giúp bạn thành trùm Frontend trong năm 2024

2. Fancy Border Radius 

3 công cụ ngon bổ rẻ cho Front-End developer

Chắc ai cũng ám ảnh vụ vẽ sharp bằng CSS lắm, ngồi canh border-radius mất cả nửa ngày trời. Từ khi phát hiện ra cái tool này, mình hạnh phúc vô bờ bến, nắm kéo chỉnh chỉnh, vừa mắt thì copy paste thông số vào phần border-radius của CSS, không cần mất thời gian ngồi mò mẫm, canh chỉnh nữa, tiết kiệm được mớ thời gian làm các việc “quan trọng” khác.

Front-end tuyển dụng lương cao trên TopDev 

3. Fly-brid

3 công cụ ngon bổ rẻ cho Front-End developer

Một trang nguồn siêu hay cho ai mới bắt đầu làm email HTML. Đặc thù email HTML khó hơn HTML web rất nhiều. Việc build các template, layout đã đủ làm khốn khổ thôi rồi, có khi phải mất một ngày mới build xong. Bây giờ fly-brid sẽ giúp bạn bước đó, nhanh gọn nhẹ hơn, ngại gì không hốt. Mình đã thử responsive email source cũng kha khá, và mình chốt thấy cái này thuộc hàng chuẩn, dễ xài nhất.

  Nguồn tự học web front-end và web configuration ngon bổ rẻ

Thật ra anh em trong nghành tự code không cần source sẵn này chẳng sao cả, nhưng dù sao tiết kiệm thời gian và công sức được bao nhiêu hay bấy nhiêu nhỉ. Suốt ngày code cũng mệt mỏi lắm chứ, Topdev tụi mình chia sẻ một số source để mọi người có nhiều thời gian hơn làm những việc khác, cho bản thân chẳng hạn. Mọi người có source nào hay ho thì chia sẻ với cộng đồng anh em dev nhé! Thân ái chào quyết thắng !

TopDev tổng hợp 

Xem thêm những nội dung được nhiều người xem nhất về Front-end:

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

Xây dựng hệ thống Jenkins với hàng chục nghìn job

SPN là công ty top unicorn ở Silicon Valley, họ phát triển một communication tool tương tự như Skype, Slack. Tuy nhiên bằng cách mua lại một công ty về security là Perzoinc, họ đã tích hợp được thuật toán mã hóa của Perzoinc vào sản phẩm. Giúp Jenkins có độ bảo mật cực kì cao, được các doanh nghiệp tài chính, ngân hàng như HSBC, Citi Bank ưa chuộng và sử dụng.

Author: Giaosucan

Để đảm bảo sản phẩm được release liên tục nhanh chóng, do đó công ty đã có kế hoạch xây dựng một hệ thống CICD sử dụng Jenkins. Tuy nhiên họ gặp phải nhiều thử thách sau đây:
  • Có 4 môi trường dev, qa, uat, prod, ngoài ra còn nhiều team như qa performance, mobile… Mỗi team muốn có một Jenkins riêng để sử dụng để tránh conflict.
  • Số lượng nhân viên công ty, outsource lên tới cả ngàn, số lượng job chạy tính ra cũng hàng chục ngàn, làm thế nào để Jenkins chạy ổn định.
  • Không thể build Jenkins này theo cách manual, cần build tự động để đảm bảo provision infra một cách nhanh chóng, giảm thiểu human mistake.
  • Cần monitor hệ thống Jenkins để đảm bảo performance, xử lý issue kịp thời.
Các kĩ sư của SPN để tạo một project gọi là WarpDrive. Tên một loại động cơ trong phim khoa học viễn tưởng, có khả năng “kéo không gian” khiến phi thuyền có thể bay với vận tốc cực lớn.
Để giải quyết khả năng high availably and scale. Jenkins được build trên nền K8S thành các cluster. Mỗi team muốn có CICD pipeline riêng sẽ được tạo cluster riêng.
Bằng các setting trong RBAC (Role base access control), mỗi member trong 1 team được cấp quyền nhất định như Admin, User, Mod.
1 cluster bao gồm 1 master node và nhiều minion, nơi các agent được deploy.
Khi job Jenkins start, Jenkins master sẽ launch 1 con Jenkins agent (1 pod trong k8s), Jenkins agent sẽ chạy job, sau khi hoàn thành agent sẽ tự động bị destroy. Jenkins agent này run dưới dạng container, docker file được tạo và build riêng cho Jenkins agent, image up lên Google Cloud Registry
Khi job start, master sẽ launch 1 con agent (1 pod trong k8s), agent sẽ chạy job, sau khi hoàn thành agent sẽ tự động bị destroy. agent này run dưới dạng container, docker file được tạo và build riêng cho agent, image up lên Google Cloud Registry.
Để đảm bảo master có thể launch, destroy agent. Các kĩ sư cài đặt 1 K8s jenkins plugin, config để Jenkins có thể sử dụng docker images ở trên.
Tương tự Jenkins master cũng được build thành image từ dockerfile và up lên Google Registry. Các plugin của Jenkins cũng không cài đặt bằng tay, mà được định nghĩa trong 1 file txt, khi build image thì các plugin được tải và cài đặt. Cách đóng gói Jenkins master, slave thành docker tạo ra sự cơ động, portable, reusable
Tương tự master cũng được build thành image từ dockerfile và up lên Google Registry. Các plugin của Jenkins cũng không cài đặt bằng tay, mà được định nghĩa trong 1 file txt, khi build image thì các plugin được tải và cài đặt. Cách đóng gói master, slave thành docker tạo ra sự cơ động, portable, reusable.
Điều quan trọng là việc build up và deploy Jenkins được thực hiện hoàn toàn bằng code, (Infra as Code), sử dụng các công cụ như DSL, Helm, Terraform.
Điều quan trọng là việc build up và deploy Jenkins được thực hiện hoàn toàn bằng code, (Infra as Code), sử dụng các công cụ như DSL, Helm, Terraform.
Nhờ provision infra tự động bằng code, SPN đã giảm thiểu được human mistake, deploy Jenkins rất nhanh chóng và có thể clone ra nhiều cluster khác nhau.
Khi đã deploy thành công thì việc tiếp theo là monitoring, để biết họ dùng công nghệ gì để monitoring, đón xem phần tiếp theo.

Học và cả thiện kiến thức lập trình từ các dự án cá nhân (Pet Project)

Cách tốt nhất để học bất cứ thứ gì liên quan đến lập trình, đó là chúng ta dự định làm ra cái gì linh tinh để rồi trong quá trình làm ra sản phẩm đó chúng ta nhận ra những thứ chúng ta còn mơ hồ và lấn cấn, sau đó thì chỉ việc tìm hiểu tập trung những thứ này thôi. Đó cũng là một cách học những thứ mới mẻ, hoặc tìm hiểu những công nghệ xu hướng, mà người ta hay gọi là đú trend đấy

Bài này mình sẽ note lại những thứ trong quá trình làm ra một dự án pet project, và mình nghĩ nó sẽ hoàn toàn bổ ích cho những bạn muốn có cái nhìn toàn cảnh về việc làm nên một sản phẩm linh tinh từ đầu đến cuối để thỏa mãn dục vọng bản thân của một lập trình viên :D.

Trong quá trình hoàn thành dự án linh tinh này, mình sẽ hold lại và tìm hiểu cũng như giải thích những kiến thức mà bản thân mình còn chưa thật hiểu rõ. Theo shark tank thì khách hàng tiềm năng của bài là các thanh niên mới chập chững vào nghề hoặc là làm vài năm mà vẫn mông lung như một trò đùa (như mềnh :D).

Đầu tiên, nghĩ ra requirement cho pet project

Chắc chắn cái việc viết ra một dự án thú cưng thì đầu tiền nó phải thỏa mãn cái nhu cầu của chính người viết ra cái đã. Ở đây là mình, hoặc các bạn đọc ở đây, không cần quan tâm trên thị trường đã có sản phẩm nào tồn tại để cạnh tranh hay chưa vì chúng ta thường chỉ có kinh phí là 1 buổi sáng hoặc 1 ly cafe không thôi à, nên tập trung vào làm ngay và luôn là tốt nhắt.

Quay lại vấn đề requirement, chắc hẳn các bạn cũng biết cảm giác khi đau bụng (nhất là buổi sáng, sau khi vào công ty) là một khoảng thời gian riêng tư vô cung quý giá, mà trong đó chúng ta có thể làm mọi thứ mà không có cảm giác tội lỗi, mà 3G hay 4G trong toilet thì các bạn biết rồi đấy, các cụ hay bảo là “nhanh như rùa bò” ấy. Vào toilet mà không có gì xem hay đọc là một khoảng thời gian rất phí phạm của cuộc đời này, ở nhà còn có dầu gội dầu xả thế lọ thể chai để xem xuất xứ, thành phần này nọ chứ ở công ty, toilet của chung thì làm gì có gì mà coi, mà có thì coi 1 lần chứ đâu có coi quài được.

Từ những lý do ở trên của bản thân, mình quyết định sẽ lập trình 1 website đọc tin tức tối ưu hóa băng thông, hạn chế đến mức thấp nhất băng thông gửi từ server gửi xuống. Khoảng ~2kb cho trang chủ, và ~4kb cho list tin tức, còn nội dung thì tùy từ tin gốc nhưng ở khoảng ~10kb là đẹp. Vậy là đủ cho những nơi 3g thấp hoặc khi điện thoại bị hết băng thông rộng.

Xong phần requirement, bước kế tiếp là đến phần lựa chọn stack công nghệ.

Lựa chọn stack công nghệ

1 phần trong stack của AirBnB1 phần trong stack của AirBnB

  • Server và client: Do hạn chế băng thông cho client nên tốt nhất là dưới client chúng ta không nên sử dụng bất cứ một thứ gì cả, client chỉ việc lấy html và render ra là xong, tốt nhất là loại bỏ luôn file Javascript.
  • Backend technology: Nhanh gọn lẹ tốc độ, ăn liền nhất có lẽ Nodejs là một sự lựa chọn đúng đắn nhất, khởi tạo nhanh, lập trình nhanh, cũng như có rất nhiều host/ platform hỗ trợ việc deployment gọn lẹ như Heroku chẳn hạn. Còn về framework web với nodejs thì có lẽ expressjs là phổ thông và cũng là một framework tương đối đã trưởng thành.

    Kèm đó là Typescript ngoài các lợi ích của nó thì nó giúp code chúng ta tường mình hơn với việc hỗ trợ kiểu dữ liệu. Đương nhiên không công nghệ nào là thần thánh và hoàn toán không có khuyết điểm, Typescript cũng vậy nhưng với môi trường server thì nó ít bị tác dụng phụ hơn so với client(SPA) app. Mình không chuyên backend với nodejs, nên mình sẽ chọn những gì mình thấy là dễ dàng nhất (với bản thân mình, hoặc với đa số mọi người) để tiếp cận.

  • Web server: Nginx, một web server sinh sau đẻ muộn nhưng hiệu năng và độ thân thiện, với mình là khá hoàn thiện ngoài những bản plus thêm tính phí 😀

    Một chút chuyện web serverhttps://www.rootusers.com/linux-vs-windows-web-server-benchmarks/, dựa theo bài so sánh này, chúng ta có thể thấy là IIS có performace rất tốt trải dài từ 1~8 CPU core(s), nên không có nghĩa chúng ta không chọn IIS vì hiệu năng kém hay bất cứ lý do gì về vấn đề hiệu năng, mà với bản thân mình lý do không chọn IIS là vì:

    - Ứng dụng không bắt buộc chạy trên windows server
    - Windows server khá đắt đỏ so với linux
    - Server vs GUI rất nặng nề
    - (Có thể) dễ dàng bị tấn công hơn, dù điều đó phụ thuộc vào system administrator, theo mình thì đa số sa của linux hiểu rõ hệ điều hành của mình hơn
    - Cộng đồng hẹp, lợi thế riêng cho các ứng dụng phát triển bằng Microsoft technology
    
  • Server provider: Mình sẽ không sử dụng platform như Heroku để host ứng dụng này mà sẽ sử dụng 1 cloud vps, theo mình nó sẽ có nhiều điều để nói hơn. Okay, bất cứ providers nào mà bạn thân thuộc từ AWS (free tier 1 year), GCP (free 300$ năm đầu tiên cho new user), Azure (free 1 tháng đầu 200$ thì phải), DigitalOcean (free 10$ new user), Vultr(free 25$ new user)…

    Ở đây mình sẽ chọn Vultr nhé vì nó có gói 3.5$ cho 512RAM vs 2.2Ghz 1 core CPU. Khá đủ cho các pet/site project của chúng ta. Các bạn register ở link đây nhé: https://www.vultr.com/products/cloud-compute/, ref từ tài khoản của mình, hình như mình đc 10$ nếu bạn paid cho dịch vụ thì phải.

  • Server OS: Chắc chắn là Linux rồi, nếu ứng dụng của bạn không phải chạy bằng .Net Framework và dựa quá nhiều vào Windows API thì ko cần thiết phải cần đến một IIS server đắt đỏ. Nếu ứng dụng của bạn hiện tại đang được lập trình bằng .net core thì chúng ta cũng thoải mái deploy trên môi trường linux nhé.

    Mình sẽ chọn ubuntu 16.04 cho server nhé, nó là một distro của linux được sử dụng rất phổ biến trên thế giới, theo mình thì nó mạnh mẽ, cộng đồng rộng lớn, dễ sử dụng cho người mới bắt đầu (me) hay là cả system adminitrator nhiều kinh nghiệm.

    Theo mình không nên sử dụng ubutu 18.04 cho server nhé, hiện tại theo mình thấy có khá nhiều vấn đề về chuyện tương thích, có lẽ nó cần thêm thời gian để hoàn thiện hơn.

  • Containerize: Okay, container container everywhere mà, không cần công nghệ containerize thì chúng ta vẫn triển khai từ trước đến nay thôi, nhưng không thể chối bỏ việc Docker hay công nghệ containerize (gọi là công nghệ cũng không thật chính xác lắm, gọi là 1 philosophy thì chính xác hơn) đã giúp chúng ta rất nhiều trong việc lập trình, triển khai, scale up… Nói không ngoa containerize hay Docker đang là con cưng của giới công nghệ hiện tại :D. Mình cũng chỉ mới tiếp cận và sử dụng Docker khoảng vài tháng lại đây, thật sự mà nói nó giúp ích cho mình rất nhiều trong việc triển khai một ứng dụng.

    Chúng ta sẽ sử dụng Docker và Docker Swarm cho vấn đề triển khai này nhé. Sẽ nói về Docker swarm dành cho những bạn chưa đụng tới Docker ở đoạn sau nhé. Nhưng ngay lúc này bạn có thể search về Docker Swarm và Kurbenetes là gì, và nó khác nhau như thể nào?

  • Source control và CI/CD: có lẽ chúng ta nghĩ ngay tới github nhưng, pet project thì pet project chứ, nhiều khi nó lại là product triệu đô thì sao nhỉ ahihi, đùa chứ với một pet project thì github là nơi tuyệt vời để chúng ta lưu trữ dự án rồi, nhưng ở đây mình sẽ sử dụng gitlab để lưu trữ.

    Ngoài những thứ github có, thì nó còn đi kèm rất nhiều thứ để chúng ta hoàn toàn có thể phát triển phần mềm từ đầu đến cuối như: lưu trữpipeline buildtriển khải mà nó còn support private registry cho Docker image… và điều cuối cùng quan trọng là nó hỗ trợ chúng ta private dự án, cũng như unlimited collaborators10GB per project. Hiện tại các dự án trên công ty mình cũng sử dụng gitlab đóa.

  • Chuyện domain: domain thì chúng ta cứ GoDaddy và Namecheap và triển thôi, hai nhà cung cấp này có khuyển mãi tầm 1$ cho doamin .com cho người dùng mới trong năm đầu tiền, hoặc các bạn cũng có thể mua những domain giá khoảng 1$ với đuổi như .xyz.online… gì đấy, còn muốn hàng free thì cứ https://www.freenom.com.

Còn gì nữa không nhỉ?? Chắc không còn gì nữa nhỉ, ngoài các implement chi tiết hơn trong các phần tương ứng. Tổng kết lại stack của chúng ta nào:

  • Server side rendering only
  • Nodejs
    • Express
    • Typescript
  • Nginx web server
  • Vultr cloud vps
  • Linux ubuntu 16.04
  • Docker and Swarm
  • Gitlab for Source Control, CI/CD

Các bạn cũng có thể lên https://stackshare.io/news để xem các stack công nghệ của các công ty, cũng như mức độ phổ biến, điểm mạnh, điểm yếu của công nghệ đó. Và đừng ngại chia sẽ stack của mình đang áp dụng cho cộng đồng nhé.

Tới đây bài cũng khá dài, viết một lần chắc draft miết luôn quá. Nên thôi mình sẽ cố gắng chia bài này ra khoảng 2 đến 3 bài cho ngắn. Bài sau sẽ đi vào chi tiết việc implement và giải thích, tìm hiểu những kiến thức lập trình đi kèm. Hy vọng bài viết bổ ích cho các bạn nào chưa có cái nhìn tổng quan về việc lựa chọn công nghệ, và triển khai một ứng dụng từ con số 0 đến khi lên sản phẩm.

Tốt nhất trong tất cả các lựa chọn chúng ta nên dành thêm thời gian tìm hiểu thêm trên internet, nếu có những đồng nghiệp hay tiền bối có kinh nghiệm hơn đừng ngại hỏi họ nhé. Không ngại hỏi thì chúng ta cũng đừng ngại cám ơn nhé.

Author: DINH DUONG

TypeScript thoáng qua

Khi mình viết bài này rõ ràng thì TypeScript không còn là một thư viện đang nổi lên nữa. mà nó đã là thư viện đứng đầu về strong typing cho JavaScript. Hiện giờ nó và Flow của Facebook là 2 thư viện nổi tiếng nhất về strong typing cho Javascript. Nhưng có lẽ Microsoft với kinh nghiệm cùng ngôn ngữ ‘C#’,cái ngôn ngữ mà với mình nó là một ngôn ngữ đẹp, mạnh mẽ và khá chặt chẽ đã đem lại thành công cho TypeScript. Hiện nay rất nhiều thư viện đã và đang được viết mới hoặc viết lại bằng TypeScript như AngularVue 3Aurelia

Mặc dù Javascript là một ecosystem thay đổi chóng mặt, các chuẩn thay đổi liên tục, sóng sau sô sóng trước, cộng đồng hoạt động rất sôi nổi, rất nhiều concept được liên tục đưa ra, cũng như rất nhiều thư viên hỗ trợ cho nó nhưng tương lai là của nó vẫn là bất định 😅, thật sự tiếp cận và làm việc với Javascript khá là hứng thú cũng như tương đối là dễ dàng, nhưng cũng đã có những dự án đi xa được với nó, cũng có những anh tài đã dừng lại khi project thực sự trở nên quá lớn (nguồn: đọc tùm tà la bài của người ta). Có nghĩa dạo đầu thì dễ, còn sau sau thì khá là khó.

Nhưng có lẽ với TypeSript thì Javascript ít nhất cũng đã tốt hơn khá khá  nhiều.

Nhưng TypeScript cuối cùng cũng chỉ là một thư viện superset của Javascript nên bài này sẽ điểm qua các syntax của TypeScript cũng như giải thích đơn giản đi kèm theo kinh nghiệm của bản thân mình.

Các bạn có thể tham khảo chi tiết thêm từ trang chủ của TypeScript: https://www.typescriptlang.org/docs/home.html

Cài đặt

npm install -g typescript
tsc index.ts // Chạy file typescript

Các bạn có thể xem thêm về tsconfig.jsonhttps://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Syntax

Kiểu dữ liệu

let isDone: boolean = false;

Các loại dữ liệu cơ bản được support trong Typescript là numberstringDateboolean, ngoài ra còn các loại ít được xài hơn như là nullundefined

Tham khảo: https://www.typescriptlang.org/docs/handbook/basic-types.html

Khai báo biến

Tương tự như javascript nhưng kèm theo kiểu dữ liệu. Cũng như ES6 Typescript suggest sử dụng let và const để khai báo, và quên đi kiểu var huyền thoại 😅

Tham khảo: https://www.typescriptlang.org/docs/handbook/variable-declarations.html

Interface

Có lẽ đây là phần mình sẽ nói nhiều nhất, vì slogan của Typescript là Typescript – Javacript that scale 🤗

Khá tương tự như trong C# và Java

export interface IAnimal {
    sound(): string; // Tiếng nói
    go(): string;// Tiếng đi
    name: string;
}
export class Dog implements IAnimal {
    name: string;
    sound(){
        return "Gau gau"; // Chó sủa gâu gâu
    }
    go() {
        return "Kit kit";
    }
    constructor(name: string){
        this.name = name;
    }
}
export class Horse implements IAnimal {
    name: string;
    sound(){
        return "Hihi"; // Ngựa hí hí hí      
    }
    go(){
        return "Kaloc kaloc";
    }
    constructor(name: string){
        this.name = name;
    }
}

Source javascript sau khi compiler:

var Dog = /** @class */ (function () {
    function Dog(name) {
        this.name = name;
    }
    Dog.prototype.sound = function () {
        return "Gau gau"; // Chó sủa gâu gâu
    };
    Dog.prototype.go = function () {
        return "Kit kit";
    };
    return Dog;
}());
var Horse = /** @class */ (function () {
    function Horse(name) {
        this.name = name;
    }
    Horse.prototype.sound = function () {
        return "Hihi"; // Ngựa hí hí hí      
    };
    Horse.prototype.go = function () {
        return "Kaloc kaloc";
    };
    return Horse;
}());

💯 Điểm cộng thứ nhất rõ ràng là với typescript code của chúng ta đẹp đẽ và dễ đọc hơn rất nhiều.

Chúng ta cũng có thể vừa implements từ 1 hoặc nhiều interface và extends từ 1 class khác

export interface IHouseAnimal {
    isGuardHouse(): boolean;
}
class Chihuahua extends Dog implements IAnimal, IHouseAnimal {
    isGuardHouse() {
        return false; // Không thể canh nhà 😗
    }
    sound() {
        return "Goeo goeo";
    }
} 

Với extends chúng ta có thể sử dụng hoặc thay thế các hàm đã được implement bởi lớp cha, và do lớp IAnimal đã được implements đầy đủ phương thức ở lớp cha, nên Typescript chỉ warning là cần khai bao hàm isGuardHouse() ở lớp IHouseAnimalThông báo lỗi của typescriptThông báo lỗi của typescript

Generic trong interface

Có 2 thấy mình thấy tâm đắc nhất khi sử dụng Typescript đó là ngoài vấn đề code đẹp, dễ đọc, dễ bảo trì thì đó chính là kiểu Generic, một kiểu khá nổi tiếng bên ngôn ngữ C# được Microsoft đem qua Typescript, nó đem lại một ngôn ngữ hoàn toàn typing để viết code Javascript. Với những dự án lớn và làm việc nhiều team với nhau đây quả là một cải thiện to lớn 🤑.

Ví dụ chúng ta có một interface mà sẽ implements các phương thức của các hàm trong Iqueryable trong .net (C#), nếu bạn nào không làm C# trước đây thì cứ coi nó nhưng các hàm query data bình thường với một array thông thường.

interface IQueryable<T> {
    where<T>(iterator: (entity: T) => boolean): IQueryable<T>;
    select<U>(iterator: (entity: T) => U): IQueryable<U>;
    join<S>(source: S[] | Promise<S[]>, iterator: (aEntity: T, bEntity: S) => boolean): IQueryable<{ x: T, y: S }>;
    leftJoin<S, U extends T & S>(source: S[] | Promise<S[]>, iterator: (aEntity: T, bEntity: S) => boolean): IQueryable<U>;
}
  • where: Nhận vào 1 object kiểu T và trả về IQueryable cũng kiểu T
  • select: Nhận vào 1 object kiểu T nhưng trả về IQueryable với 1 kiểu mới sau khi select là kiểu U
  • join: Nhận vào 1 mảng data kiểu S và 2 object kiểu T, kiểu S nhưng trả về 1 object có hai thuộc tính mới là x và y, với x là kiểu T và y là kiểu S
  • leftJoin: Nhận vào 1 mảng data kiểu S và 2 object kiểu T, kiểu S nhưng trả về 1 object có kiểu U có những thuộc tính thuộc cả T lẫn S

Có thể thấy với Generic thì Typescript đã đem lại khá nhiều lợi ích cho việc định nghĩa các kiểu dữ liệukiểu trả về,… cho Javascript 😇

Vài thứ bên lề

Theo gợi ý của Typescript thì nên sử dụng interface để làm một type class thay cho việc sử dụng class thông thường:

Type class

interface LoginModel {
    username: string;
    password: string;
    rememberMe: string;
}

class LoginModelClass{
    username: string;
    password: string;
    remember: string;
}

let model = {} as LoginModel;
let modelClass = {} as LoginModelClass;
var LoginModelClass = /** @class */ (function () {
    function LoginModelClass() {
    }
    return LoginModelClass;
}());
var model = {};
var modelClass = {};
}());

Chúng ta thấy class sẽ được biên dịch thành một function object còn interface thì không. Từ đó nó hạn chế được số lượng source code mà chúng ta sinh ra và từ đó giảm thiểu dung lượng ứng dụng 🤪

Bài viết xin tạm dừng tại đây, vì Typescript cũng có khá là nhiều thứ hay ho, nhưng tóm gọn lại nó nằm trong khuôn khổ syntax nên các bạn có thể lên đây tham khảo (https://www.typescriptlang.org/docs/handbook/basic-types.html) thêm những như chi tiết hơn của nó.

Các bài tới nếu về Typescript mình sẽ chia sẽ về những thứ linh tinh, hay ho về Typescript chứ không phải là giới thiệu về nó nữa.

Author: DINH DUONG

“Luyện” gì để trở thành Software Engineer xịn?

Có thể nói, Software Engineer là level “trùm cuối” mà dân công nghệ nào cũng ao ước với tới. Trước khi biết cần trang bị gì để chinh phục level này thì cần hiểu được Software Engineer là gì? 

Thế nào là Software Engineer?

 

“Luyện” gì để trở thành Software Engineer xịn?

Computer Scientist + Application Developer = Software Engineer, Software Engineer là sự giao thoa giữa hai level Computer Scientist và Application Developer, là người có cái nhìn tổng quát về mọi thứ; vừa có kiến thức chuyên sâu rất tốt, tư duy problem solving cao; vừa có khả năng lập trình cực tốt. Đây là loại mà các công ty phần mềm như Google, Facebook, Twitter, …. luôn muốn tuyển vào.

Computer scientist mạnh về kiến thức khoa học máy tính và kỹ năng research; nhưng lại thiếu kỹ năng về phát triển phần mềm; trong khi application developer lại ngược hoàn toàn. Level nào cũng có điểm mạnh, điểm yếu riêng và Software Engineer hội tụ các điểm mạnh của 2 level, và bạn ngày càng dày công tu luyện thì ngày càng sẽ lên trình thôi. 

Cần gì để trở thành Software Engineer? 

 

“Luyện” gì để trở thành Software Engineer xịn?

Đây là sơ đồ đơn giản mô tả những mảng kiến thức (knowledge areas) được tổng hợp bới IEEE Computer Society, một tổ chức quy tụ những kỹ sư giàu kinh nghiệm làm việc trong ngành Software.

Đồng thời, những mảng kiến thức này cũng mang tính khái quát rất cao, nên để viết một website, để làm một mobile app, bạn không nhất thiết phải nắm tất cả những mảng kiến thức trong này vẫn có thể làm tốt. Nhưng để định vị bản thân trở thành một software engineer chuyên nghiệp, hướng tới việc xây dựng những hệ thống software ngày càng hoàn thiện, chất lượng cao, cũng như quy mô ngày càng lớn thì việc vận dụng những kiến thức nền tảng như thế này là cần thiết.

Từ sơ đồ trên mình tập trung vào 4 mảng chính cần có để trở thành Software Engineer nhé, đó là: programming languages, software requirements, software design, software constructions.

Tham khảo thêm các vị trí tuyển dụng Software Engineer tại Topdev

Programming language 

Một Software Engineer không nhất thiết phải biết và sử dụng tất cả các loại ngôn ngữ lập trình, bạn không phải là thần thánh, nhưng ít nhất cũng cần nên biết một số ngôn ngữ lập trình phổ biến. 

Một cuộc khảo sát cho thấy có rất nhiều ngôn ngữ lập trình, và mức độ sử dụng của từng loại cũng khác nhau. 

“Luyện” gì để trở thành Software Engineer xịn?

Bạn lựa chọn học loại ngôn ngữ mà nhiều người sử dụng, hay bạn lựa chọn học loại ngôn ngữ mình thích, tất cả lựa chọn ở bạn thôi. Nhưng dù bạn lựa chọn như thế nào thì hãy tìm hiểu sâu về một loại ngôn ngữ, còn các loại ngôn ngữ khác, cũng nên tìm hiểu thêm nó một chút để ta không bị lạc hậu trong ngành. 

Software Requirements

Software Requirements tập hợp những chủ đề (Topics) liên quan đến việc thu thập, đánh giá, phân tích, mô tả yêu cầu phần mềm (software requirements).

Một bản requirement rõ ràng sẽ giúp team phát triển sản phẩm tạo đúng sản phẩm như yêu cầu. Và nó cũng giúp đặt nền tảng cho việc phát triển sản phẩm. Để tạo ra một bản requirement cần có 5 bước: tạo outline, xác định mục đích của sản phẩm, mô tả bạn xây dựng nó ra sao, chi tiết các requirement, và cuối cùng requirements đó được phê duyệt. Thêm vào đó, 3 điều tối thiểu cần phải có trong requirement, đó là: mục đích, mô tả tổng thể, và những yêu cầu cần chú ý. 

Dù công ty của bạn làm outsource với requirements được mô tả cụ thể và chi tiết từ đầu, hay công ty của bạn làm product, với requirements được mô tả khái quát và dần dần định hình sau mỗi vòng lặp phát triển (sprint) thì những topic trên đều rất cần thiết.

Một số topic trong mảng này có thể kể đến như: Requirements Classification, Conceptual Modeling, Formal Analysis, System Requirement Specifications, Model Validation, …

Software Design

Software design là bước đầu tiên trong software design life cycle, nó sẽ chuyển hóa từ ý tưởng thành hiện thực, và cố gắng thực hiên các yêu cầu được đề cập trong requirement. Software Design được định nghĩa là quá trình xác định kiến trúc (architecture), thành phần (components), giao diện (interfaces), và những yếu tố khác làm thành hệ thống phần mềm. Trong software design có 3 level: architectural design, high-level design, và detailed design.

Một số chủ đề con của mảng kiến thức về Software design mà bạn có thể tham khảo: Architectural Styles, Architectural Structures and Viewpoints, Distribution of Components, Control and Handling of Events, Concurrency, Security, …

Software Constructions 

“Luyện” gì để trở thành Software Engineer xịn?
What Is Software Construction?

Software Construction là việc tạo dựng phần mềm thông qua code, launch sản phẩm, testing và debug. Construction sử dụng các output từ quá trình design để build up phần mềm. Do đó, design, construction, testing quan hệ chặt chẽ với nhau.

Thực tế khi làm software, giai đoạn gây hứng thú nhất chính là lúc bắt tay vào “code”, hiện thực hóa những yêu cầu, những ý tưởng trong đầu thành code cụ thể. Tuy nhiên, để code hiệu quả và sạch đẹp cũng có nhiều thứ bạn cần phải cân nhắc: các dòng code sắp xếp ra sao, add function như thế nào, identation sao cho hợp lý…, tất cả những điều này hợp lại, tạo construction sạch đẹp sẽ giúp bạn rất nhiều. 

Mảng kiến thức về Software Constructions bao hàm một số quy tắc, kỹ thuật, … mà bạn có thể vận dụng trong quá trình hiện thực hóa phần mềm của mình như: Concurrency, Middleware, Construction Methods for Distributed Software, Construction Methods for Heterogeneous Systems, Performance Analysis and Tuning, State-Based and Table-Driven Construction Techniques, …

Công nghệ ở Việt Nam phát triển vượt bậc nhưng Software Engineer lại khá ít. Trên đây là một số chia sẻ nho nhỏ của mình, để đi vào chi tiết thì vô vàn và đa dạng. Các bạn hãy cùng Topdev mở rộng con đường này bằng cách chia sẻ thêm những kiến thức về ngành nghề này ! 

Xem thêm việc làm IT mới nhất trên TopDev

Học Javascript 1: Syntax Parser, Execution Context, Lexical Environment là gì

Author: Khoa Nguyen

Tại sao cần biết những thuật ngữ này

Thực sự, bạn không cần biết những khái niệm như Syntax ParserExecution ContextLexical Environment trong JavaScript là gì vẫn được. Tuy nhiên, nếu bạn muốn hiểu rõ chính xác điều gì đang diễn ra khi code bạn chạy (đương nhiên vẫn dễ hiểu hơn mã máy nha) thì bạn cần phải giải thích được những thuật ngữ khô khan này.

Ngoài ra, những thuật ngữ nền tảng này sẽ theo bạn xuyên suốt quá trình học và làm việc với Javascript sau này. Để hiểu những khái niệm khác như: hoisting trong Javascript (Creation Phase vs. Execution Phase), từ khóa this, array functions thì bạn nên hiểu Syntax ParserExecution ContextLexical Environment  là gì trước.

Tuyển dụng lập trình viên Javascript tại đây

Syntax Parser là gì?

Ngôn ngữ lập trình cũng có nhiều loại. Mình sẽ không phân loại ở bài viết này. Nhưng bạn sẽ thường thấy cụm từ “ngôn ngữ lập trình cấp cao” high level programming language. Javascipt là một trong số đó, vì thế cú pháp (syntax) của nó khá giống ngôn ngữ tự nhiên.

Ví dụ muốn viết một hàm thì:

function greet(){ var a = “hello world”; }

Thực chất Synax Parser cũng chỉ là một chương trình được các lập trình viên khác viết ra mà thôi. Syntax Parser trong Javascript sẽ dịch đoạn code này sang mã máy vì mã máy quá phức tạp và khó, không phải ai cũng học được.

Học Javascript 1: Syntax Parser, Execution Context, Lexical Environment là gì

Syntax Parser là gì

Lexical Environment là gì?

Lexical Environment là nơi chúng ta viết code của mình (đặt biến, hằng, hàm ở đâu?) Và điều này rất quan trọng.

Như đã nói ở Syntax Parser, code ta viết sẽ được dịch sang mã máy, vì thế nhìn code là có thể biết được biến, hàm chúng được tạo như thế nào trong bộ nhớ máy tính, chúng tương tác với nhay như thế nào.

Để hiểu rõ hơn, mình lấy ví dụ đoạn code sau:

function greet(){ var a = “hello world” }

Lexical Environment tức là bạn đặt biến a trong hàm greet(). (Đã trả lời cho cây hỏi: Nơi đặt biến a?)

Một số trang sẽ nói là Lexical Environment là Scope hay Lexical Scope. Các anh hùng vẫn tranh cãi về vấn đề này trên StackOverFlow.

Còn đây là định nghĩa gốc chính chủ:

Lexical Environment  is the place where “the association of Identifiers to specific variables and functions based upon the lexical nesting structure of ECMAScript code” is stored.

Từ định nghĩa này, bạn sẽ thấy một loạt từ chuyên môn (Jargon) khác như:

  1. Association of Identifiers
  2. Lexical Structure

Rồi từ 2 cái này lại đẻ ra:

  • environment record
  • reference to the outer environment
  • Declarative environment record
  • Object environment record

Execution Context là gì?

Một lần nữa mình xin nhắn lại code ta viết sẽ được dịch sang mã máy. Vì thế trong quá trình dịch này sẽ có nhiều thứ xảy ra, một trong số đó là Execution Context.

Mình lấy ví dụ đoạn code sau:

function greet(){ var a = “hello world” function shakeHands(){ var count = 5; } }

Thì Execution Context sẽ quyết định tạo biến a trước hay biến count trước. Rồi chương trình sẽ chạy greet() trước hay shakeHands() trước.

Sẽ có một loạt thuật ngữ chúng ta cần hiểu liên quan đến Execution Context như:

  • Global code
  • Function code
  • Eval Code
  • Execution Context Stack
  • Creation Stage
  • Code Execution Stage

Kết luận

Có thể bạn nghĩ tại sao phải hiểu mấy cái khỉ này làm gì, có ích gì cho đời đâu. Nhưng hãy tin mình đi, đây là nền tảng để bạn có thể hiểu rõ Javascript trong tương lại. Bài này chỉ mục đích giới thiệu, ở những bài sau, chúng ta sẽ  tìm hiểu chi tiết hơn. Còn rất nhiều cái quái đản trong Javascript đang chờ đón bạn!

Tham khảo các vị trí tuyển nhân viên IT tại Hà Nội, Đà Nẵng, HCM cho bạn

Cách viết “Hello World” với 28 Ngôn ngữ Lập trình

Bọn máy tính khá là thực dụng – Nó chỉ làm những gì được yêu cầu thôi. Vậy làm thế nào để báo máy tính cần phải làm gì? Bạn sẽ phải “nói” thông qua Ngôn ngữ Lập trình. Và 1 trong những việc đầu tiên bạn cần làm khi học 1 ngôn ngữ lập trình mới chính là làm cho máy tính hiển thị “Hello, World”.

Không có ngôn ngữ lập trình nào là hoàn hảo cả, chúng đều có những đặc điểm khác nhau. Và mỗi ngày có hàng trăm ngôn ngữ mới được tạo ra. 

Dưới đây là danh sách các ngôn ngữ lập trình mà mình muốn giới thiệu và hầu hết chúng đều đã được ghi danh trên ‘bảng vàng’ của ngành lập trình. Ngày nay chúng vẫn đang được sử dụng và đóng góp thêm cho ‘nghệ thuật của các ngôn ngữ máy tính’. 

ANGOL

Cùng đương thời với các ngôn ngữ lập trình FORTRAN, Lisp, và COBOL vào đầu những năm 1950. Nó đã trở thành cách quy chuẩn để diễn tả các thuật toán học thuật trong hơn 30 năm, và đã tác động ảnh hưởng tới nhiều syntax của các ngôn ngữ lập trình khác, C là 1 cái tên tiêu biểu trong số đó.

BEGIN DISPLAY("HELLO WORLD!") END.

ASPECTJ

Tiêu chuẩn thực tế cho phong cách lập trình, hay còn được gọi là ‘Aspect Oriented Programming’ (AOP). AOP không phổ biến cho lắm, nhưng khá được yêu thích bởi 1 số người và khái niệm đặc biệt của AOP đã giúp nó tìm được con đường riêng của mình tới các thư viện và ngôn ngữ khác. AspectJ sử dụng các syntax khá giống Java. 

// HelloWorld.java
public class HelloWorld {
    public static void say(String message) {
        System.out.println(message);
    }

    public static void sayToPerson(String message, String name) {
        System.out.println(name + ", " + message);
    }
}

// MannersAspect.java
public aspect MannersAspect {
    pointcut callSayMessage() : call(public static void HelloWorld.say*(..));
    before() : callSayMessage() {
        System.out.println("Good day!");
    }
    after() : callSayMessage() {
        System.out.println("Thank you!");
    }
}

APPLESCRIPT

Nếu bạn đang sử dụng máy Mac, bạn có thể dùng cái này để tự động hoá và tuỳ chỉnh các ứng dụng của mình. 

say “Hello, world!”

ASSEMBLY LANGUAGE

Đây chính là ngôn ngữ sẽ giúp bạn tạo ra 1 phần mềm có hiệu năng và hiệu quả cao nhất mà bạn vẫn có thể đọc được. Thật sự Assembly rất khó để viết nên thường nó chỉ được dùng trong các phần nhỏ mang tính ‘performance-sensitive’ của chương trình. Bạn sẽ tìm thấy chúng trong các hệ điều hành và các bộ máy game 3D. 

    global  _main
    extern  _printf

    section .text
_main:
    push    message
    call    _printf
    add     esp, 4
    ret
message:
    db  'Hello, World', 10, 0

BASH (UNIX SHELL)

Từng được dùng để quản lý và tương tác các dòng lệnh với hệ thống Linux & Unix. 

#!/bin/bash
STR="Hello World!"
echo $STR

BASIC

Basic được ra mắt vào năm 1964 và vươn lên thời hoàng kim vào đầu những năm 80, khi mà máy vi tính bắt đầu thâm nhập vào các văn phòng nhỏ và hộ gia đình. Bạn mong đợi để viết riêng phần mềm của mình và phần lớn các máy tính được gửi kèm với một số phiên bản của BASIC. Nó tiếp cận đến được nhiều người nhờ việc dễ học và vừa đủ để chạy trên các phần cứng không mạnh lắm này. 

Số lượng các biến thể của BASIC là vô cùng lớn, Visual Basic là 1 biến thể khá phổ biến trên Windows trong những năm 90. Sau đó nó được thay thế bởi Visual Basic .NET (bây giờ chỉ còn gọi là Visual Basic) nhưng khá là khác biệt so với phiên bản trước đó. Visual Basic hiện vẫn được sử dụng rộng rãi.

10 PRINT "Hello, World!"
20 END

C

Đây chính là ngôn ngữ phổ biến nhất trên thế giới. Là ngôn ngữ viết ra các hệ điều hành nổi tiếng như Windows, MacOS, iOS và Android, cũng như các trình duyệt và engineer game 3D. Syntax của nó đã ảnh hưởng đến vô số các ngôn ngữ lập trình khác.

Các map của C khá gần giống như Assembly Language nhưng bạn có thể viết nhiều chương trình phức tạp với nó. Nếu bạn cần hiệu năng cao nhất có thể mà không muốn bị quả tải thì C chính là thứ dành cho bạn.

C còn là ngôn ngữ làm phổ biến nên khái niệm “Hello, World”.

#include <stdio.h>

int main(void)
{
    printf("hello, world\n");
}

C++

Hiệu suất của C++ gần giống như C và được sử dụng trong các dự án quan trọng như Chrome browser. C++ là kết quả của nỗ lực để tạo nên 1 ngôn ngữ giúp dễ dàng build nên các dự án lớn trong khi vẫn giữ được hiệu suất và tốc độ nhanh. 

#include <iostream>

int main()
{
    std::cout << "Hello, world!\n";
    return 0;
}

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

C#

Được tạo ra khi Microsoft dựng nên .Net virtual machine. Và C# đã trở thành ngôn ngữ lập trình hàng đầu của Microsoft. 

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, world!");
    }
}

Tham khảo ngay các vị trí tuyển dụng C# mới nhất từ các công ty HOT

CAML (OCAML)

Một ngôn ngữ lập trình tập trung chức năng trong họ ngôn ngữ ML. Được dùng cho 1 số dự án nhỏ trên Facebook. Compiler cho ngôn ngữ Facebook’s Hack được viết bởi OCaml.

print_endline "Hello, world!";;

CLOJURE (CLOJURESCRIPT)

Một ngôn ngữ lập trình chức năng có dự định để thành 1 bước tiến mới trên Lisp. Nó được chạy trên virtual machine của Java hay compile xuống JavaScript. 

(println "Hello world!")

COBOL

1 thời rất nổi tiếng trong thời đại máy tính mainframe. Hiện giờ thì nó đã khá lu mờ và nhiều chương trình COBOL đang được chuyển thể sang các ngôn ngữ khác. 

       IDENTIFICATION DIVISION.
       PROGRAM-ID. hello-world.
       PROCEDURE DIVISION.
           DISPLAY "Hello, world!"
           .

COFFEESCRIPT

1 nỗ lực để làm JavaScript dễ dàng sử dụng hơn.

console.log "Hello, World!"

DART

1 ngôn ngữ cho các phần mềm xây dựng theo hướng khách hàng và có thể chạy trên điện thoại và trình duyệt. Google đang sử dụng Dart cho 1 số dự án quan trọng. 

main() {
  print('Hello World!');
}

DBASE (FOXPRO)

dBase là bộ sưu tập các công cụ: ngôn ngữ lập trình,  database, các form. Trong thời của riêng mình, dBase đã từng khá phổ biến hơn hiện tại nhiều. 1 clone khá nổi khác của nó là FoxPro. 

? "Hello World"

DELPHI (OBJECT PASCAL)

Delphi đã từng là 1 công cụ phát triển ứng dụng nhanh chóng (Rapid Application Development – RAD) bởi sử dụng ngôn ngữ Object Pascal. Trong những năm giữa đến cuối thập niên 90, nó khá được yêu thích bởi các lập trình viên cho việc viết các chương trình Windows. Dù không còn được sử dụng nhưng nó vẫn là 1 trong những ngôn ngữ được yêu thích.

procedure TForm1.ShowAMessage;
begin
  ShowMessage('Hello World!');
end;

EIFFEL

Ngôn ngữ đi đôi với phương pháp viết phần mềm có tên là Eiffel Method. Eiffel đã giới thiệu khái niệm về “Design by contract” (Design by contract trong Eiffel: một phương pháp làm nâng cao tính tin cậy phần mềm và cung cấp nền tảng cho việc đặc tả, làm tài liệu và kiểm nghiệm phần mềm), và đến giờ đã được sử dụng trong các ngôn ngữ khác. 

class
    HELLO_WORLD
create
    make
feature
    make
        do
            print ("Hello, world!%N")
        end
end

ERLANG

Được thiết kế để cung cấp thông tin xử lý thời gian-thực và tính khả dụng cao theo một cách có phân phối. Nó phổ biến trong các hệ điều hành điện thoại nhưng ít được biết đến cho tới khi nó được dùng cho CouchDB, dự án đã làm ‘chất xúc tác’ cho phong trào NoSQL.

 -module(hello).
 -export([hello_world/0]).

 hello_world() -> io:fwrite("hello, world\n").

ELIXIR 

Trong khi Erlang khá tuyệt vời tại cấp độ kỹ thuật, thì các lập trình viên lại cảm thấy khó khi làm việc cùng nó. Elixir sử dụng công nghệ của Erlang trong khi cung cấp trải nghiệm dễ dàng hơn cho các lập trình viên. 

IO.puts "Hello World!"

F#

1 ngôn ngữ lập trình chỉ tập trung vào các chức năng, chạy trên .NET framework. 

open System
Console.WriteLine("Hello World!")

FORTRAN

Được tạo ra vào những năm 1950 để chạy trên máy tính mainframe, nó khá phù hợp cho công việc khoa học và số. Fortran đã trở thành tiêu chuẩn trong thế giới khoa học nơi mà nó vẫn còn được sử dụng đến ngày nay. 

program helloworld
     print *, "Hello world!"
end program helloworld

GO

Go được tạo ra và sử dụng tại Google. Là 1 ngôn ngữ luyện tập mà chỉ tập trung vào năng suất của lập trình viên với 1 cộng đồng chỉ tập trung vào hiệu năng và độ trễ thấp (low latency).

package main

import "fmt"

func main() {
    fmt.Println("Hello, World")
}

GROOVY (RUBY)

1 ngôn ngữ dạng dynamic typing, được chạy trong runtime của Java. Hầu hết các code Java sẽ đều chạy như code Groovy nhưng code Groovy có thể gọn nhẹ hơn vì nó không yêu cầu mọi thứ như Java. 

println "Hello World"

HASKELL

Thuộc loại hạng nặng, ngôn ngữ lập trình chức năng thuần túy. 

module Main where

main :: IO ()
main = putStrLn "Hello, World!"

IBM RPG 

Được ra mắt lần đầu vào năm 1959, được tạo ra bởi IBM để chạy trên phần cứng của họ. Là 1 trong những ngôn ngữ ít ỏi được thiết kế cho các loại thẻ đục lỗ (punch card) mà vẫn còn dùng ngày nay. 

dcl-s wait char(1);

dsply ( 'Hello World!') ' ' wait;

*inlr = *on;

JAVA 

Điều làm cho Java đặc biệt là việc nó được thiết kế để các lập trình viên chỉ cần viết code 1 lần và cho phép nó chạy trên mọi hệ điều hành. Java là ngôn ngữ phổ biến nhất trên thế giới. Nó được dùng để dạy lập trình cho học sinh và trong các công ty lớn. Tất cả các ứng dụng Android đều được viết bằng Java. 

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Prints the string to the console.
    }
}

JAVASCRIPT (ECMASCRIPT) 

JavaScript là ngôn ngữ lập trình phổ biến nhất trên thế giới. Lý do chính là vì nó được yêu cầu để có thể chạy trên mọi trình duyệt web. JavaScript giúp cho web sống động và dễ tương tác hơn. Nó được tiêu chuẩn hóa dưới cái tên ECMAScript. 

console.log("Hello World!");

LISP

Được thiết kế 1 năm sau Fortran, Lisp là ngôn ngữ lập trình cấp cao lâu đời thứ 2 trên thế giới mà vẫn còn được sử dụng rộng rãi. Lisp có thể đặt yêu cầu đối với nhiều ngôn ngữ lập trình trước, và bây giờ có thể được coi là một họ ngôn ngữ cũng như là bản thân nó cũng là 1 ngôn ngữ. Được phổ biến trong giai đoạn những năm 70 cho việc nghiên cứu AI. Dù độ phổ biến của nó dường như đã phai dần vào những năm 90 nhưng giờ đây nó đã lấy lại được sự phổ biến nhờ vào vài phương ngữ mới. 

(print "Hello world")

LOGO 

Với mục đích sử dụng cho giáo dục, Logo có mối liên hệ chặt chẽ với việc dạy các khái niệm đồ họa. Phổ biến trong những năm 80, học sinh sẽ điều hướng 1 “chú rùa” trên màn hình để vẽ những đường kẻ. 1 số học sinh may mắn sẽ có 1 chú rùa máy thật sự để vẽ những đường nét này trên giấy thật. 

TO HELLO
        PRINT [Hello world]
        END

LUA

Điều làm cho Lua trở nên tuyệt vời là vì cách nó nhúng dễ dàng vào phần mềm.

print("Hello World!")

MACHINE CODE

Machine code là chỉ dẫn cấp độ thấp nhất bạn có thể gửi tới 1 CPU. Machine code thường khó đọc được bởi con người và con người chỉ có thể làm những việc nhỏ nhặt với nó. Nhưng tất cả phần mềm cuối cùng đều được chuyển thành Machine code trước khi nó được gửi đến CPU. 

b8    21 0a 00 00   #moving "!\n" into eax
a3    0c 10 00 06   #moving eax into first memory location
b8    6f 72 6c 64   #moving "orld" into eax
a3    08 10 00 06   #moving eax into next memory location
b8    6f 2c 20 57   #moving "o, W" into eax
a3    04 10 00 06   #moving eax into next memory location
b8    48 65 6c 6c   #moving "Hell" into eax
a3    00 10 00 06   #moving eax into next memory location
b9    00 10 00 06   #moving pointer to start of memory location into ecx
ba    10 00 00 00   #moving string size into edx
bb    01 00 00 00   #moving "stdout" number to ebx
b8    04 00 00 00   #moving "print out" syscall number to eax
cd    80            #calling the linux kernel to execute our print to stdout
b8    01 00 00 00   #moving "sys_exit" call number to eax
cd    80            #executing it via linux sys_call

MATHEMATICA (WOLFRAM LANGUAGE)

Một chương trình với ngôn ngữ lập trình chuyên dụng, phổ biến trong giới khoa học và toán học để thực hiện các phép tính phức tạp. 

CloudDeploy["Hello, World"]

MATLAB

Một sự kết hợp của 1 chương trình và 1 ngôn ngữ lập trình. Được sử dụng để phân tích dữ liệu và phát triển các thuật toán. Nó được sử dụng trong giáo dục để dạy đại số tuyến tính và phân tích số. Nó cũng phổ biến với các nhà khoa học làm việc về thao tác hình ảnh.

classdef hello
    methods
        function greet(this)
            disp('Hello, World')
        end
    end
end

ML

Một ngôn ngữ chức năng có nguồn gốc từ Lisp nhưng với một hệ thống hạng nặng.

print "Hello world!\n";

NODE.JS 

Không hẳn là 1 ngôn ngữ (ngôn ngữ được sử dụng là JavaScript) nhưng là 1 môi trường runtime để chạy JavaScript trên các máy chủ so với trình duyệt. Mục đích là để chứng minh rằng lập trình không thực sự đồng bộ tốt hơn cho các CPU ‘multi-core’ hiện đại. Bây giờ nó được sử dụng rất nhiều cho công cụ của các dự án lớn.

console.log("Hello World!");

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

OBJECTIVE-C

1 bản mở rộng của C và được thêm vào Smalltalk như là phần tin nhắn. Được dùng bởi Apple để viết macOS và iOS. 

main()
{
  puts("Hello World!");
  return 0;
}

PASCAL 

Ngôn ngữ phổ biến những năm 80 và 90 đặc biệt là dành cho việc dạy lập trình. Nó đã phát triển rất nhiều và cũng là ngôn ngữ được sử dụng trong bộ công cụ Delphi RAD.

program HelloWorld(output);
begin
  Write('Hello, world!');
end.

PERL 

Perl rất mạnh để xử lý văn bản. Một sự lựa chọn phổ biến để buils trang web trong những ngày đầu của các trang web động (dynamic webs). 

print "Hello, World!\n";

PHP 

PHP là ngôn ngữ phổ biến nhất để xây dựng phần backend của trang web. Nó còn là ngôn ngữ đã viết nên Facebook và WordPress. Sau đó, Facebook quyết định tạo ra phương ngữ PHP riêng của họ có tên là Hack. 

<?php echo "Hello, World";

POWERSHELL 

Được dùng để tương tác và quản lý hệ điều hành Windows ở mức dòng lệnh. 

Write-Host "Hello, World!"

PYTHON 

Với một cú pháp nhỏ gọn cần ít dòng code hơn các ngôn ngữ khác như Java hoặc C ++. Nó rất phổ biến và được sử dụng cho các trang web cũng như trong việc phát triển Trí tuệ Nhân tạo (AI). 

print("Hello World")

R

1 ngôn ngữ tuyệt vời cho công việc thống kê, và là 1 lựa chọn phổ biến trong thế giới khoa học. 

cat("Hello world\n")

RPG 

1 ngôn ngữ lập trình đã lâu đời mà vẫn còn được dùng bởi sự phát triển không ngừng của nó. Với khởi nguồn trong giai đoạn thẻ đục lỗ (punch card), hiện nó vẫn được tìm thấy trên hầu hết các phần cứng của IBM.

dcl-s wait char(1);

dsply ( 'Hello World!') ' ' wait;

*inlr = *on;

RUBY

Được thiết kế để thành 1 ngôn ngữ vui nhộn và năng suất để sử dụng, nhấn mạnh nhu cầu của con người hơn là nhu cầu máy tính. Web framework Rails được viết cho Ruby và có tác động rất lớn đến thiết kế các Web framework. Ruby vẫn còn là một ngôn ngữ phổ biến để tạo trang web. 

puts 'Hello World!'

RUST 

1 ngôn ngữ mới được dự định để thay thế các ngôn ngữ như C để thực hiện công việc ở cấp hệ thống. Các bộ phận của Firefox đang được thay thế dần bằng Rust. 

fn main() {
    println!("Hello, world!");
}

SCALA 

Được thiết kế để giải quyết một số chỉ trích về Java. Một ngôn ngữ tập trung vào chức năng chạy trên virtual machine của Java. 

 object HelloWorld extends App {
   println("Hello, World!")
 }

SCHEME 

Một trong hai phương ngữ chính của Lisp, cái còn lại là Common List. Scheme đã cố gắng tối giản trong phần thiết kế và cho phép các extension mạnh hơn cho ngôn ngữ.

(let ((hello0 (lambda() (display "Hello world") (newline))))
  (hello0))

SCRATCH 

Một ngôn ngữ lập trình trực quan được thiết kế để cho trẻ em học các kỹ năng bằng cách lập trình. Ngoài ra còn có Scratch Jr. dành cho trẻ từ 5 – 7 tuổi. Cả hai ngôn ngữ được sử dụng bởi hàng triệu người bên trong và ngoài trường học trên toàn thế giới. 

say Hello, World!

SELF

Một phương ngữ của Smalltalk, nó là ngôn ngữ đầu tiên sử dụng lập trình dựa trên nguyên mẫu, thứ mà JavaScript cũng đang sử dụng.

'Hello, World!' print.

SMALLTALK 

Một ngôn ngữ rất quan trọng có ảnh hưởng lớn đến nhiều ngôn ngữ lập trình. Nhiều thứ phổ biến trong ngành lập trình hiện nay đều được thực hiện lần đầu tiên trên Smalltalk.

Transcript show: 'Hello World!'.

SWIFT 

Một ngôn ngữ mới hơn được tạo ra bởi Apple. Nó đang được quảng bá để thay thế Objective-C trên các nền tảng của riêng mình. Swift được thiết kế để trở thành một ngôn ngữ dễ học và dễ sử dụng hơn mà không làm mất hiệu suất của Objective-C.

println("Hello, world!")

Bạn có thể xem thêm các thông tin tuyển dụng Objective C từ các công ty HOT.

TCL 

Được sử dụng kết hợp với tiện ích mở rộng Tk, Tcl / Tk phổ biến để tạo giao diện đồ họa cho người dùng.

puts "Hello World!"

TYPESCRIPT 

Được thiết kế bởi Microsoft, nó mang một phương ngữ JavaScript bổ sung các quy tắc nghiêm ngặt để trợ giúp cho các dự án lớn trong khi vẫn tương thích với JavaScript.

console.log("Hello World!");

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

Giải quyết câu hỏi phỏng vấn Javascript của Google như thế nào

Javascript – tôi là một kỹ sư phần mềm có hơn 4 năm kinh nghiệm. Với đam mê chia sẻ kiến ​​thức của mình, nhất là trong việc chia sẻ những mẹo và thủ thuật hay nhất khi tham gia một cuộc phỏng vấn nào đó hoặc cách nâng cao khả năng code. Hôm nay tôi sẽ chia sẻ với anh em một bài toán được Google sử dụng để phỏng vấn ứng viên Javascript.

  Những thứ kỳ quặc của Javascript?

Bài toán Javascript

Viết một class, EventEmitter có ba phương thức: on, emitremoveListener.

  • on ("eventName", callbackFn) – là hàm lấy eventNamecallbackFn, sẽ lưu lại callbackFn khi event eventName được emit (phát ra).
  • emit ("eventName", data) – là hàm lấy eventName và đối tượng data, nên hàm callbackFn được liên kết với event đó và truyền cho chúng đối tượng data.
  • removeListener ("eventName", callbackFn) – là hàm lấy eventNamecallbackFn, rồi xóa callbackFn đó khỏi event.

Ví dụ:

let superbowl = new EventEmitter()

const cheer = function (eventData) {
  console.log('RAAAAAHHHH!!!! Go ' + eventData.scoringTeam)
}

const jeer = function (eventData) {
  console.log('BOOOOOO ' + eventData.scoringTeam)
}

superbowl.on('touchdown', cheer)
superbowl.on('touchdown', jeer)

superbowl.emit('touchdown', { scoringTeam: 'Patriots' }) // Both cheer and jeer should have been called with data

superbowl.removeListener('touchdown', jeer)

superbowl.emit('touchdown', { scoringTeam: 'Seahawks' }); // Only cheer should have been called

Giải pháp:

Đây là một cơ hội tuyệt vời để sử dụng các class trong ES6. Trong trường hợp bạn chưa từng sử dụng chúng trước đây, hãy xem cú pháp của chúng dưới đây. Chúng ta sẽ bắt đầu với một cấu trúc cơ bản cho class EventEmitter và khởi tạo nó bằng một đối tượng event mà chúng ta sẽ sử dụng để theo dõi các event của mình.

class EventEmitter {
  constructor () {
    this.events = {}
  }
}

On

Nào ta bắt đầu thôi. Đầu tiên là on. Đây là đoạn code của nó:

on (eventName, callbackFn) {
  if (!this.events[eventName])  {
    this.events[eventName] = []
  }
  this.events[eventName].push(callbackFn)
}

Vì đây là các hàm first class objects trong Javascript, về cơ bản chúng có thể được lưu trữ trong một biến (variable), một đối tượng (object) hoặc một mảng (array), nên chúng ta chỉ có thể đẩy hàm gọi lại (callback) đến một mảng được lưu trữ tại khóa eventName trong event object của chúng ta.

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

Emit

Bây giờ, tới lượt hàm emit.

emit (eventName, eventData) {
    if (!this.events[eventName]) return
    this.events[eventName].forEach(fn => fn(eventData))  
  }

Giải pháp này tận dụng lợi thế của cái được gọi là closure trong Javascript. Nếu bạn đang viết code bằng Javascript trong cuộc phỏng vấn của mình, việc hiểu về closure có thể rất quan trọng. Closure về cơ bản là khi một hàm có tham chiếu đến các state xung quanh hoặc lexical environment (nơi chúng ta viết code của mình đặt biến, hằng, hàm) của nó. Bạn cũng có thể coi đây là một closure cho phép bạn truy cập vào một hàm cha (outer function) từ bên trong một hàm con (inner function). Sử dụng các biến toàn cục (global variable) là một ví dụ đơn giản tuyệt vời về closure.

Ở đây, có một ví dụ tuyệt vời khác về việc sử dụng closure để theo dõi số lần hàm được gọi.

function tracker (fn) {
  let numTimesCalled = 0
  return function () {
    numTimesCalled++
    console.log('I was called', numTimesCalled)
    return fn()
  }
}

function hello () {
  console.log('hello')
}

const trackedHello = tracker(hello)

Hàm con được trả về trong tracker nằm trong biến numTimesCalled và duy trì một tham chiếu đến nó trong vòng đời của hàm trackedHello. Nhìn ngầu ha.

RemoveListener

Phương thức removeListener có lẽ là dễ nhất trong ba cái này. Đây là hướng giải quyết.

removeListener (eventName, callbackFn) {
  const idx = this.events[eventName].indexOf(callbackFn)
  if (idx === -1) return
  this.events[eventName].splice(idx, 1)
}

Vậy là chúng ta đã xong! Qua đây chúng ta có thể thấy, nếu nắm rõ được các phương thức bổ sung sẽ là cách vượt qua các cuộc phỏng vấn tốt nhất. Chúc các bạn may mắn.

Đừng bỏ lỡ các bài viết hay về Javascript nhé các lập trình viên:

TopDev via Dev.to

Tuyển dụng IT lương cao, xem ngay trên TopDev

Những điều cần biết về nghề Data Analytics và Business Analytics

Theo báo cáo Vietnam IT Nation 2020 từ TopDev, mức lương dành cho các vị trí Business Analyst, Data Analyst dao động từ 981 – 2,209 USD đang trở thành các vị trí được săn đón và đầu tư nhiều nhất hiện nay tại các doanh nghiệp số, và lĩnh vực Fintech cũng không ngoại lệ. Thậm chí, Fintech còn đòi hỏi sự chính xác, tính trực quan từ dữ liệu hơn cả những ngành nghề khác.

Với nhiệm vụ là cầu nối và “dịch thuật” giữa các đơn vị nghiệp vụ (Business) và kỹ thuật (IT) thì các vị trí như – hay – phải có những điều kiện “cần và đủ” để xây dựng chiến lược dữ liệu, từ việc phát triển data lake, data warehouse cho đến các công cụ data analytics.

Những điều cần biết về nghề Data Analytics và Business Analytics

Thế nhưng, bạn đã biết những công việc cụ thể mà một DA hay một BA làm là gì?

Hiện tại công việc chính của một DA bao gồm:

  • Làm việc với các đơn vị nghiệp vụ để xác định các bài toán/vấn đề cần được triển khai, và xác định mức độ ưu tiên của từng bài toán. Từ đó phân tích, mô tả các đặc điểm của thuộc tính, các đối tượng.
  • Visualization kết quả phân tích theo “ngôn ngữ của end users”
  • Làm cầu nối giữa đơn vị nghiệp vụ và đơn vị kĩ thuật để “translate” ngôn ngữ nghiệp vụ (business) sang ngôn ngữ kĩ thuật (IT)
  • Tìm hiểu bài toán ( Business Understanding): Phối hợp với team BA để lên các giải pháp cho bài toán
  • Tìm hiểu dữ liệu (Data Understanding): Tìm hiểu ý nghĩa các trường dữ liệu hiện có để đưa làm đầu vào của bài toán.
  • Làm sạch dữ liệu (Data Cleanning): Loại bỏ các phần tử ngoại lại, không cần thiết….
  • Tích hợp dữ liệu (Data integration) : Dữ liệu từ nhiều nguồn do đó có thể bị trùng lặp. Tìm hiểu và loại bỏ trung lặp
  • Biến đổi dữ liệu (Data Transformation): Tổng hợp và biến đổi dữ liệu để đưa ra các thuộc tính mới
  • Phân tích mô tả và trực quan hóa kết quả

Việc làm data analytics hấp dẫn cho bạn

Những điều cần biết về nghề Data Analytics và Business Analytics

Đối với BA (Business Analytics):

  • Requirement Elicitation (Khơi gợi yêu cầu)
  • Requirement and Process Analysis (Yêu cầu và phân tích quy trình)
  • Documentation of requirements (Tài liệu hóa yêu cầu)
  • As-is and To-be analysis (Phân tích hiện tại và tương tự)
  • Cost-Benefit Analysis (Phân tích lợi nhuận)
  • Requirement Verification and Validation (Xác mình và xác nhận yêu cầu)
  • Change Management (Quản lý thay đổi yêu cầu)

Tuyển business analyst lương cao không yêu cầu kinh nghiệm

Từ những dữ liệu thô, các chuyên viên phân tích dữ liệu chuyển đổi chúng trở thành những số liệu trực quan theo “ngôn ngữ của end-users”

Là một nhà phân tích nghiệp vụ chuyên nghiệp, hay một chuyên gia phân tích dữ liệu thế hệ 4.0, những hiểu biết về CNTT là kĩ năng tiên quyết giúp bạn thực hiện tốt vai trò “cầu nối” trong doanh nghiệp của mình. Bạn có sẵn sàng cùng tìm hiểu những công cụ “quyền năng” trong lĩnh vực phân tích nghiệp vụ và dữ liệu tại ngân hàng số?

Những điều cần biết về nghề Data Analytics và Business Analytics

Buổi Techtalk “ ” sẽ đưa ra những định hướng cho các bạn mong muốn phát triển sự nghiệp tại các tổ chức tài chính đang chuyển đổi số! Các chuyên gia từ sẽ hé lộ những phương pháp phân tích nâng cao, lộ trình phát triển sự nghiệp với DA & BA, đăng ký ngay để lắng nghe những topics bổ ích đến từ các chuyên gia bạn nhé https://meetup.vn/e/i8U

Các Topics dự kiến:

  • Advanced Analytics in Banking: Usecases and Technologies
  • Transforming Risk Management using Advanced Analytics

==

** Về đơn vị tổ chức:

Được thành lập từ năm 1993, Ngân hàng thương mại cổ phần Kỹ Thương Việt Nam – hiện là một trong những ngân hàng thương mại cổ phần lớn nhất và dẫn đầu xu hướng công nghệ ở tại Việt Nam. Không chỉ cung cấp các sản phẩm và dịch vụ tài chính đa dạng cho hơn sáu triệu khách hàng cá nhân và doanh nghiệp ở Việt Nam trên với mạng lưới 315 chi nhánh trên toàn quốc cũng như trên kênh ngân hàng internet và ngân hàng số, còn được biết đến là Ngân hàng rất mạnh tay đầu tư cho Công nghệ với việc chi hơn 300 triệu USD để thực hiện quá trình chuyển đổi Công nghệ của mình trong giai đoạn 2017 – 2022.

Trong những năm trở lại đây, liên tiếp giữ vững vị trí “Top 2 Ngân hàng có môi trường làm việc tốt nhất Việt Nam”, khẳng định cam kết luôn tạo điều kiện để mỗi Cán bộ nhân viên có thể “Vượt trội hơn mỗi ngày”.

==

THÔNG TIN CHUNG
⏰ Thời gian: 9:00 – 12:00 ngày 22/02/2020
Địa điểm: BKHUP – UP CoWorking Space: Tầng 3 toà nhà A1-7, 17 Tạ Quang Bửu, Hai Bà Trưng, Hà Nội.
Đăng ký vé: https://meetup.vn/e/i8U (Sự kiện không thu phí)

LIÊN HỆ:
✔ Event team: event@applancer.net | 028 6681 3236
✔ Ms. Thoa | thoa.nguyen@applancer.net | 038 5098 969

Lộ trình cho mọi lập trình viên web trong năm 2023

Bên dưới đây, bạn sẽ thấy 1 set biểu đồ chứng minh các hướng đi mà bạn có thể chọn. Và những công nghệ mà bạn sẽ muốn sử dụng để trở thành 1 front end, backend hay 1 chuyên gia devops để trở thành 1 lập trình viên Web. Mình đã làm những biểu đồ này cho 1 giáo sư cũ của mình. Người đã muốn chia sẻ cái gì đó với các sinh viên đại học của ông để cho họ viễn cảnh, ngoài ra tôi còn chia sẻ chúng ở đây để giúp đỡ cộng đồng.

Mục đích của những Roadmap này

Mục đích của những Roadmap này là để cho bạn 1 ý tưởng về cảnh quan. Và để hướng dẫn nếu bạn đang bối rối về việc phải học gì cho tiếp theo. Mình không khuyến khích bạn chọn những gì đã và đang phổ biến. Bạn nên tìm hiểu thêm về việc tại sao 1 công cụ sẽ phù hợp cho vài trường hợp hơn những cái còn lại. Và ghi nhớ rằng ‘phổ biến’ không có nghĩa là nó luôn tốt nhất cho công việc.

Ghi chú cho Những người mới bắt đầu

Những roadmap này bao gồm mọi thứ để học hỏi cho các hướng đi được ghi bên dưới. Khoan hãy bị choáng ngộp, lúc bắt đầu bạn không cần phải học hết tất cả nếu bạn chỉ mới khởi động. Chúng mình đang làm về các phiên bản người mới bắt đầu cho roadmap này và sẽ xuất bản sớm, chỉ ngay sau khi chúng mình đã xuất bản xong roadmap cho Back-end và DevOps 2022.

Nếu bạn nghĩ có thể cải tiến những điều này, hãy cứ đề xuất nhé. 

Giới thiệu 

Nhà phát triển web

Front-end Roadmap

 Nhà phát triển web

   Top 10 khóa huấn luyện kỹ sư DevOps cho dân Dev
  Cách trở thành 1 Kỹ sư Phần mềm thực tập chỉ với 4 tháng tự học

Back-end Roadmap 

Nhà phát triển web

DevOps Roadmap 

Nhà phát triển web

Nếu bạn nghĩ bất kì roadmap nào có thể phát triển. Cứ thoải mái tranh luận các vấn đề về nó. 

TopDev via GitHub và roadmap.sh

Đừng bỏ lỡ các bài viết hay về: 

  7 Hướng đi đáng giá cho mọi Lập trình viên web trong năm 2024
  25 thuật ngữ bạn nhất định phải biết khi lập trình web

Xem thêm việc làm Web Developer – lập trình viên Web hấn dẫn tại TopDev

 

Báo cáo thị trường IT 2020: Việt Nam sẽ trở thành quốc gia IT với nhiều chỉ số trong top thế giới

Trong hội thảo công nghệ toàn quốc Vietnam Web Summit 2019 gần đây, Ông Nguyễn Hữu Bình, CEO TopDev từng chia sẻ: “Hiện nay, đang có một xu hướng đầu tư mạnh mẽ về CNTT tại Việt Nam, những đối tác TopDev đã và đang làm việc là những công ty công nghệ hàng đầu đến từ Ấn Độ, Hàn Quốc, Nhật Bản, Mỹ hiện đang làm việc với chúng tôi để triển khai những dự án CNTT rất lớn, chúng tôi nhận thấy rõ được nhu cầu của họ trong việc thu hút nguồn lực trẻ tại Việt Nam. Có lẽ đây là lúc Việt Nam nên nắm bắt cơ hội để trở thành quốc gia mũi nhọn trong khu vực để đi đầu về lĩnh vực IT”

Nhiều chỉ số top thế giới nhưng vẫn còn nhiều thách thức 

Việt Nam đã tăng thêm ba bậc trên Bảng xếp hạng Chỉ số đổi mới toàn cầu 2019 (GII) để xếp thứ 42 trên tổng số 129 các nền kinh tế toàn cầu. Bảng xếp hạng mới nhất được Tổ chức Sở hữu trí tuệ thế giới (WIPO) công bố tại New Delhi, Ấn Độ vào thứ Tư. Trong 9 tháng vừa qua của năm 2019, Việt Nam đã thu hút 26,16B $ vốn FDI – theo báo cáo của US News & World về các chuyển đổi mới tại Việt Nam, đã đưa Việt Nam lên vị trí thứ 8 trong số 20 quốc gia tốt nhất để đầu tư theo báo cáo của US News & World Report. Việt Nam cũng đứng thứ 48 trong số 157 quốc gia về chỉ số vốn nhân lực (HCI), đứng thứ hai chỉ sau Singapore trong khu vực ASEAN.

Theo báo cáo tổng kết năm 2019 và định hướng năm 2020 của Bộ Thông Tin & Truyền Thông, tổng doanh thu lĩnh vực công nghiệp ICT 2019 ước đạt 112,350 tỷ USD, trong đó xuất khẩu ICT chiếm 81,5%. Cũng theo đó, Bộ TT&TT cũng công bố rằng, doanh thu công nghiệp phần mềm đạt 5 tỷ USD, tăng 500 triệu USD so với năm 2018. Tổng số tiền nộp ngân sách nhà nước từ công nghiệp ICT năm 2019 là 54.000 tỷ đồng, tăng 2000 tỷ so với năm 2018. Tuy nhiên, với ngành công nghiệp nội dung số, hiện doanh thu của nó chỉ đang chiếm một phần rất nhỏ trong doanh thu ngành CNTT (chiếm 0,76% doanh thu ngành CNTT).

Trong bài phát biểu của mình, Bộ trưởng TT&TT Nguyễn Mạnh Hùng cho biết: Năm 2020 ngành TT&TT xác định là năm chuyển đổi số quốc gia, là năm khởi động mạnh mẽ để tiến tới một Việt Nam số. Đây sẽ là một sự chuyển đổi sâu sắc và toàn diện, mà đầu tiên là sự chuyển đổi về phương thức, quy trình vận hành, về cách làm việc trong mọi lĩnh vực. Đây cũng được xem là một dấu hiệu đáng mừng, giúp Việt Nam tiến gần hơn đến việc trở thành một quốc gia IT có tầm vóc trong khu vực.

Hiện tại thị trường nhân lực tại Việt Nam rất cần các nhân lực chủ lực chất lượng cao, nhưng lượng cung luôn ít hơn cầu. Chiếc chìa khóa duy nhất để giải quyết vấn đề nan giải này chính là nằm ở đào tạo. Hiện tại, các trung tâm đào tạo tại Việt Nam vẫn chưa đáp ứng đủ nhu cầu của doanh nghiệp về nhân sự. Chỉ có 30% trong số 50,000 sinh viên CNTT đáp ứng nhu cầu của doanh nghiệp. 

Việt Nam điểm đến của những gã khổng lồ công nghệ

Theo một báo cáo mới nhất về Nền kinh tế số Đông Nam Á năm 2019, dự kiến nền kinh tế số của khu vực sẽ vượt mức 100 tỷ USD trong năm nay và sẽ sớm tăng gấp ba vào năm 2025. Đông Nam Á có khả năng trở thành một trong những thị trường phát triển nhanh nhất về thương mại điện tử nhờ dân số am hiểu công nghệ, đặc biệt là sử dụng smartphone ngày càng gia tăng. Theo khảo sát của TopDev, trong năm 2020, thị trường tại Việt Nam có sự phản hồi tốt và phát triển mạnh trong 12 lĩnh vực chính như: E-commerce, Fintech, Gọi xe/thức ăn, Edtech, Healthcare, v.v….

Báo cáo thị trường IT 2020

Trong thời gian sắp tới, Việt Nam sẽ là điểm đến của nhiều công ty tập đoàn công nghệ lớn trên thế giới. Ông Roxy Sexton – Phó chủ tịch phụ trách chuỗi cung ứng của Apple, cho biết Apple sẵn sàng gặp gỡ, tìm hiểu cơ hội hợp tác với các doanh nghiệp ICT Việt Nam có mong muốn tham gia chuỗi cung ứng của Apple. Ngoài Samsung là một trong những tập đoàn vốn nước ngoài giúp đẩy mạnh nền kinh tế của Việt Nam, sự tham gia của Apple trong thời gian tới có thể sẽ còn tiếp thêm sức mạnh cho làn sóng đầu tư nước ngoài tại Việt Nam trong năm 2020. Riêng Samsung trong năm 2020, họ cho biết sẽ đầu tư thêm 300 triệu đô tiền đầu tư vào R&D tại khu vực Hà Nội, cần thêm 4,000 nhân lực cho lĩnh vực công nghệ trong thời gian tới. 

Hindustan Computers Limited (HCL), một trong 3 công ty IT lớn nhất Ấn Độ (Top 5 công ty outsource trên thế giới) đã phát triển trung tâm của mình tại TP.HCM, cần thêm 10,000 kỹ sư trong 5 năm nữa. Công ty Axon Enterprise, một trong những công ty phát triển công nghệ cho việc hành pháp hàng đầu tại Mỹ cũng đã tập trung cơ sở phát triển công nghệ của mình tại TP.HCM Việt Nam. 

Mức lương lên đến 130 triệu nhưng chưa chắc tuyển được người, IT là một trong 4 ngành có tỷ lệ nhảy việc cao nhất

Vị trí Tech Management (nắm giữ vai trò CTO hay CIO của một công ty) có mức lương lên đến $5,700 USD (tương đương 132,291,000 đồng), và $1,329 (tương đương 30,8 triệu đồng) là mức lương trung bình doanh nghiệp sẵn sàng trả cho người có kinh nghiệm và tỉ lệ tăng lương sau 1 năm làm việc đạt 12 – 18%. Với mức lương khoảng 38,165,000 đồng/tháng, TensorFlows hiện là công nghệ được trả lương cao nhất, theo sau là Kubernetes và Go (33,577,000/ tháng với 28,270,000 đồng/tháng).

Báo cáo thị trường IT 2020

Machine Learning/ AI Engineer vẫn giữ vị trí đầu bảng trong các vị trí triển vọng nhất với mức lương khá cao, liên tiếp là 51 triệu đồng/tháng và 44 triệu đồng/tháng. Với sự khan hiếm nhân lực cũng như những yêu cầu gắt gao, mức lương của cấp quản lý trên 5 năm quản lý không thấp hơn 31 triệu đồng/tháng nhưng các nhà tuyển dụng cũng sẽ “đốt đuốc” tìm người với những yêu cầu không chỉ về lương mà còn các yêu cầu khác trong công việc để đảm bảo cân bằng cuộc sống.

 

Tìm kiếm nhân tài là một chuyện, giữ chân nhân tài là bài toán khó giải khác dành cho doanh nghiệp khi IT là 1 trong 4 ngành có tỷ lệ nghỉ việc cao nhất, với 20 tháng là thời gian trung bình cho một lập trình viên “nhảy” việc, và tỷ lệ nghỉ việc đạt mốc 24% trong năm 2020. Lý giải cho những con số này, báo cáo IT của TopDev phân tích câu trả lời không nằm ở mức lương, bởi khi được trao công việc mới, mức lương của lập trình viên chỉ tăng 15%, mà giá trị họ nhận lại nằm ở những điều kiện khác nhau, đứng đầu là nhu cầu được đào tạo bài bản (43.2%) và lộ trình phát triển sự nghiệp rõ ràng (38.4%), ….

Các vị trí tuyển nhân viên it hấp dẫn cho bạn tại đây

Đâu là giải pháp cho việc thiếu hụt nhân lực trong 5 năm vừa qua?

Theo báo cáo IT của TopDev, năm 2020 Việt Nam sẽ cần hơn 400,000 nhân lực ngành IT, và con số này sẽ tăng lên đến 500,000 vào năm 2021. Nguyên nhân dẫn đến sự thiếu hụt này nằm ở nhiều phương diện, mà chủ yếu đến từ chương trình đào tạo thiếu định hướng khi chưa đúng trọng tâm mà doanh nghiệp tìm kiếm, hay lớp sinh viên ra trường đang thiếu những kỹ năng cần thiết cùng trình độ sử dụng tiếng Anh chưa thành thạo.

Trong thời gian tới có lẽ các trung tâm cơ sở đào tạo CNTT cần chú trọng nhiều hơn về chất lượng hơn là số lượng. Hiện tại, chính phủ cũng đã có kế hoạch đầu tư thêm cho 20 trường lớp hiện đang giảng dạy CNTT tại Việt Nam. Từ đó, chính phủ sẽ cùng phối hợp với doanh nghiệp để mở ra thêm các khóa đào tạo ngắn hạn để các bạn trẻ có thể tiệm cận với những nhu cầu thực tế và bắt kịp các công nghệ mới. Thực tế cho thấy, nhiều công ty hiện nay đã có chương trình tập sự là cơ hội tốt nhất cho sinh viên rèn luyện. Việc đi làm thêm cũng giúp cho họ rất nhiều trong việc tích lũy kinh nghiệm, quy trình và các phương thức giải quyết vấn đề trong công việc tương lai. Bên cạnh đó, ngoại ngữ cũng như những kỹ năng tương tác xã hội cũng cần được chú trọng đào tạo hơn là chỉ tập trung vào kỹ năng và kiến thức. 

Mặt khác, ở thời đại tuyển dụng đa thế hệ, các doanh nghiệp cũng gặp thách thức trong việc giữ người cũng như tuyển dụng nhân sự mới, một phần cũng do văn hóa làm việc của thế hệ mới đã thay đổi. Doanh nghiệp nên chú trọng nhiều hơn về việc tạo sự cân bằng trong công việc và cuộc sống, cũng như cải thiện môi trường công ty năng động hơn, giúp các ứng viên có thể dễ dàng hòa nhập, và cùng đóng góp ý tưởng, phát triển sản phẩm của công ty. Hiện tại cũng có rất nhiều doanh nghiệp lớn đang áp dụng mô hình khởi nghiệp ngay trong chính công ty của mình nhằm giúp nhân viên có động lực cống hiến hơn trong công việc. 

Tuy nhân lực IT Việt Nam ngày càng được đánh giá cao nhờ khả năng tự học, tìm tòi và hòa nhập với doanh nghiệp nước ngoài, để mà nói công nghệ trong nước có thể sánh ngang với quốc gia trong khu vực thì chưa đủ khi bài toán nhân lực chưa được khai thác đủ tầm và lực để đảm bảo về số lượng chất lượng. Ông Nguyễn Hữu Bình, chia sẻ thêm:

“Xét cho cùng, nếu muốn vươn lên để đạt được sự tiến bộ như các quốc gia tiên tiến khác, Việt Nam cần phải bức tốc về mặt năng suất lao động, Cuộc đối đầu giữa các mô hình phát triển trên thế giới cuối cùng cũng nằm ở chỗ mô hình nào tạo ra năng suất lao động cao hơn. Đó cũng là lý do chúng ta thấy được các cường quốc hiện nay chiến đấu với nhau chính yếu không phải về thương mại, mà là về công nghệ. Vì vậy công nghệ chính là con đường giúp Việt Nam từ bỏ những lối mòn để bắt lấy con sóng khơi xa. Ước mơ Việt Nam trở thành quốc gia IT sẽ thành hiện thực vào một ngày không xa.”

DOWNLOAD