Home Blog Page 52

Shopify Developer là gì? Học gì để làm Shopify

Shopify Developer là gì? Học gì để làm Shopify

Thương mại điện tử (e-commerce) là sự mua bán sản phẩm hay dịch vụ trên các hệ thống điện tử thông qua Internet; sự phát triển rất nhanh của nó cũng giúp anh em lập trình chúng ta có thêm nhiều công việc liên quan đến xây dựng những website bán hàng online. Cùng với đó, có nhiều nền tảng có sẵn giúp chúng ta có thể nhanh chóng tạo ra website thương mại điện tử, nổi bật là Shopify. Bài viết hôm nay mình cùng các bạn tìm hiểu về công việc của một Shopify Developer là gì? và cần học những gì để đáp ứng được nhu cầu của ngành này nhé.

Shopify là gì?

Shopify là một nền tảng thương mại điện tử, nơi mà người dùng có thể tạo cửa hàng online tích hợp việc đăng dịch vụ, sản phẩm, xử lý đơn hàng, tính năng giỏ hàng, thanh toán hay liên kết mạng xã hội. 

Shopify là gì?

Shopify cung cấp nền tảng dưới dạng SaaS (Software as a Service), tức là hệ thống core và nền tảng đều được host trên hệ thống của riêng Shopify; bạn không cần phải download source code về, chỉnh sửa và deploy lên hosting riêng của mình mà hoàn toàn làm trực tiếp trên hệ thống có sẵn mà Shopify cung cấp.

Shopify ra đời từ năm 2006, theo số liệu thống kê, đến năm 2021, có đến 1.58 triệu websites chạy trên nền tảng Shoptify. Với ưu điểm về mặt thiết kế chuyên nghiệp, giao diện đẹp mắt và thân thiện với người dùng, Shopify đã thu hút được nhiều doanh nghiệp lớn nhỏ trên toàn thế giới sử dụng.

  Android Developer là gì? Tất tần tật những điều cần biết

Shopify Developer là gì?

Shopify Developer là thuật ngữ để chỉ những lập trình viên làm việc trên nền tảng Shopify, không chỉ là lập trình mà còn là những công việc hỗ trợ khách hàng khác nhằm tối ưu hóa khả năng kinh doanh thương mại điện tử trên nền tảng này.

Tương tự như các nền tảng SaaS khác, cũng có những vị trí công việc dành cho Shopify Developer như sau:

Shopify Developer là gì?

Trong đó:

  • Custom Plugins: chỉnh sửa, tạo ra các plugins tùy biến chạy trên nền Shopify để thực hiện các tác vụ nhất định. Shopify cho phép publish các plugins để các bạn bán, kinh doanh chúng. Những người dùng Shopify khác sẽ trả tiền cho bạn nếu plugins của bạn hữu ích và phù hợp cho mục đích sử dụng của họ. 
  • Theme design: tương tự như plugins, lập trình viên cũng có thể tạo ra các theme chạy trên nền tảng Shopify và kinh doanh chúng.
  • Store Development: công việc xây dựng và phát triển cửa hàng (store) trên nền tảng Shopify
  • Shop customization: tùy biến gian hàng của bạn với các theme hay plugin cần thiết

Tham khảo việc làm Shopify hấp dẫn trên TopDev

Phát triển giao diện

Phát triển giao diện

Shopify phát triển ngôn ngữ riêng dành cho việc lập trình giao diện của nó, được đặt tên là Liquid. Liquid là một mã nguồn mở dựa trên nền tảng ngôn ngữ lập trình Ruby, sử dụng sự kết hợp các tag, object và filter để tải những nội dung động. Các tag trong Liquid cũng tương tự các tag trong HTML, ngay cả cách đặt tên file HTML và CSS thì Liquid cũng chỉ thêm đuôi .liquid đằng sau và vẫn giữ nguyên định dạng file css hay js, chẳng hạn: main.css.liquid hay scripts.js.liquid.

Để lập trình giao diện với Shoptify, chúng ta cần học về Liquid; nếu đã có kiến thức về HTML, CSS hay JS thì việc này cũng không mất quá nhiều thời gian. Để tạo ra 1 giao diện Shopify mới, thông thường bạn sẽ bắt đầu bằng cách sử dụng 1 Starter Theme (một dạng code mẫu mà Shopify cung cấp dành riêng cho lập trình viên), trong đó đã bao gồm tool hỗ trợ compile code và sync (đồng bộ) với live theme 1 cách dễ dàng.

Sau khi hoàn thành một Theme của Shopify, bạn có thể publish (phát hành) nó trên Theme store của Shopify ở địa chỉ https://themes.shopify.com/ , hoặc trên các website, chợ giao diện như ThemeForest, CreativeMarket, … Lưu ý là bạn cần tuân thủ các quy định chặt chẽ của Shopify để có thể phát hành trên Theme Store bao gồm việc cung cấp cả mockup và bản mô tả các đặc tính nổi bật của giao diện.

  Unity Developer là gì? Cần học gì để trở thành Unity Developer

Phát triển ứng dụng trên nền tảng Shopify

Thực tế ở vị trí là lập trình viên Shopify (Shopify Developer) thì việc xây dựng, phát triển store trên nền tảng Shopify sẽ yêu cầu cả việc chỉnh sửa, tùy biến giao diện Shopify theme. Công việc mà 1 Shopify Developer đảm nhận bao gồm:

  • Tham gia phân tích, thiết kế website trên platform Shopify
  • Hỗ trợ kỹ thuật, cấu hình, cài đặt cho khách hàng
  • Chỉnh sửa, tùy biến giao diện website theo yêu cầu
  • Xây dựng các plugins cần thiết trên website Shopify
  • Hỗ trợ kết nối, lấy dữ liệu giữa nền tảng Shopify và các nền tảng khác

Như vậy chúng ta có thể thấy lập trình Shopify không phân chia rõ rệt Frontend hay Backend như lập trình Web thông thường; trong quá trình làm việc với nền tảng thương mại điện tử này, bạn cần biết cả về Frontend để chỉnh sửa giao diện, cũng cần biết về Backend trong việc xử lý dữ liệu hay kết nối các nền tảng khác; và cũng cần có kiến thức về hệ thống khi setup, cấu hình website. Các kỹ năng cần học để đáp ứng yêu cầu trở thành một Shopify Developer như sau:

  • Có hiểu biết về mảng thương mại điện tử (e-commerce), lĩnh vực mà chúng ta sẽ tham gia lập trình
  • Kiến thức về HTML, CSS, JS: đây là điều cơ bản mà lập trình viên làm Web đều cần nắm được
  • Kiến thức về lập trình sử dụng ngôn ngữ Liquid: ngôn ngữ sẽ được sử dụng trong lập trình Shopify
  • Có kiến thức về một hoặc một vài framework JS khác: sẽ giúp bạn tự tin khi viết các ứng dụng kết nối đến Shopify
  • Tìm hiểu về Shopify, tài liệu hỗ trợ dành cho lập trình viên được mô tả đầy đủ trong document của Shopfy, vì thế bạn cần đọc và nắm được chúng
  • Kiến thức về hệ thống: domain, hosting và cũng nên tìm hiểu về Docker Server
  • Kiến thức về xử lý dữ liệu, về SEO, …
  • Nếu muốn trở thành nhà phát hành các themes, plugins cho nền tảng Shopify thì bạn cũng cần trang bị thêm kiến thức liên quan đến các market, store phát hành như Theme store hay ThemeForest, …

Kết bài

Hiện nay các công ty làm về thương mại điện tử có nhu cầu tuyển dụng lập trình viên Shopify là rất lớn, các bạn có thể dạo qua các trang tuyển dụng để thấy được mức độ phổ biến của nó. Để trở thành Shopify Developer không quá khó với các bạn đã có kiến thức cơ bản về lập trình Web, vì vậy đây cũng là một lựa chọn tiềm năng nếu bạn muốn đi sâu vào một mảng hiểu biết nhất định, cụ thể là thương mại điện tử. Hy vọng bài viết này đã đem lại cho các bạn một chút kiến thức hữu ích về ngành nghề này. Cảm ơn các bạn đã đọc và theo dõi, hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

Xem thêm các việc làm lĩnh vực IT hấp dẫn trên TopDev

Hướng dẫn viết code PHP chuẩn – PSR tiêu chuẩn khi lập trình PHP

Hướng dẫn viết code PHP chuẩn – PSR tiêu chuẩn khi lập trình PHP

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Lý do bạn nên viết code theo tiêu chuẩn PSR:

  1. PSR là tiêu chuẩn code được áp dụng vào các dự án lớn hoặc framework PHP (Cakephp, Composer, Phalcon, Magento,…).
  2. Viết code chuẩn giúp bạn và đồng đội dễ dàng hiểu code của nhau.
  3. Thống nhất chung về cách thức viết code, tổ chức các class,…
  4. Dễ dàng đọc, hiểu, trình bày khỏi mất công bản thân “tự chế” kiểu code không giống ai.

PSR là gì?

PSR có nghĩa là PHP Standards Recommendations, nó là tiêu chuẩn được khuyến nghị áp dụng khi lập trình PHP và được các lập trình viên, tổ chức chấp nhận sử dụng.

PSR được soạn thảo, đánh giá và khuyến khích sử dụng bởi một nhóm chuyên gia PHP những người phát triển cho các Framework và hệ thống PHP phổ biến (thành viên PSR).

PSR bao gồm 7 phần (http://www.php-fig.org/psr/) từ PSR-1, PSR-2, PSR-3, PSR-4, PSR-6, PSR-7. Các tiêu chuẩn thành phần hoàn chỉnh của PSR đó gồm:

  • Basic Coding Standard: Tiêu chuẩn cơ bản khi viết code PHP
  • Coding Style Guide: Tiêu chuẩn trình bày code
  • Logger Interface: Giao diện logger
  • Autoloading Standard: Tiêu chuẩn về tự động nạp
  • Caching Interface: Giao diện về Caching
  • HTTP Message Interface: Tiêu chuẩn Giao diện thông điệp HTTP

  PHP Autoloading là gì? PSR-4 autoloading với Composer

  Code PHP chuẩn convention với PHP CodeSniffer


1. PSR-1 Basic Coding Standard (Tiêu chuẩn cơ bản khi viết code PHP)

PRS-1 là các nguyên tắc mỗi lập trình viên PHP nên theo để đảm bảo code dễ đọc, bảo trì, và dễ sử dụng lại cũng như chia sẻ cho đồng đội.

1. Nguyên tắc chung nhất khi code PHP

  • Các file code PHẢI sử dụng thẻ <?php hoặc <?
  • File code PHP sử dụng encode: UTF-8 without BOOM
  • Các Files NÊN hoặc dùng để khai báo các thành phần PHP (các lớp, hàm, hằng …) hoặc dùng với mục đích làm hiệu ứng phụ (như include, thiết lập ini cho PHP …), nhưng KHÔNG NÊN dùng cả 2 cùng lúc trong 1 file (Xem ví dụ này ở  Ví dụ 1)
  • Các Namespace và classes PHẢI theo chuẩn “autoloading” PSR: [PSR-4]
  • Tên lớp PHẢI có dạng NameClass (chữ không nameclass, Nameclass, namClass …)
  • Hằng số trong class tất cả PHẢI viết HOA và chia ra bởi dấu _ (ví dụ ahdsoft_member).
  • Tên phương thức của lớp PHẢI ở dạng camelCase (từ đầu viết thường, ví dụ: helloWorld).

Ví dụ 1)

File PHP viết không theo chuẩn, trộn lẫn lung tung hiệu ứng phụ và khai báo các đối tượng ngôn ngữ PHP.

<?php
// hiệu ứng phụ: đổi thiết lập ini
ini_set('error_reporting', E_ALL);

// hiệu ứng phụ: nạp file vào
include "file.php";

// hiệu ứng phụ: xuất dữ liệu
echo "<html>\n";

// khai báo hàm
function foo()
{
    // function body
}

Đoạn mã PHP sau đúng chuẩn, đã khai báo thì không gồm hiệu ứng phụ

<?php
// declaration
function foo()
{
    // function body
}

if (! function_exists('bar')) {
     //Khai báo hàm
    function bar()
    {
        // function body
    }
}

Xem ngay tin tuyển dụng PHP lương cao trên TopDev

2. Các Namespace và tên Class

Namespace và Lớp PHẢI theo chuẩn “autoloading” PSR: [PSR-4]

Có nghĩa là mỗi lớp được khai báo trên mỗi file PHP riêng và namespace tối thiểu có một cấp, cấp đầu là tên vendor.

Tên lớp lại PHẢI đúng dạng NameClass.

Ví dụ đúng chuẩn:

<?php
namespace Vendor\Model;

class Foo
{
}

3. Hằng, Thuộc tính và Phương thức của lớp

Hằng theo chuẩn ở trên, tất cả PHẢI viết hoa, phân cách từ bởi _

Ví dụ hằng đúng chuẩn:

<?php
namespace Vendor\Model;

class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}

2. PSR-2 Coding Style Guide (Tiêu chuẩn trình bày code)

PSR-2 sẽ tạo cho bạn thói quen viết code đúng chuẩn, dễ đọc, đẹp.

Tổng quan về trình bày code PHP

  • Code PHẢI tuân thủ PSR-1
  • Code PHẢI sử dụng 4 ký tự space để lùi khối (không dùng tab)
  • Mỗi dòng code PHẢI dưới 120 ký tự, NÊN dưới 80 ký tự.
  • PHẢI có 1 dòng trắng sau namespace, và PHẢI có một dòng trắng sau mỗi khối code.
  • Ký tự mở lớp { PHẢI ở dòng tiếp theo, và đóng lớp } PHẢI ở dòng tiếp theo của thân class.
  • Ký tự { cho hàm PHẢI ở dòng tiếp theo, và ký tự } kết thúc hàm PHẢI ở dòng tiếp theo của thân hàm.
  • Các visibility (public, private, protected)  PHẢI được khai báo cho tất cả các hàm và các thuộc tính của lớp;
  • Các từ khóa điều khiển khối(if, elseif, else) PHẢI có một khoảng trống sau chúng; hàm và lớp thì KHÔNG ĐƯỢC làm như vậy.
  • Mở khối { cho cấu trúc điều khiển PHẢI trên cùng một dòng; và đóng khối này } với ở dòng tiếp theo của thân khối.
  • Hằng số truefalsenull PHẢI viết với chữ thường.
  • Từ khóa extends và implements phải cùng dòng với class.
  • implements nhiều lớp, thì mỗi lớp trên một dòng
  • keyword var KHÔNG ĐƯỢC dùng sử dụng khai báo property.
  • Tên property KHÔNG NÊN có tiền tố _ nhằm thể hiện thuộc protect hay private.
  • Tham số cho hàm, phương thức: KHÔNG được thêm space vào trước dấu , và PHẢI có một space sau ,. Các tham số CÓ THỂ trên nhiều dòng, nếu làm như vậy thì PHẢI mỗi dòng 1 tham số.
  • abstractfinal PHẢI đứng trước visibility, còn static phải đi sau.

Ví dụ:

<?php
namespace Vendor\Package;

use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a, $b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        }
    }

    final public static function bar()
    {
        // method body
    }
}
<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

// ... additional PHP code ...
<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
    // constants, properties, methods
}

Gọi phương thức và hàm

Khi gọi một hàm hay phương thức của lớp, KHÔNG ĐƯỢC có khoảng trắng giữa phương thức, hàm và toán tử và dấu ( đồng thời không được có khoảng trắng sau (. không có khoảng trắng trước ), như phần trên không được có khoảng trắng trước , nhưng PHẢI có khoảng trắng sau ,.

<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
<?php
$foo->bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument
);

IF, ELSE, SWITCH, CASE

<?php
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
} else {
    // else body;
}
<?php
switch ($expr) {
    case 0:
        echo 'First case, with a break';
        break;
    case 1:
        echo 'Second case, which falls through';
        // no break
    case 2:
    case 3:
    case 4:
        echo 'Third case, return instead of break';
        return;
    default:
        echo 'Default case';
        break;
}

WHILE

<?php
while ($expr) {
    // structure body
}

FOR

<?php
for ($i = 0; $i < 10; $i++) {
    // for body
}
<?php
foreach ($iterable as $key => $value) {
    // foreach body
}

TRY,CATCH

<?php
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}

Trình bày Closure

<?php
$closureWithArgs = function ($arg1, $arg2) {
    // body
};

$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
    // body
};

3. PSR-3 Logger Interface (Giao diện logger)

PSR-3 Logger Interface: trình bày về các thành phần cần phải có của một Logger (ghi lại dấu vết của ứng dụng).

1. Các đặc điểm kỹ thuật

  • LoggerInterface với 8 phương thức ghi log theo chuẩn RFC 5424 thương sẽ được chia thành key log: debug, info, notice, warning, error, critical, alert, emergency.
  • Mọi method chỉ chấp nhận một string tin nhắn, hoặc object dùng method a__toString() để chuyển tất cả sang tring.
  • Message phải chứa placeholders với implementors phải replace giá trị từ array.
  • Tên placeholders phải phù hợp với key log.
  • Tên placeholders phải được phân cách bằng dấu ngoặc nhọn { và dấu ngoặc nhọn }.
  • KHÔNG được chứa bất kỳ khoảng trắng giữa các ký tự tên placeholders.
  • chỉ NÊN gồm các ký tự A-Z, a-z, 0-9, dấu gạch dưới _, và thời gian,.. Việc sử dụng các ký tự khác thì để xem trong tương lai có được áp dụng không.Implementors CÓ THỂ sử dụng giữ chỗ để thực hiện các chiến lược thoát khác nhau và dịch các bản ghi để hiển thị. Người dùng KHÔNG NÊN pre-escape giá trị giữ chỗ vì họ không thể biết trong đó bối cảnh các dữ liệu sẽ được hiển thị.

Ví dụ:

/**
   * Interpolates context values into the message placeholders.
   */
  function interpolate($message, array $context = array())
  {
      // build a replacement array with braces around the context keys
      $replace = array();
      foreach ($context as $key => $val) {
          // check that the value can be casted to string
          if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
              $replace['{' . $key . '}'] = $val;
          }
      }

      // interpolate replacement values into the message and return
      return strtr($message, $replace);
  }

  // a message with brace-delimited placeholder names
  $message = "User {username} created";

  // a context array of placeholder names => replacement values
  $context = array('username' => 'bolivar');

  // echoes "User bolivar created"
  echo interpolate($message, $context);

2. Package

Các Interface và Class được mô tả chi tiết trong gói psr/log.

3. Psr\Log\LoggerInterface

<?php

namespace Psr\Log;

/**
 * Describes a logger instance
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data, the only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interface LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function emergency($message, array $context = array());

    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function alert($message, array $context = array());

    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function critical($message, array $context = array());

    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function error($message, array $context = array());

    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function warning($message, array $context = array());

    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function notice($message, array $context = array());

    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function info($message, array $context = array());

    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function debug($message, array $context = array());

    /**
     * Logs with an arbitrary level.
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return null
     */
    public function log($level, $message, array $context = array());
} 

4. Psr\Log\LoggerAwareInterface

<?php

namespace Psr\Log;

/**
 * Describes a logger-aware instance
 */
interface LoggerAwareInterface
{
    /**
     * Sets a logger instance on the object
     *
     * @param LoggerInterface $logger
     * @return null
     */
    public function setLogger(LoggerInterface $logger);
} 

5. Psr\Log\LogLevel

<?php

namespace Psr\Log;

/**
 * Describes log levels
 */
class LogLevel
{
    const EMERGENCY = 'emergency';
    const ALERT     = 'alert';
    const CRITICAL  = 'critical';
    const ERROR     = 'error';
    const WARNING   = 'warning';
    const NOTICE    = 'notice';
    const INFO      = 'info';
    const DEBUG     = 'debug';
}

4. PSR-4 Autoloading Standard (Tiêu chuẩn về tự động nạp)

PSR-4 Autoloading Standard: trình bày về cách chỉ định ứng dụng tự động nạp (giống include, require) các file php, lớp, hàm khi nó cần dùng đến.

Các lớp có thể được load tự động khi dùng đến bằng cách sử dụng cơ chế autoload của PHP (http://php.net/autoload).

Để thống nhất và sử dụng dễ dàng, phù hợp với nhiều mã Autoload khác nên viết các lớp theo quy tắc sau:

* “lớp” ở đây ám chỉ cho:  class, interface,traits

* Tên xác định đầy đủ của một lớp có dạng:

\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
  • Tên xác định đầy đủ PHẢI có một namespace gốc (hiểu là tên vendor)
  • Tên xác định đầy đủ có thể có một hoặc nhiều namespace con.
  • Tên đầy đủ nó phải có một tên lớp kết thúc (ClassName)

* Khi một nạp một file thì nó phải tương ứng với một tên xác định đầy đủ của lớp.

  • Mỗi tên xác định đầy đủ phải tương ứng với một cấu trúc thư mục
  • Tên lớp kết thúc tương ứng với tên file:
<ClassName>.php

Khi viết các lớp, theo quy tắc đó thì dễ dàng phát triển một bộ tự động nạp. Autoloader để khởi tạo ứng dụng.

Tham khảo mẫu Autoloader tự động đăng ký các lớp tự động tải vào khi dùng đến, với điều kiện các lớp viết theo PSR-4.

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md

Các Framework PHP phổ biến hầu hết theo chuẩn PSR-4, nên chúng đều có bộ Autoloader tương tự.


5. PSR-6 Caching Interface (Giao diện về Caching)

PSR-6 Caching Interface là tiêu chuẩn cần có của một bộ ứng dụng caching (lưu tạm dữ liệu và database, đĩa, RAM …)

Tham khảo thông tin tại đây


6. PSR-7 HTTP Message Interface (Tiêu chuẩn Giao diện thông điệp HTTP)

PSR-7 HTTP Message Interface là tiêu chuẩn về giao diện (thành phần cần có) của một ứng dụng sử dụng thông điệp HTTP (HTTP Message – request và respone), nó căn cứ vào các tiêu chuẩn RFC 7230RFC 7231RFC 3986.

Thông điệp HTTP là nền tảng của ứng dụng web. Các Web Browser và các trình khách HTTP như cURL tạo ra một thông điệp HTTP (HTTP request message), rồi gửi nó đến web server, server nhận được thông điệp (có thể hiểu là yêu cầu) đó, nó sẽ gửi về một thông điệp HTTP (HTTP Response message).

Cấu tạo các HTTP MESSAGE

Các HTTP message thường thì không được nhìn thấy, không cần phải hiểu bởi người dùng, nhưng với người phát triển web thì rất nên hiểu về cấu trúc để sử dụng chúng thi hành các tác vụ theo yêu cầu.

Mọi HTTP Request Message đều có dạng:

POST /path HTTP/1.1
Host: example.com

foo=bar&baz=bat

Dòng đầu tiên yêu cầu, theo thứ tự chứa thông tin: phương thức yêu cầu (POST,GET …), đích yêu cầu (thường là URI hoặc đường dẫn trên web), và phiên bản của giao thức HTTP. Theo sau là các dòng HTTP header nếu nó, một dòng trống, cuối cùng là nội dung message.

Mọi HTTP Response Message đều có dạng:

HTTP/1.1 200 OK
Content-Type: text/plain

This is the response body

Dòng đầu là dòng trạng thái, theo thứ tự chứa phiên bản giao thức HTTP, mã trả về, và dòng mô tả mã. Tiếp theo là các dòng header nếu có, tiếp theo một dòng trống và cuối cùng là nội dung của HTTP Response Message.

Thuật ngữ gợi ý của PSR bạn lưu ý đó là: PHẢI, KHÔNG PHẢI, KHUYẾN NGHỊ … đó là các từ để căn cứ để bạn quyết định áp dụng phần nào của kỹ thuật vào ứng dụng.

Tiếp theo là các mô tả và namespace, interface class, các phương thức nên theo.

Các đặc điểm kỹ thuật về HTTP MESSAGE

1) Thông điệp (Message)

Một thông điệp HTTP có thể là yêu cầu gửi đi từ client hoặc thông điệp đáp trả từ server cho client. Như vậy cần phải có các lớp định nghĩa giao diện cho các thông điệp yêu cầu (request) Psr\Http\Message\RequestInterface và giao diện thông điệp đáp trả (response) Psr\Http\Message\ResponseInterface. Cả hai loại thông điệp này đều kế thừa từ một giao diện chung có Psr\Http\Message\MessageInterface.

Psr\Http\Message\MessageInterface CÓ THỂ được viết trực tiếp, nhưng bạn NÊN có kế từ cho Psr\Http\Message\RequestInterface và Psr\Http\Message\ResponseInterface.

2) Về các HTTP Header

Không phân biệt chữ hoa – thường

Các header được truy cập bởi tên của header đó trong bởi phương thức (withHeader) trong MessageInterface và phương thức này không phân biệt chữ hoa và chữ thường.

Ví dụ:

$message = $message->withHeader('foo', 'bar');

echo $message->getHeaderLine('foo');
// Outputs: bar

echo $message->getHeaderLine('FOO');
// Outputs: bar

$message = $message->withHeader('fOO', 'baz');
echo $message->getHeaderLine('foo');
// Outputs: baz

Bởi vì tên của header khi các server trả về có chữ hoa, chữ thường nên bạn PHẢI xử lý việc này trong hàm getHeaders().

Header nhiều giá trị

Thông lệ thì các header với nhiều giá trị vẫn được dùng, header có thể nhận được từ MessageInterface như là một mảng hoặc chuỗi. Sử dụng phương thức getHeaderLine() để nhận chuỗi có chứa giá trị phân cách bởi dấu ,. Sử dụng getHeader để nhận mảng tất cả giá trị header.

Ví dụ:

$message = $message
    ->withHeader('foo', 'bar')
    ->withAddedHeader('foo', 'baz');

$header = $message->getHeaderLine('foo');
// $header chứa: 'bar, baz'

$header = $message->getHeader('foo');
// ['bar', 'baz']

Host trong Header

Khi khởi tạo thông điệp Request PHẢI thiết lập Host header từ một URI nếu Host chưa được thiết lập. Hàm RequestInterface::withUri() làm điều này.

3) Streams – Các luồng

HTTP message chứa dòng bắt đầu, các header và body(nội dung). Phần body của thông điệp có thể rất nhở hoặc rất lớn. Nếu cố tình nhét tất cả dữ liệu vào body với kiểu chuỗi thì có vẻ dễ nhưng nhiều trường hợp ảnh hưởng nghiêm trọng đến bộ nhớ lưu giữ body.  Khi dữ liệu lớn bạn sẽ sử dụng StreamInterface để diễn tả dữ liệu được đọc/ghi của body. Nhưng trường hợp này chuỗi dữ liệu body của thông điệp được sử dụng từ php://memory hoặc php://temp. (php://memory và php://temp là luồng chuẩn PHP xem tại php://)

Các Stream có thể dùng ba phương thức: isReadable(), isWritable(), isSeekable() để kiểm tra giới hạn của Stream (đọc, ghi, tìm).

Cuối cùng StreamInterface định nghĩa phương thức __toString() để nhận hoặc chuyển dữ liệu.

4) Request Targets và URIs

Request target(mục tiêu – đích của HTTP mgs) có thể ở dạng sau:

  • origin-form, chứa đường dẫn URL
  • absolute-form, chứa scheme và người gửi authority (“[user-info@]host[:port]”)
  • authority-form, chỉ chứa authority
  • asterisk-form, kiểm tra khả năng.

URL được định nghĩa bởi UriInterface, nó cung cấp __toString() để lấy URI. Nhận request target bằng phương thức getRequestTarget().

Ví dụ:

$request = $request
    ->withMethod('OPTIONS')
    ->withRequestTarget('*')
    ->withUri(new Uri('https://example.org/'));
5) Server-side Request  – các request tại server

PHP cung cấp các biến toàn cục:

  • $_COOKIE, truy cập các cookie HTTP
  • $_GET, truy cập các tham số của chuỗi query (query trong url)
  • $_POST, truy cập các tham số urlencoded được chuyển đến bởi HTTP POST
  • $_FILES, chứa thông tin mô tả về các file được upload
  • $_SERVER, truy cập các biến môi trường CGI/SAPI, chứa nhiều thứ gồm request method, scheme, URI, header.

ServerRequestInterface mở rộng từ  RequestInterface cung cấp lớp trừu tượng bao học hết các biến toàn cục trên, nó thêm một property là “attributes” dùng truy cập các thông tin.

6 Uploaded files – các file upload

ServerRequestInterface có phương thức getUploadedFiles() để nhận một cây mô tả file upload, mà mỗi lá của cây là một UploadedFileInterface. Có các phương thưc để làm việc với file, moveTo($targetPath) , _uploaded_file()

Chuẩn giao diện thông điệp HTTP bắt đầu được cung cấp bởi hầu hết các Framework PHP phổ biến. Trong tiêu chuẩn này gợi ý xây dựng các Interface, Method, Atribute để trừu tượng hóa HTTP Message.

Gợi ý này được đóng gói và được nhiều Framework làm theo, bạn lấy Package này tại https://github.com/php-fig/http-message

Các Framework xây dựng sẵn cho bạn theo PSR-7

Symfony : http://symfony.com/blog/psr-7-support-in-symfony-is-here

Zend Framework : https://zendframework.github.io/zend-expressive/

Laravel :  https://laravel.com/docs/5.1/requests


7. Các tiêu chuẩn khác

PHPDoc Standard (PSR-5), Huggable Interface(PSR-8), Security Disclosure(PSR-9), Security Advisories(PSR-10),Container Interface(PSR-11),Extended Coding Style Guide(PSR-12),Hypermedia Links(PSR-13). Bạn có thể tham khảo tại http://www.php-fig.org/psr/

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

Ngôn ngữ lập trình bậc thấp là gì?

Ngôn ngữ lập trình bậc thấp là gì?

Bài viết được sự cho phép của BBT Tạp chí lập trình

Ngôn ngữ lập trình bậc thấp, thường được gọi là ngôn ngữ mẹ đẻ của máy tính, là một loại ngôn ngữ lập trình. Nó rất gần với việc viết các hướng dẫn máy thực tế và nó liên quan đến các thành phần và ràng buộc phần cứng của máy tính.

Nó hoạt động để kiểm soát ngữ nghĩa hoạt động của máy tính và cung cấp rất ít hoặc không cung cấp các ý tưởng lập trình trừu tượng. Trái ngược với ngôn ngữ lập trình bậc cao được sử dụng để lập trình phần mềm, code bậc thấp không thể đọc được bằng con người và nó thường khó hiểu. Hợp ngữ và ngôn ngữ máy là hai ví dụ về ngôn ngữ lập trình bậc thấp.

Ngôn ngữ lập trình bậc thấp

Mục tiêu chính của ngôn ngữ lập trình bậc thấp là sử dụng các ngôn ngữ lập trình bậc cao như PHP , C# và Swift để xây dựng các chương trình phần mềm và tập lệnh vận hành, quản lý và sửa đổi kiến ​​trúc tập lệnh và phần cứng của máy tính.

Mã nguồn có thể được tạo và chỉnh sửa bởi lập trình viên phần mềm bằng ngôn ngữ lập trình bậc cao với sự trợ giúp của trình soạn thảo văn bản cơ bản hoặc IDE lập trình. Tuy nhiên, CPU không thể nhận dạng code trực tiếp. Trước đó, code được biên dịch thành ngôn ngữ bậc thấp.

Các ngôn ngữ lập trình bậc thấp có lợi thế vì các chương trình và ứng dụng được viết bằng chúng có thể được thực thi trực tiếp trên phần cứng máy tính mà không cần thông dịch hoặc phiên dịc

Ngoài ra, các ứng dụng và chương trình này có thể chạy với dung lượng bộ nhớ rất nhỏ cũng như rất nhanh. Tuy nhiên, họ cần có kiến ​​thức sâu hơn về ngôn ngữ máy; do đó, chúng có thể khó sử dụng.

  Ngôn ngữ lập trình bậc cao - Cao thấp do đâu?

Hợp ngữ bao gồm các lệnh như ADD (thêm), SUB (trừ) và MOV (di chuyển). Các lệnh này chịu trách nhiệm thực hiện các thao tác cơ bản, chẳng hạn như thực hiện các phép tính và di chuyển các giá trị vào các thanh ghi bộ nhớ. Bằng cách sử dụng một trình dịch hợp ngữ, ngôn ngữ hợp ngữ có thể được dịch sang ngôn ngữ máy.

Mức thấp nhất của ngôn ngữ máy tính là ngôn ngữ máy hoặc mã máy, bao gồm mã nhị phân. Biên dịch mã nguồn bậc cao cho một bộ xử lý nhất định thường được sử dụng để tạo mã ngôn ngữ máy. Hầu hết các lập trình viên không bao giờ yêu cầu sửa đổi hoặc thậm chí xem mã máy. Chỉ lập trình viên xây dựng hệ điều hành và trình biên dịch phần mềm mới cần xem mã máy.

Tham khảo việc làm Back-end HOT trên TopDev

Ngôn ngữ lập trình bậc thấp

C hay C++ có phải là ngôn ngữ lập trình bậc thấp không?

Các ngôn ngữ lập trình C và C++ thuộc danh mục ngôn ngữ cấp trung. Các ngôn ngữ cấp thấp cung cấp ít hoặc không có sự trừu tượng hóa các khái niệm lập trình, trong khi các ngôn ngữ lập trình C và C++ cung cấp mức độ trừu tượng thấp nhất đối với hiệu suất và hiệu quả với số tiền ít nhất.

Những trừu tượng này như macro, hàm lambda, lớp giúp lập trình viên sử dụng chức năng phức tạp trong lập trình mà không cần viết code phức tạp hơn. Vì lý do này, ngôn ngữ C và C++ được coi là ngôn ngữ lập trình bậc thấp hơn, nơi hiệu suất tối đa là tối quan trọng. Tuy nhiên, sự trừu tượng hóa là cần thiết để giữ cho code có thể duy trì và dễ đọc.

  Học lập trình có khó không? Ngôn ngữ lập trình nào "dễ học"

Lập trình cấp thấp bằng ngôn ngữ lập trình bậc cao

Ngôn ngữ lập trình bậc thấp

Vào cuối những năm 1960, các ngôn ngữ lập trình bậc cao như ALGOL mở rộng, PL/S, BCPL, BLISS và C đã cung cấp một số quyền truy cập vào các chức năng lập trình cấp thấp. Cách tiếp cận nhúng code hợp ngữ trong ngôn ngữ bậc cao được gọi là hợp ngữ nội tuyến.

Ngoài ra, một số ngôn ngữ này chứa các chỉ thị tối ưu hóa trình biên dịch phụ thuộc vào kiến ​​trúc, cho phép trình biên dịch tùy chỉnh việc sử dụng kiến ​​trúc bộ xử lý đích.

Sự khác biệt giữa ngôn ngữ lập trình bậc cao và bậc thấp

Sự khác biệt chính giữa ngôn ngữ lập trình bậc cao và bậc thấp là code cấp cao dễ đọc, diễn giải và xây dựng hơn mã máy. Mặt khác, máy móc có thể dễ dàng giải thích ngôn ngữ bậc thấp so với con người.

C, C++, Java , Python , v.v. là những ví dụ về ngôn ngữ lập trình bậc cao. Hãy xem ngôn ngữ lập trình bậc cao và bậc thấp khác nhau như thế nào:

Ngôn ngữ lập trình bậc cao Ngôn ngữ lập trình bậc thấp
Nó là một ngôn ngữ lập trình theo nghĩa thân thiện với người dùng. Nó là một loại ngôn ngữ thân thiện với máy móc.
Những ngôn ngữ này được coi là bộ nhớ kém hiệu quả hơn. Những ngôn ngữ này được coi là bộ nhớ hiệu quả cao.
Nó là đơn giản để hiểu. Thật khó để hiểu.
Thật đơn giản để khắc phục sự cố. So sánh, nó là phức tạp để gỡ lỗi.
Thật dễ dàng để theo kịp với. So sánh, rất khó để duy trì.
Ngôn ngữ lập trình bậc cao là di động. Ngôn ngữ lập trình bậc thấp không di động được.
Nó tương thích với tất cả các hệ điều hành. Nó hoàn toàn phụ thuộc vào máy.
Để dịch, cần có trình biên dịch hoặc trình thông dịch. Để dịch, nó sẽ cần một trình biên dịch chương trình.
Nó thường được sử dụng trong lập trình. Nó không còn được sử dụng rộng rãi trong lập trình nữa.

Kết luận

Tôi hy vọng bài viết này sẽ hữu ích cho bạn. Nếu bạn có bất kỳ câu hỏi nào, tôi rất sẵn lòng trợ giúp!

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

Xem thêm:

Đừng bỏ lỡ hàng loạt IT job hot tại TopDev

Tạo Splash Screen cho Android như thế nào là “chuẩn” nhất?

Tạo Splash Screen cho Android như thế nào là

Bài viết được sự cho phép của tác giả Nhựt Danh

Các bạn thân mến, vâng bài viết này chúng ta sẽ thực hành tạo một Splash Screen cho app. Mình biết rằng rất dễ để các bạn có thể tạo ra một Splash Screen cho ứng dụng, chỉ cần lên mạng search cái là xong, không cần đến bài viết này của mình đâu. Và thực tế là mình cũng đã từng xây dựng Splash Screen cho nhiều app theo cách phổ biến trên mạng, rất nhanh chóng… cho đến khi mình đọc được một bài viết (mình có để link bài viết đó ở cuối bài hôm nay) và thử nghiệm với một số app nổi tiếng hiện nay thì thấy rằng… các Splash Screen mình đã xây dựng trước đó là chưa đúng.

Vậy tại sao Splash Screen lại nhiêu khê vậy? Đâu mới là Splash Screen đúng chuẩn Android? Và cách thức để tạo Splash Screen đó như thế nào? Thì bài viết này sẽ tập trung về các vấn đề đó. Bạn hãy cùng đọc, trao đổi và thực hành tạo một project với Splash Screen đúng chuẩn xem nó như thế nào nhé.

Splash Screen Là Gì?

Mình chắc chắn nhiều bạn đã biết Splash Screen là gì. Nhưng nếu chưa biết về nó, thì đây. Splash Screen là một màn hình đặc biệt, màn hình này được hiển thị đầu tiên nhất khi bạn mở một ứng dụng. Thông thường thì Splash Screen sẽ hiển thị logo của ứng dụng, nhiều app còn để câu slogan lên đó, có khi còn có thông tin version của ứng dụng đó nữa, vân vân… Splash Screen thường chỉ xuất hiện rất nhanh, dài lắm cũng chỉ khoảng vài giây. Mình ví dụ như khi bạn mở ứng dụng Maps lên, thì Splash Screen chính là màn hình này.

Splash Screen Google Map

Splash Screen Dùng Để Làm Gì?

Nếu bạn chỉ là một user bình thường, thì chắc chắn câu trả lời sẽ là, Splash Screen giúp app trông “ngầu” hơn, “pro” hơn, đẹp hơn.

Nhưng là một Android Developer, bạn nên biết ngoài tác dụng làm đẹp ra thì Splash Screen còn có các công dụng sau:

  • Splash Screen sẽ xuất hiện rất sớm, càng sớm càng tốt, ngay khi user khởi chạy ứng dụng. Nó sẽ giúp lấp đầy cái khoảng nháy đầu tiên, khi mà hệ thống bắt đầu đánh thức ứng dụng, và ứng dụng còn đang “trở mình” thức dậy. Khoảng nháy này xuất hiện khá nhanh, nhanh như thế nào thì còn tùy theo độ “nặng” của ứng dụng và cấu hình của phần cứng. Nhưng việc có khoảng nháy rất nhỏ này cũng đủ khiến các ứng dụng bị giảm điểm trong mắt một số user.
  • Cũng nhờ vào công dụng của Splash Screen trên đây, nên các app thường tận dụng trong lúc Splash Screen hiện lên sẽ tranh thủ làm vài thao tác ở background, như download các thông tin cần thiết từ server, đọc một đoạn văn bản dài,… để khi mà Splash Screen kết thúc và nhường màn hình cho các giao diện khác, thì mọi thứ đã sẵn sàng để người dùng tương tác. Chính vì vậy bạn có thể thấy một số app hiển thị Splash Screen hơi bị lâu là vậy.

  Tổng Hợp Các Tip Khi Sử Dụng Android Studio

  10 xu hướng ứng dụng di động dự đoán sẽ thống trị năm 2024

Splash Screen Theo Kiểu Thông Thường

Như mình đã nói ở trên, có vô vàn tài liệu trên mạng nói về việc xây dựng một Splash Screen cho Android app. Và các cách phổ biến nhất là gì?

  • Bạn sẽ tạo một Activity, và dĩ nhiên xây dựng giao diện cho Activity này. Có nghĩa là bạn xem Splash Screen cũng là một Activity bình thường vậy.
  • Bạn chỉ định Activity Splash Screen này là launcher Activity, tức là nó sẽ được khởi chạy đầu tiên khi app được kích hoạt.
  • Sau khi hiển thị giao diện của nó rồi, bạn cho Activity Splash Screen này ngủ trong khoảng 3 giây, hoặc cho làm vài tác vụ background nào đó như mình nói ở trên.
  • Hết 3 giây hay xong các tác vụ background, Activity Splash Screen kết thúc và nhường màn hình lại cho các Activity khác bên trong app.

Mình gọi đây là Splash Screen kiểu thông thường, vì mình cũng đã từng xây dựng nhiều Splash Screen như vậy, rồi đồng nghiệp của mình cũng xây dựng như vậy, và những app mà mình đã đọc qua source code cũng làm như vậy, ngay cả bạn thử chạy một số app khác trong máy của bạn thì nhiều app cũng làm như vậy (làm sao biết được? Chỉ cần đọc hết bài viết hôm nay bạn sẽ biết cách phân biệt các cách xây dựng Splash Screen của các app, mình hứa đấy).

Tham khảo việc làm Android Developer Hồ Chí Minh tại TopDev

Đọc đến đây ắt hẳn bạn sẽ nghĩ rằng, nếu nhiều app dùng đến, thì nó là đúng đắn, tại sao nói là sai, là không đúng chuẩn? Thứ nhất, bạn nên biết không phải cái gì đi theo số đông cũng đúng đắn. Thứ hai, mình không nói là Splash Screen theo cách thông thường này sai, nó chỉ là chưa hợp lý mà thôi, vì sao vậy, bạn xem.

– Điều kiện tiên quyết đầu tiên của Splash Screen là nó phải được hiện lên rất nhanh ngay khi app được kích hoạt, nhanh đến nỗi user không nhận ra có khoảng nháy ở thời điểm đó. Tuy nhiên, cách xây dựng Splash Screen thông thường thực ra cũng chỉ là tạo một Activity bình thường với layout do bạn xây dựng, Activity này cũng nằm cùng cấp với các Activity khác, cũng được khởi tạo chung khi mà ứng dụng đang “thức dậy”. Chính vì vậy mà sẽ luôn luôn có khoảng nháy khi bạn xây dựng Splash Screen kiểu thông thường này, không cách nào lấp đầy UI cho khoảng nháy đó.
– Thêm nữa bạn hãy quên đi Splash Screen và xem lại định nghĩa mới của Google về Launch Screen, chúng ta sẽ tập trung vào nó.

Đâu Là Một Splash Screen Đúng Chuẩn?

Không cần bàn cãi nhiều, một Splash Screen chuẩn là một Splash Screen phải được hiển thị cực kỳ nhanh, mượt mà, và dĩ nhiên phải đẹp nữa.

Đầu tiên mình mời bạn “ngắm” một Splash Screen “chính chủ” của Google, đó là Splash Screen của app Youtube.

youtube_splashcreen

Bạn có thể thấy icon Youtube dùng làm Splash Screen xuất hiện rất nhanh ngay khi nhấn. Mặt khác nó còn có hiệu ứng bung ra theo chuẩn Material Design nữa. Splash Screen bình thường của bạn có làm được không?

Mình cho bạn xem một app nữa, không phải “chính chủ” Google nhưng cũng áp dụng khá tốt triết lý Launch Screen của Google, đó là app Uber.

uber_splashscreen

Đến lúc này chắc chắn bạn đã biết tại sao mình viết bài hôm nay rồi đúng không nào, vậy hãy bắt tay vào xây dựng một Splash Screen đúng chuẩn ngay thôi.

Xây Dựng Splash Screen Đúng Chuẩn

Tạo Mới Project

Đầu tiên nếu chưa mở Android Studio thì bạn hãy mở lên nhé. Sau khi đã mở Android Studio xong, nếu bạn đang ở màn hình Welcome (hình bên trái ở dưới), thì hãy chọn Start a new Android Studio project. Còn nếu bạn đang ở màn hình chính của Android Studio (hình bên phải ở dưới), hãy nhấn vào menu File > New > New Project….

Android Studio project

Các bước tạo một project chắc bạn cũng biết rồi, hoặc bạn có thể xem Android Bài 3 để hiểu rõ hơn. Tuy nhiên có một lưu ý, để bắt đầu xây dựng project nhanh nhất có thể thì bạn nên chọn Empty Activity khi đến bước Add an Activity to Mobile như hình sau.

Android Studio project

Tạo Giao Diện Cho Splash Screen

Nên nhớ là với việc tạo một Splash Screen theo cách này, chúng ta hoàn toàn không dùng đến layout như với các cách xây dựng Activity khác, nhằm tăng tốc thời gian hiển thị. Vì vậy mà để tạo giao diện cho nó, mình sẽ tạo một XML ở drawable, mình sẽ tạo ra một Splash Screen có background màu xám, và hiển thị launcher icon ở giữa màn hình.

Trước hết mình sẽ định nghĩa một màu xám cho background ở file res/values/colors.xml, màu xám mà mình dùng là màu có mã Hexa là #D8D8D8, như hình dưới.

Tạo Giao Diện Cho Splash Screen

Và bây giờ mới là bước quan trọng nhất của giao diện Splash Screen. Để tạo mới một XML cho drawable, bạn hãy nhấn chuột phải vào thư mục res/drawable/ và chọn New > Drawable resource file như hình sau.

Tạo Giao Diện Cho Splash Screen

Với dialog xuất hiện tiếp theo, bạn sẽ đặt tên bất kỳ cho file XML ở mục File name, mình đặt tên cho nó là là bg_splashscreen. Nên nhớ là file resource thì không đặt tên có chữ in hoa hay khoảng trắng nhé bạn, bạn có thể tham khảo thêm bài viết về resource ở đây. Quay lại với dialog, ở mục Root element bạn gõ layer-list, nhưng bạn yên tâm, chỉ cần gõ vài từ thôi hệ thống sẽ gợi ý đầy đủ text cho bạn, bạn chỉ việc nhấn phím mũi tên và chọn đúng từ được gợi ý. Thao tác ở bước này giúp tạo một resource XML với thẻ gốc là thẻ layer-list, chi tiết về cách sử dụng resource XML bạn có thể theo dõi thêm ở các bài học Android theo chương trình của mình.

Tạo Giao Diện Cho Splash Screen

Giờ đây với file bg_splashscreen.xml vừa tạo, bạn hãy thêm nội dung cho nó như sau.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@color/gray"/>

    <item
        android:drawable="@mipmap/ic_launcher"
        android:gravity="center">
    </item>

</layer-list>

Như mình có trình bày, việc tạo ra resource này sẽ mang đến một “giao diện” XML với màu nền là xám, và một icon launcher hiển thị ở giữa. Bạn có thể dùng một ảnh hiển thị cho toàn màn hình, giúp bạn thiết kế background cho Splash Screen đẹp đẽ hơn.

Tạo Theme Cho Splash Screen

Dĩ nhiên là bởi vì chúng ta không dùng cách thức tạo một layout thông thường cho Splash Screen, thì chúng ta phải sử dụng một cách khác, đó là dùng đến Theme.

Nếu bạn muốn biết rõ hơn khái niệm và cách sử dụng Theme thì bạn có thể xem thêm ở bài này.

Như vậy là với yêu cầu là tạo ra một Theme cho Splash Screen, chúng ta chỉnh sửa file res/values/styles.xml như sau.

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="SplashscreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/bg_splashscreen</item>
    </style>

</resources>

Với chỉnh sửa trên thì mình tạo ra một Theme có tên là SplashscreenTheme, Theme này kế thừa từ một Theme gốc không có Action Bar, dĩ nhiên rồi vì Splash Screen sẽ cần tối đa không gian màn hình, và bởi cũng chỉ thoáng hiển thị thôi nên không cần các UI râu ria, như Action Bar chẳng hạn. Sau đó với thuộc tính android:windowBackground mình chỉ định đến file XML vừa tạo ra ở trên, giúp cho Theme này có thể dùng file XML đó để làm background cho nó.

Tạo SplashScreen Activity

Chúng ta vừa tạo giao diện và Theme cho Splash Screen rồi, tất nhiên là phải cần một Activity để dùng đến Theme đó chứ, và bước này chúng ta tạo ra một Activity mới đó.

Ở package bạn cần tạo Activity, trong ví dụ này mình chọn package đang chứa MainActivity.java, từ package đó bạn click chuột phải vào và chọn New > Activity > Empty Activity (hình dưới). Điều này giúp bạn tạo ra một Activity rỗng, tha hồ mà thêm vào các dòng code của riêng bạn mà không ngại có quá nhiều code mặc định trong đó.

Tạo Giao Diện Cho Splash Screen

Với dialog tiếp theo xuất hiện, bạn gõ tên Activity cần tạo vào ô Activity Name, mình gõ là SplashScreenActivity. À ngoài ra mình còn bỏ check Generate Layout File để mà nó đừng tự tạo ra file layout, như mình đã nói trên đây. Và mình cũng check vào Launcher Activity để khai báo nó là Activity launcher ở file Manifest. (Nếu bạn không check và bỏ check phức tạp ở bước này cũng không sao, chỉ cần bạn đặt tên cho Activity là được, sau đó bạn sửa code Java và sửa Manifest cho giống với các bước sau nữa là được)

Tạo Giao Diện Cho Splash Screen

Sau khi nhấn Finish thì bạn sẽ thấy source code của Activity vừa tạo hiện ra. Activity này sẽ không có hàm setContentView() là bởi bạn đã bỏ check Generate Layout File ở bước trên. Nhưng nếu bạn vẫn thấy hàm setContentView() ở file SplashScreenActivity.java này thì có thể xóa nó đi nhé.

Vậy chúng ta set giao diện cho Activity này như thế nào? Chúng ta sẽ dùng đến Theme vừa được tạo ra ở bước trên kia thay cho content layour. Mà để sử dụng Theme thì bạn nên khai báo ở Manifest ở bước sau. Bước này bạn chỉ cần chuyển đến MainActivity.java, tức là thoát khỏi Splash Screen sau khi nó được hiện ra, code như sau.

public class SplashScreenActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

Gắn Theme Cho SplashScreen Activity

Bước này bạn hãy mở file AndroidManifest.xml lên, nếu có nhiều hơn một Activity được định nghĩa là launcher thì bạn bỏ đi nhé, chỉ có SplashScreenActivity mới được là launcher thôi.

screen-shot-2017-02-20-at-11-36-48

Sau đó bạn nhớ định nghĩa Theme cho SplashScreenActivity là SplashscreenTheme nữa nhé. Tóm lại file AndroidManifest.xml sẽ trông như sau.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yellowcode.splashscreendemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity" />

        <activity android:name=".SplashScreenActivity"
            android:theme="@style/SplashscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

Thực Thi Ứng Dụng

Đến đây thì bạn có thể run ứng dụng lên xem thành quả được rồi. Kết quả Splash Screen sẽ xuất hiện ra rất nhanh như sau.

myapp_splashscreen

Download Source Code Mẫu

Bạn có thể download source code mẫu của bài này ở đây.

Còn đây là link gốc mà mình đã tham khảo.

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

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Một số Patterns hay sử dụng trong React

Một số Patterns hay sử dụng trong React

Trong lập trình chúng ta thường sẽ gặp phải một số vấn đề chung lặp đi lặp lại trong các dự án khác nhau và sẽ có những kỹ thuật (lời giải) tương tự nhau để giải quyết bài toán đó. Khái niệm pattern chỉ những “mẫu” lời giải đó, nó thường được tổng hợp và khuyên dùng trong lập trình để xử lý và tránh các lỗi có thể gặp phải. Với React, chúng ta có một vài pattern được khuyên sử dụng và bài viết hôm nay chúng ta cùng tìm hiểu về chúng cùng các ví dụ cụ thể nhé.

Higher-Order Function/Component

Higher-Order functions là một hàm nhận một hàm khác dưới dạng đối số hoặc trả về một hàm dưới dạng đầu ra. Chúng ta có ví dụ dưới đây:

function greaterThan(n) {
  return (m) => m > n;
}

const greaterThan10 = greaterThan(10);

console.log(greaterThan10(11));
// true

Ở ví dụ trên, hàm greaterThan trả về 1 function so sánh giá trị truyền vào với đối số xác định trước, cụ thể với hàm greaterThan10 thì đối số là 10. Từ đó chúng ta có thể tạo ra các function khác nhau bằng cách call function greaterThan và đối số truyền vào. Đấy chính là lợi ích của higher-order function.

  Hệ thống 23 mẫu Design Patterns

  Bridge Pattern trong Java – Code ví dụ Composite Pattern

Từ khái niệm trên, trong React chúng ta cũng có khái niệm Higher-Order component (HOC), đó là 1 component mà:

  • Nhận đầu vào 1 component và trả về 1 component mới
  • Biến đổi 1 component thành 1 component khác

 Chúng ta có ví dụ dưới đây:

const withColor = Element => props => <Element {...props} color="red" />

const Button = () => {
  return <button>My Button</button>
}

const ColoredButton = withColor(Button)

Ở đây chúng ta sử dụng HOC withColor để tạo ra component ColoredButton từ component Button với mục đích là set mặc định giá trị màu đỏ cho button đó. 

Thực tế có rất nhiều thư viện sử dụng kỹ thuật này trong React, điển hình như Redux. Để có thể tạo ra những state dùng chung(store) và các action tác động lên toàn bộ component thì Redux tạo ra Provider để bọc toàn bộ các components trong ứng dụng, và đấy cũng chính là 1 HOC.

Tham khảo việc làm React mới nhất trên TopDev

State Hoisting

Bạn nào làm React chắc cũng đều nắm được về stateless và statefull component, hiểu đơn giản thì stateless sẽ không giữ biến state nào cả. Trong 1 project, việc tạo ra các stateless component được khuyến khích vì lúc đó bạn có thể yên tâm tái sử dụng hay xóa chúng đi mà không lo việc ảnh hưởng đến logic của toàn hệ thống. Chúng ta cùng xem xét bài toán dưới đây: 

<div>
  <CarHeader />
  <CarList />
</div>;

const CarHeader = () => {
  const [cars, setCars] = useState([]);

  useEffect(() => {
    const cars = getData(); //this fuctional function calls an API
    setCars(cars);
  }, []);

  return <div> No of Cars: {cars.length}</div>;
};

const CarList = () => {
  const [cars, setCars] = useState([]);

  useEffect(() => {
    const cars = getData(); //this fuctional function calls an API
    setCars(cars);
  }, []);

  return (
    <>
      {cars.map((car) => (
        <div>Car:{car.name}</div>
      ))}
    </>
  );
};

2 components CarHeader và CarList đều sử dụng cùng dữ liệu là danh sách car lấy từ API trả về, cách tốt hơn ở đây là sẽ khai báo state cars ở trong component cha, loại bỏ biến state trong 2 component con để biến chúng thành các stateless component.

useEffect(() => {
  const cars = getData(); //this fuctional function calls an API
  setCars(cars);
}, []);

return (
  <div>
    <CarHeader cars />
    <CarList cars />
  </div>
);

Kỹ thuật này gọi là state hoisting, ngoài việc tạo ra các staless component con, thì lúc này dữ liệu cũng được lấy từ 1 nguồn duy nhất (single source of truth) giúp các component đồng bộ với nhau, việc debug ứng dụng cũng trở nên dễ dàng hơn.

Ngoài việc đẩy data ra component cha để xử lý, thì chúng ta cũng sử dụng kỹ thuật này vơi các events trong các phần tử con có tương tác với người dùng, ví dụ như các thẻ Input.

const Name = ({ onChange }) => (
  <input onChange={(e) => onChange(e.target.value)} />
);

const NameContainer = () => {
  const [name, setName] = useState("");

  return (
    <>
      <div>Your name: ${name}</div>
      <Name onChange={(newName) => setName(newName)} />
    </>
  );
};

Trong ví dụ trên, thẻ input tạo ra trong component Name và chúng ta muốn lấy được dữ liệu ra trong component cha của nó, không tác động thêm state vào Name, cách giải quyết là đẩy event onChange ra ngoài để component cha (NameContainer) sử dụng, vẫn đảm bảo được tính “stateless” của Name.

Proxy Component

Proxy pattern là 1 thiết kế mẫu giúp bạn kiểm soát truy cập đến đối tượng ban đầu, giúp bạn hạn chế việc sai sót trong quá trình tái sử dụng component ban đầu cũng như tạo ra 1 component mới.

Ví dụ chúng ta có 1 component button được sử dụng trong App như sau:

<button type="button">
</button>

// button type
// 1. button
// 2. reset
// 3. submit

Nếu trong App của chúng ta sử dụng thẻ button này trực tiếp thì sẽ luôn phải khai báo type cho nó, bài toán đặt ra là nếu chúng ta không cho phép sử dụng type=submit trong ứng dụng của mình thì sẽ thế nào? Cách giải quyết là tạo ra 1 component mới với thuộc tính type=button để đảm bảo mỗi button được tạo ra luôn có chung thuộc tính type. Kỹ thuật này gọi là Proxy, nó giúp chúng ta đảm bảo tính nhất quán trong thuộc tính (attribute) của component, đồng thời hạn chế việc truy cập đến các thuộc tính khác trong component gốc.

const Button = (props) => {
  return <button type="button" {...props}></button>;
};

return (
  <>
    <Button />
    <Button className="CTA">Send Money</Button>
  </>
);

Chúng ta cũng có thể sử dụng kỹ thuật này cho các thuộc tính của style để tạo ra các Style component. 

import classnames from "classnames";

const PrimaryBtn = (props) => <Btn {...props} primary />;

const Btn = ({ className, primary, ...props }) => (
  <button
    type="button"
    className={classnames("btn", primary && "btn-primary", className)}
    {...props}
  />
);

<button type="button" className="btn btn-primary"></button>;

3 cách khai báo code trên sẽ cùng cho ra 1 kết quả giống nhau, trong trường hợp này PrimaryBtn component được sử dụng như 1 Proxy cho component button với cách khai báo gọn và thống nhất hơn.

Kết bài

Trên đây là 3 patterns sử dụng trong lập trình React mà bạn sẽ thường xuyên gặp và áp dụng. Áp dụng đúng và hợp lý các patterns sẽ giúp code của bạn clear và tránh các lỗi có thể xảy ra; nó cũng sẽ giúp bạn nâng cao kỹ năng lập trình của mình. Hy vọng bài viết hữu ích dành cho bạn, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Anh Khoa

Xem thêm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Nhập/Xuất Trên Console

Nhập/Xuất Trên Console

Bài viết được sự cho phép của tác giả Nhựt Danh

Bài viết hôm nay sẽ hướng dẫn bạn sử dụng một “công cụ” để các bạn tiến hành nhập/xuất thông qua Console. Công cụ này giúp cho các bạn sau khi nhập dữ liệu vào từ bàn phím, nó sẽ lấy dữ liệu được nhập này rồi sau đó chuyển vào chương trình của bạn, để chương trình xử lý, rồi xuất ra kết quả thông qua màn hình Console.

Sau bài học hôm nay thì các bạn có thể test thoải mái các dòng code, để hỗ trợ tốt vào quá trình học Java của bạn. Nhưng trước hết, chúng ta hãy cùng tìm hiểu sâu hơn về khái niệm nãy nhờ được nhắc đi nhắc lại này.

Khái Niệm Console

Đầu tiên bạn có thể hiểu Console chúng như là một bảng điều khiển chuyên dụng. Như các Game Console chính là các thiết bị chuyên cho việc điều khiển game. Hay các trang web quản lý như quản lý nhân viên cũng có thể coi là các Console chuyên dụng cho việc quản lý.

Trong ngôn ngữ lập trình, Console được biết đến như là một cách điều khiển ứng dụng đơn thuần nhất thông qua các dòng text (dòng lệnh), nó được phân biệt với điều khiển bằng UI.

Và Console trong chương trình học của chúng ta là hình minh họa dưới đây, ở các bài làm quen sơ sơ trước, khi bạn thực thi chương trình thì cũng đã biết tới cửa sổ Console này rồi đúng không nào.

Màn hình Console trong InteliJMàn hình Console trong InteliJ

Nhập Trên Consolse

Chúng ta đang nói đến các cách thức để bạn nhập dữ liệu từ Console. Để bắt đầu, bạn hãy mở InteliJ lên. Bạn hãy mở lại project HelloWord mà chúng ta đã tạo ra từ bài hôm trước.

Đầu tiên mình muốn bạn thử khai báo một đối tượng Scanner như code bên dưới. Bạn code đi rồi mình sẽ nói rõ hơn lý do tại sao phải code như vậy ở bên dưới dòng code này.

Scanner scanner = new Scanner(System.in);

Các khái niệm lớp (class) hay đối tượng gì gì đó thì bạn sẽ được làm quen sau này, nó thuộc về kiến thức OOP như mình có nói đến ở đầu bài học. Nhưng bạn có thể hiểu trước là đối tượng cũng giống như biến vậy, bạn có thể khai báo nó với cái tên tùy ý (theo quy tắc đặt tên của biến). Như ở trên chúng ta khai báo một đối tượng của Scanner mang tên là scanner. Chỉ khác biến ở chỗ là đối tượng của lớp phải được khởi tạo bằng từ khóa new như trên. Khi đó tổng thể code của bạn như sau.

public class MyFirstClass {

    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
 }

}

  Console Javascript quá kinh khủng

  Cài Đặt Các Công Cụ Phát Triển Cho Java

Lan Man Về Cách Thức Bạn Code

Mục này cho phép mình nói lan man về kinh nghiệm code một tí xíu. Đó là nhiều bạn sau khi gõ xong dòng code trên đây, có thể sẽ có báo lỗi từ InteliJ như hình sau.

Khi bạn code có thể gặp tình huống báo lỗi như nàyKhi bạn code có thể gặp tình huống báo lỗi như này

Sở dĩ có báo lỗi là vì hệ thống đang không biết lớp Scanner là gì :)). Đó là bởi vì trước đây bạn chỉ sử dụng các biến nguyên thủy, hoặc các lớp nằm trong package java.lang. Với việc sử dụng này thì chúng ta không cần phải quan tâm, sẽ chẳng có lỗi nào như bạn đã từng thực hành với các bài học trước. Chà vậy chúng ta cần quan tâm gì? Thực ra trong Java, mỗi khi bạn code, bạn phải chỉ định nguồn gốc của các lớp bạn sẽ dùng, thông qua từ khóa import. Các dòng import được khai báo ở đầu mỗi file. Mỗi dòng import như vậy bao gồm từ khóa import, theo sau nó là package có chứa lớp cần dùng (bạn có thể xem thêm kiến thức về package ở đây).

Theo đó, ở ví dụ trên chúng ta cần đến lớp Scanner. Thì chúng ta cần import đúng package mà hệ thống muốn.

Để import đúng package có lớp Scanner cần dùng trên đây thực ra là một điều cực kỳ dễ dàng, có nhiều cách để thực hiện điều này, bạn hãy chọn một trong những cách sau.

Tham khảo việc làm Java hấp dẫn cho Fresher

Sử Dụng Gợi Ý Hoàn Thành Code Từ IDE

Có thể nói đây là cách thức dễ nhất để InteliJ tự động hoàn thành việc import một package cho bạn.

Việc của bạn là hãy gõ vài từ vào IDE, bạn sẽ thấy các gợi ý hoàn thành dòng code như hình bên dưới. Bạn hãy nhấn Enter nếu gợi ý đầu tiên bạn thấy là đúng, hoặc bạn có thể đưa vệt sáng đến dòng gợi ý nào khác rồi nhấn Enter. Ngoài việc kết quả dòng code được tự động hoàn thành thì hệ thống cũng import sẵn package java.util.Scanner cho bạn mà bạn không cần phải nhớ chúng là ai và từ đâu đến đúng không nào.

InteliJ tự gợi ý hoàn thành dòng code, và nếu bạn chấp nhận, nó cũng tự import package cho bạnInteliJ tự gợi ý hoàn thành dòng code, và nếu bạn chấp nhận, nó cũng tự import package cho bạn

Bạn thử gõ hết câu lệnh trên với việc chọn những gợi ý ở các thành phần tiếp theo (scannernewScannerSystem) xem sao nhé. Kết quả sẽ không còn lỗi nữa.

Kêu IDE Import Giúp

Có đôi khi IDE không đưa ra bất kì gợi ý nào để hoàn thành dòng code như trên kia. Khi này bạn hãy cứ gõ hết tất cả dòng code cần thiết của bạn, đừng lo lắng nếu có báo lỗi. Sau khi gõ xong hết, thì bạn cứ để ý trên editor của IDE, chắc chắn sẽ xuất hiện các hướng dẫn tận tình giúp chúng ta sửa lỗi.

Như trường hợp dưới đây, sau khi gõ xong, bạn sẽ thấy các nơi báo đỏ, khi đưa con trỏ chuột vào những nơi bị tô đỏ đó, nếu là lỗi thiếu import, bạn sẽ nhìn thấy một popup hiện ra như thế này, chỉ cần nhấn chọn vào chữ Import Class là xong.

Sử dụng gợi ý import từ InteliJSử dụng gợi ý import từ InteliJ

Import Thủ Công

Tất nhiên cách này dành cho bạn nào biết chính xác lớp này nằm trong package nào rồi nên bạn có thể gõ import một cách thủ công.


Lan man hơi dài rồi, quay trở lại với việc bạn vừa khai báo đối tượng của lớp Scanner trên kia. Dòng tiếp theo bạn chỉ cần gọi

scanner.nextXxx();

 thì khi bạn chạy chương trình, khi hệ thống thực thi đến dòng này, nó sẽ dừng lại chờ, và lúc đó Console sẽ xuất hiện con nháy chờ người dùng nhập vào một giá trị có kiểu dữ liệu là Xxx rồi mới tiến hành gán giá trị này vào biến tương ứng và thực hiện tiếp các câu lệnh bên dưới.

Bạn hãy thử vài ví dụ sau cho từng

scanner.nextXxx();

 cụ thể nhé.

Ví Dụ Nhập Dữ Liệu Kiểu Chuỗi

Với ví dụ này bạn thử cho người dùng nhập vào tên từ Console rồi in ra dòng xin chào ngay trên Console luôn như sau.

Để đợi người dùng nhập vào tên bạn gõ dòng sau vào sau khi khai báo scanner.

String name = scanner.nextLine();

Khi đó tên người dùng nhập vào từ Console sẽ được gán vào biến kiểu String (đây là kiểu chuỗi mà bạn sẽ được làm quen sau) có tên là name. Nhưng để dễ dàng hơn cho người dùng, chúng ta nên có các dòng System.out để in ra chỉ dẫn cho người dùng trước dòng đợi nhập tên. Code tổng thể của chúng ta như sau.

import java.util.Scanner;;

public class MyFirstClass {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Please enter your name here: ");
        String name = scanner.nextLine();
        System.out.println("Hello! " + name);
    }

}

Khi này nếu bạn chạy chương trình, chỉ có dòng text “Please enter your name here: “ xuất hiện, đừng tắt cửa sổ Console nhé, hãy tiếp tục nhập vào một text, sau khi Enter bạn sẽ nhận được một text nữa in ra với nội dung “Hello!” và text bạn vừa nhập, text in ra đó chính là nội dung biến name được scanner lấy dữ liệu từ Console rồi gán vào đấy.

Kết quả thực thi chương trình khi nhập vào một StringKết quả thực thi chương trình khi nhập vào một String

Ví Dụ Nhập Dữ Liệu Kiểu int

Tương tự nếu ví dụ này hỏi người dùng nhập tuổi, bạn cũng nên có câu in ra gợi ý, dòng scanner.nextInt(), và dòng in ra kết quả sau đó. Code tổng thể như sau.

Scanner scanner = new Scanner(System.in);
System.out.println("How old are you? ");
int age = scanner.nextInt();
System.out.println("Your age is: " + age);

Ví Dụ Nhập Dữ Liệu Kiểu Float

Scanner hỗ trợ nhập cho hầu như tất cả các kiểu dữ liệu nguyên thủy (trừ kiểu char, vì thực ra kiểu char cũng có thể lấy ra từ việc nhập một String với một ký tự, bạn hãy xem phần bình luận bên dưới để biết cách nhập vào kiểu char nếu có nhu cầu nhé). Ví dụ sau nhập vào kiểu float và bạn hoàn toàn có thể áp dụng cho các kiểu dữ liệu nguyên thủy được hỗ trợ còn lại.

Scanner scanner = new Scanner(System.in);
System.out.println("How about your salary? ");
float salary = scanner.nextFloat();
System.out.println("Your salary is: " + salary);

Xuất Trên Console

Chắc bạn cũng biết, để xuất dữ liệu ra Console thì cứ gọi

System.out.println();

 thôi chứ gì. Dễ quá, các bài trước và bài hôm nay bạn đã làm quen rồi. Nhưng kiến thức về xuất dữ liệu ra Console còn vài thứ vui vẻ nữa, mời các bạn cùng xem tiếp.

Xuất Mặc Định

Mình dùng từ xuất mặc định là bởi vì chúng ta không can thiệp gì đến cách mà Console hiển thị một nội dung cả. Đó chính xác là cách gọi

System.out.println();

 như chúng ta đã làm quen. Mình thêm một vài lưu ý sau thôi.

  • Bạn có thể dùng câu lệnh print() thay vì println(). Nếu như với println() thì các bạn đã biết nó giúp xuất dữ liệu ra rồi kèm theo xuống hàng sau khi xuất. Thì print() chỉ xuất dữ liệu thôi và không xuống hàng. Bạn có thể thử áp dụng print() cho các thông báo chỉ dẫn như “Please enter your name here: “ trên kia để xem sự khác biệt nhé.
  • Nếu bạn muốn hiển thị các ký tự đặc biệt sau: dấu nháy đơn (‘), dấu nháy kép (“), và dấu gạch chéo (\). Thì bạn cứ kèm theo một gạch chéo (\) nữa ở trước các ký tự này. Chẳng hạn bạn muốn hiển thị dòng Thư mục chứa file “ấy” là C:\Location\Ay, thì bạn gõ lệnh xất như sau System.out.print(“Thư mục chứa file \”ấy\” là C:\\Location\\Ay”);.
  • Ngoài ra bạn còn có thể chèn thêm các ký tự giúp định dạng dữ liệu xuất, như “\t” sẽ chèn thêm một tab, hay “\n” sẽ giúp xuống dòng. Bạn thử tự kiểm chứng bằng cách gõ xòng lệnh này nhé System.out.print(“\tHello\nWorld”);.

Tuy nhiên, với kiểu xuất mặc định này, có đôi lúc chúng ta tưởng như việc xuất nội dung là bình thường, nhưng nó lạ lắm. Bạn hãy xem kết quả in ra Console bên dưới đây, rồi chúng ta sẽ xem xuất “không mặc định” nó sẽ như thế nào sau nhé.

double x = 10000.0/3.0;
System.out.println("The result is " + x);

Kết quả sẽ in ra nội dung

The result is 3333.3333333333335

. Thì cũng đúng thôi, kết quả phép chia cho ra dãy số vậy là đúng rồi. Thế nhưng nếu chúng ta muốn kiểm soát việc in ra Console sao cho dữ liệu xuất được đẹp hơn thì sao. Chẳng hạn bạn muốn in ra giá trị cho tiền tệ, khi mà sau dấu thập phân bạn muốn làm tròn đến 2 con số thôi. Khi đó bạn hãy đến với kiến thức về xuất theo định dạng như sau.

Xuất Theo Định Dạng

Nếu như với xuất mặc định, bạn đã biết là nên dùng một trong hai phương thức là print() hay println(). Thì xuất theo định dạng cung cấp cho bạn một phương thức hiệu quả hơn đó là printf() (chữ f cuối cùng của phương thức viết tắt của từ format, chính là định dạng).

Khi đó để kết quả của ví dụ trên in ra một con số làm tròn “đẹp đẽ” sao cho chỉ có 2 chữ số sau dấu thập phân thôi, bạn có thể viết lại như sau.

double x = 10000.0/3.0;
System.out.printf("The result is %.2f", x);

Kết quả in ra là:

The result is 3333.33

. Đẹp hơn đúng không nào, mình giải thích sơ qua cho các bạn hiểu cách làm việc của printf() ở bên dưới (nếu bạn nào muốn tìm hiểu kỹ hơn tất cả cách sử dụng của printf() thì có thể đọc bài viết này của mình).

printf() ở mức cơ bản cần bạn phải truyền vào 2 thành phần, cách nhau bởi dấu (,).

  • Thành phần thứ nhất nói cho phương thức này biết nội dung xuất ra màn hình, trong nội dung đó có chỉ định một hoặc nhiều dấu hiệu định dạng. Trong ví dụ trên thì dấu hiệu này là %10.2fDấu hiệu định dạng này mang ý nghĩa rằng bạn muốn in một số thực bất kỳ, nhưng nó phải được hiển thị bởi ký tự sau dấu thập phân.
  • Thành phần thứ hai của phương thức chính là giá trị cần định dạng. Hệ thống sẽ tự động tìm kiếm nơi mà bạn đã khai báo dấu hiệu định dạng trong chuỗi xuất ở thành phần thứ nhất, cụ thể là %10.2f như bạn thấy, và thay thế vào đó giá trị cần định dạng, cụ thể là biến x của chúng ta.

Kết Luận

Chúng ta vừa thực hành các câu lệnh nhập/xuất đáng giá từ console. Bạn đã đủ tự tin để nhập bất kỳ dữ liệu bạn muốn vào chương trình, và xuất dữ liệu một cách đẹp đẽ ra console rồi. Hãy đến các bài viết tiếp theo của mình để cùng nhau từng bước xây dựng các ứng dụng hoàn chỉnh nhé.

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

Xem thêm:

Đừng bỏ qua việc làm IT tất cả level có trên TopDev nhé!

Chức danh Senior, Developer là gì? Khác gì với coder nhỉ!

Chức danh Senior, Developer là gì? Khác gì với coder nhỉ!

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Coder thường nói:
“Cứ code cho nó chạy được là mừng rồi”, “Code xong fix bug thấy bà”, bla bla bla…

Những anh Lead già làm chung chia sẻ và bản thân mình từng là developer và lead cũng thấy rằng Senior không phải là chức danh cho người làm lâu năm, thực tế khi làm chung với một số anh coder lâu năm thì thấy code vẫn ẩu, không rõ ràng và chất lượng chưa tốt qua việc bug phát sinh thường xuyên phải có tester và QC lại thì mới đảm bảo được!

Senior phụ thuộc vào công việc của công ty, công ty product hay outsourcing đối với mỗi công ty sẽ yêu cầu những skill khác nhau. Senior về product sẽ yêu cầu bạn chinh chiến khắp chốn skill áp dụng giải quyết vấn đề chiều rộng hơn sâu. Senior về outsourcing sẽ cần bạn ngồi lâu trong skill nào đó trở thành lão làng về nó giải quyết vấn đề theo chiều sâu chuyên môn về skill đó.

Thực tế, Senior là người developer biết giải quyết vấn đề một cách hiệu quả & triệt để, ít ảnh hưởng tới những yếu tố khác nhất. Ví dụ đơn giản, khi được khách hàng yêu cầu dựng một tính năng mới trong ứng dụng, đối với một Senior trước khi làm sẽ phải suy nghĩ thật kỹ về solution, architecture, extension, về mức độ ảnh hưởng tới những module đang chạy, tùy vào yêu cầu mà biết cần optimize cái gì, bởi vì nhiều khi đó là bài toán đánh đổi để cho hài hòa giữa nhiều yếu tố liên quan chặt chẽ tới nhau, như giữa tính bảo mật và hiệu năng, giao diện đẹp và trải nghiệm tốt,… Code viết phải gọn gàng, dễ bảo trì và mở rộng, để người khác không phải “gánh hậu quả” thay mình.

  Top 5 kinh nghiệm fix bug từ Senior Developer

Còn Coder, họ là ai? Họ rất yêu công nghệ, họ đang trăng mật với công nghệ mới, nhưng họ thiếu sự nhạy bén, tinh tế và khả năng suy xét thấu đáo, nên cứ code cho chạy thôi… nào thấy bug thì fix thôi.
Có lẽ trong chúng ta ai cũng từng nhiều lần tự chất vấn bản thân rằng chúng ta đang ở đâu trong cuộc đời? chúng ta đang làm gì, và làm vì điều gì khi thời giang trôi qua? Các developer sau khi đã trải qua nhiều năm say đắm với nghề, khi mà đã trôi qua rồi cái thời trăng mật với công nghệ, say mê tìm tòi viết ra những dòng code cực chất, hay nghiền ngẫm vọc những tool, framework, công nghệ mới hàng đêm, thì họ sẽ có lúc ngồi bình tĩnh lại tự hỏi có vẻ mình đã thay đổi?

Tham khảo một vài việc làm Java hấp dẫn dành cho các Coder!

Trong những buổi chiều “hội họp”, mình vẫn hay nghe những anh senior than thở rằng những công việc hằng ngày không còn hứng thú nữa vì họ cảm giác rằng chẳng còn gì họ làm mà mới mẻ khiến họ phải say mê, có nhiều sức ỳ nào đó đã trở nên quá lớn để họ tìm tòi tiếp.

Công nghệ mình cày cuốc bao nhiêu năm qua thực sự không phù hợp với mình, cảm thấy nhàm chán nhưng không có thời gian (thường thì đây là lời bao biện cho sức ỳ quá lớn, thứ sẽ xuất hiện khi bạn chẳng màng tới điều gì nữa) hoặc không còn hứng thú để học công nghệ khác vì chẳng tìm thấy sự phấn khích khi tiếp xúc với công nghệ mới như ngày xưa “Cái này cũng mới, hay đó nhưng cũng đang có cả một núi task đang chờ cho xong print này đã…”

Khi mình đã giỏi hơn, đã thu được một “kho tàng” kinh nghiệm thực chiến rồi thì đòi hỏi về mức lương tương xứng là điều dễ hiểu phải không? Nhận ra mình không được đền bù công sức và được tưởng thưởng xứng đáng với cấp bậc, kinh nghiệm và đóng góp trong công việc thì thật gây chán nản vô cùng. Đặc biệt ở những công ty nước ngoài, nơi khả năng ngoại ngữ cũng quyết định lớn tới sự thăng tiến và mức lương của bạn thì biết là mình thiếu ngoại ngữ đấy nhưng mà lại chẳng thể học vào được nữa và một phần có thể là quá lười với bao thứ giải trí xung quanh sau một ngày code mờ mắt. Cảm thấy ngành này với mình không có tương lai nên tìm MMO làm kiếm thêm cho bớt đau khổ, cho nhẹ gánh.

  Senior là gì? Phân biệt Senior và Junior thật chi tiết

Điều này nữa khá đúng với nhiều Senior đã có gia đình nhỏ và phải chăm lo cho nó. Sẽ có hai cách suy nghĩ: một bạn làm tất cả, tìm mọi phương cách để có thể lo lắng tốt cho gia đình mình. Hai là bạn nhận ra rằng công việc hiện tại quá tệ không đủ lo cho gia đình như bạn mong đợi nhưng mà không dám thay đổi, vì thay đổi thì lỡ có gì lại không thể lo cho gia đình, cho con cái của bạn.

Thật khó nghĩ, nhưng có lẽ bạn phải hiểu cuộc sống cũng như viết chương trình, sẽ có những bài toán đánh đổi và lâu lâu phải liều làm cái không rõ chút…

Bài viết gốc được đăng tải tại lcdung.top
Xem thêm Việc làm Developer hấp dẫn trên TopDev

Tổng Hợp Các Tip Khi Sử Dụng Android Studio

Tổng Hợp Các Tip Hay Khi Sử Dụng Android Studio

Bài viết được sự cho phép của tác giả Nhựt Danh

Chắc các bạn có để ý thấy, là mỗi khi khởi chạy Android Studio lên, sẽ có một popup nhỏ với tiêu đề là Tip of the Day. Popup này xuất hiện hoài cho đến khi bạn bỏ chọn Show Tips on Startup thì thôi.

Screen Shot 2016-09-08 at 10.37.29.png

Mình đồng ý với bạn là popup này cực kỳ hữu ích, nhưng không phải lúc nào chúng ta cũng đều dừng lại đọc và ghi nhớ tốt mỗi khi popup này hiện lên. Đã có lúc mình note các tip này lại ở đâu đó, nhưng rồi cũng bỏ mất. Chính vì vậy hôm nay mình quyết định một lần nữa tổng hợp tất cả chúng lại vào một bài viết, và mình cũng sẽ lọc ra các tip gần gũi và có thể được sử dụng nhiều nhất với mình và các bạn. Hi vọng bài viết hôm nay sẽ là trợ thủ đắc lực trong công việc lập trình ứng dụng Android hằng ngày của chúng ta.

Một Số Ký Hiệu Phím Đặc Biệt

Trước khi đi vào từng tip, chúng ta phải thống nhất với nhau các ký hiệu phím sẽ được dùng trong bài viết.

   Phím Shift
↑    Phím mũi tên hướng lên
   Phím Enter
⌃    Phím Control (máy Mac)
⌥   Phím Option (máy Mac)
⌘   Phím Command (máy Mac)
   Phím Delete (máy Mac)

  Cách Sử dụng Điện thoại giả Lập trong Android Studio

Chức Năng Hoàn Thành Code

Phím tắt:

– Mac: ⌃Space
– Windows/Linux: Ctrl+Space

Chức năng này rất rất cơ bản, mình nghĩ rằng ai cũng biết đến tổ hợp phím này khi tham gia vào lập trình. Đây đơn giản là một chức năng giúp gợi ý các dòng code cho bạn.

  Cách tạo icon tương thích trên Android bằng Android Studio

Tuy vậy, nếu tìm hiểu kỹ về chức năng cơ bản này, bạn sẽ phát hiện thêm nhiều điều thú vị hơn đấy nhé.

Mình ví dụ như khi nhấn tổ hợp phím⌃Space (máy Mac) khi gõ đến dòng code dưới đây, bạn thấy kết quả gợi ý hoàn thành code của hệ thống như sau. Bạn có thể chọn bất kỳ dòng code nào mà bạn muốn đúng không nào.

Screen Shot 2016-09-09 at 09.11.51.png

Thú vị ở chỗ, nếu ở bước này mình nhấn thêm một lần ⌃Space nữa, hệ thống sẽ cho ra kết quả nhiều hơn, chẳng hạn như sẽ có thêm các biến private.

Screen Shot 2016-09-09 at 09.12.20.png

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

Chức Năng Hoàn Thành Code (Thông Minh Hơn)

Phím tắt:

– Mac: ⌃⇧Space
– Windows/Linux: Ctrl+Shift+Space

Nếu bạn đã quen với tổ hợp phím tắt để hoàn thành code như đã nói trên đây, thì để cho hệ thống gợi ý hoàn thành code thông minh hơn bạn chỉ cần nhấn thêm phím⇧ mà thôi.

Khi dùng tính năng này, hệ thống sẽ dự đoán kiểu dữ liệu, hoặc luồng dữ liệu mà bạn sắp dùng, và đưa ra gợi ý phù hợp nhất trong ngữ cảnh đó.

Screen Shot 2016-09-09 at 11.43.21.png

Tương tự nếu bạn nhấn thêm một lần ⌃⇧Space nữa, hệ thống sẽ cho ra kết quả nhiều hơn.

Screen Shot 2016-09-09 at 11.43.58.png

Gợi Ý Các Tham Số Truyền Vào (Parameters)

Phím tắt:

– Mac: ⌘P
– Windows/Linux: Ctrl+P

Dùng phím tắt này nếu bạn muốn xem tất cả các tham số truyền vào của một hàm hay một constructor.

Screen Shot 2016-09-09 at 15.09.28.png

Chuyển Đổi Hoa/Thường Một Dòng Code

Phím tắt:

– Mac: ⌘⇧U
– Windows/Linux: Ctrl+Shift_U

Nếu bạn lỡ khai báo một hằng số hay một biến nào đó với toàn các ký tự thường như thế này.

Screen Shot 2018-01-04 at 17.11.40

Và mong muốn sửa thành in hoa hết như thế này.

Screen Shot 2018-01-04 at 17.11.55

Rất đơn giản, chỉ cần đưa trỏ chuột vào dòng muốn thay đổi in thường sang in hoa hoặc ngược lại rồi nhấn tổ hợp phím như trên kia. Xong.

Hoàn Thành Câu Lệnh

Phím tắt:

– Mac: ⇧⌘⏎
– Windows/Linux: Ctrl+Shift+Enter

Khi bạn muốn hệ thống kết thúc một câu lệnh giúp bạn, chẳng hạn như hệ thống sẽ tự biết mà điền vào các dấu đóng ngoặc, dấu chấm phẩy,… thì dùng phím tắt này cho nhanh. Bạn hãy tự kiểm chứng nhé.

Sao Chép Một Dòng Code

Phím tắt:

– Mac: ⌘D
– Windows/Linux: Ctrl+D

Mình chắc chắn là nhiều bạn sẽ thắc mắc, rằng bộ đôi thần thánh copy/paste cũng đủ dùng rồi, nhớ cái này mần chi? Vâng mình đồng ý, trước đây mình cũng nghĩ vậy, nhưng từ khi quen với tổ hợp phím này, mình như đã nghiện nó hơn là copy và paste truyền thống, vì nó giúp bạn chỉ cần một bước thôi là đã có thể sao chép một dòng lệnh rồi. Và nếu sẵn tiện bạn thử tô khối nhiều dòng lệnh rồi mới nhấn tổ hợp phím xem hiệu quả của nó nhé.

Xóa Một Dòng Code

Phím tắt:

– Mac: ⌘⌫
– Windows/Linux: Ctrl+Y

Thay vì nhấn liên tục phím delete để xóa hết một dòng code dài, bạn dùng chức năng này để xóa hết chỉ một lần nhấn nhé.

Di Chuyển Dòng Code Lên/Xuống

Phím tắt:

– Mac: ⇧⌘↑ hay ⇧⌘↓
– Windows/Linux: Ctrl+Shift+Up hay Ctrl+Shift+Down

Chức năng này giúp bạn di chuyển một dòng code lên/xuống, bạn nên hiểu là nó có hai tác dụng sau.

– Nếu có dòng trống ở trên hay dưới dòng mà con trỏ đang đứng, chức năng này giúp dòng code đang đứng dịch lên hay xuống để chiếm lấy dòng trống đó, y như là xóa luôn dòng trống vậy.
– Nếu có dòng code ở trên hay dưới dòng mà con trỏ đang đứng, chức năng này giúp đổi chỗ dòng code đang đứng với các dòng code đó.

Dùng Hiệu Quả Navigation Bar

Bạn nên biết rằng Navigation Bar cho bạn biết đường dẫn đến file dang mở. Như ở Android bài 3 cũng có nói đến.

Screen Shot 2016-09-08 at 14.41.01.png

Dựa vào Navigation Bar này, nếu bạn click vào một thư mục bất kỳ trên danh sách của nó, bạn sẽ thấy tất cả các thành phần con trong thư mục đó được bung ra, giúp bạn đi đến nơi cần đến một cách nhanh chóng.

Screen Shot 2016-09-08 at 14.44.53.png

Phím tắt để vào Navigation Bar:

– Mac⌘↑
– Windows/LinuxAlt+Home

Sử Dụng Distraction Free Mode

Có thể tạm dịch đây là Chế Độ Chống Phân Tâm. Khi bạn có nhu cầu cần chú tâm đến những dòng code của file hiện tại mà thôi, thì bạn hãy thử khởi động chế độ này, nó sẽ ẩn đi hết tất cả các cửa sổ và thành phần râu ria, chỉ chừa có mỗi code (và các menu của Android Studio) cho bạn dễ dàng làm việc.

Vào Distraction Free Mode

Từ menu của Android Studio, chọn View > Enter Distraction Free Mode.

Screen Shot 2016-09-08 at 13.10.23.png

Chế độ Distraction Free Mode sẽ điều chỉnh các cửa sổ code trông như sau.

Screen Shot 2016-09-08 at 13.12.33.png

Thoát khỏi Distraction Free Mode

Từ menu của Android Studio, chọn View > Exit Distraction Free Mode. Mọi thứ sẽ trở về như cũ.

Chúc các bạn thành công với các tip này nhé.

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

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Cài Đặt Các Công Cụ Phát Triển Cho Java

Cài Đặt Các Công Cụ Phát Triển Cho Java

Bài viết được sự cho phép của tác giả Nhựt Danh

Các bạn đều biết rằng, để có thể code được Java, nhất định cần phải xây dựng một môi trường lập trình cho nó. Với một môi trường lập trình như vậy, bạn sẽ có trong tay đầy đủ các công cụ cần thiết để có thể bắt tay vào xây dựng các dòng code cho riêng mình.

Vậy thì một môi trường lập trình cho Java sẽ phải cần đến những công cụ gì? Xây dựng chúng như thế nào? Chúng ta hãy cùng bắt tay vào tìm hiểu cách xây dựng từng công cụ nhé!

Cài Đặt JDK

Tương tự như phần hướng dẫn cài đặt JDK ở bên bài học Android, nếu bạn nào đã làm theo hướng dẫn đó rồi thì có thể bỏ qua phần này mà đến thẳng việc cài đặt InteliJ bên dưới, vì 2 phần hướng dẫn của 2 bài giống nhau.

Còn nếu chưa cài đặt JDK bao giờ thì bạn hãy vào trang của Oracle để download file cài đặt, bạn có thể vào bằng đường dẫn này đây (bạn cũng có thể search Google với từ khóa JDK Download). Sau khi mở link, bạn sẽ thấy danh sách các gói cài đặt như hình sau (hình ảnh có thể khác với máy của bạn ở thời điểm hiện tại do trang web này luôn được làm mới thường xuyên).

Ứng tuyển các vị trí việc làm Java lương cao trên TopDev

Java Downloads
Nhiều gói JDK cho bạn cài đặt

Bạn hãy chọn gói theo hệ điều hành mà bạn đang dùng rồi down về thôi. Sau khi download JDK về thì bạn tiến hành cài đặt nhé.

  Hướng dẫn cấu hình JDK (Java) cho Jenkins

Thiết Lập PATH & JAVA_HOME cho Windows

Nếu bạn cài đặt JDK cho MacOS thì có thể bỏ qua mục này. Nhưng nếu bạn đang cài đặt JDK này trên nền Windows, bạn nên làm tiếp một bước tiếp theo này.

Nghe qua có vẻ xa lạ, nhưng nếu bạn nào đã từng quen thuộc với các dòng lệnh trên Command Line sẽ hiểu việc thiết lập Path & Java Home này là gì. Cơ bản thì việc thiết lập này sẽ giúp hệ điều hành Windows có thể thực thi được các dòng lệnh Java bên trong jdk/bin mà bạn mới cài đặt xong.

Do mình không dùng Windows nên các chỉ dẫn của mình có thể không rõ ràng, các bạn có thể dễ dàng tìm kiếm với từ khóa Path & Java Home Windows sẽ ra các chỉ dẫn rõ ràng hơn nhé. Hoặc bạn có thể để lại bình luận, hoặc chat với mình nếu gặp bất cứ vấn đề nào về việc thiết lập này nhé.

  Hướng dẫn Java Design Pattern – Flyweight

Cài Đặt InteliJ

Việc cài đặt InteliJ cũng vô cùng dễ dàng.

Trước hết bạn hãy vào đường dẫn này để download InteliJ về. Khi mở link lên bạn sẽ nhìn thấy trang download của InteliJ như sau (một lần nữa mình lưu ý là hình ảnh có thể khác với máy của bạn ở thời điểm hiện tại nhé).

Cài Đặt InteliJ
Trang download của InteliJ

 

Khi này bạn hãy nhấn vào nút Download.

Sau khi đã vào trang download, bạn sẽ được lựa chọn các gói download phù hợp với hệ điều hành của bạn.

Cài Đặt InteliJ
Các tùy chọn cài đặt InteliJ

 

Như hình trên bạn có thể thấy, ngoài lựa chọn theo hệ điều hành ra thì còn có thêm 2 phiên bản của InteliJ IDEA cho bạn chọn nữa, bao gồm Ultimate và Community. Như mình có nói ở bài học đầu tiên, chúng ta chỉ cần phiên bản Community miễn phí của InteliJ là đã có thể dùng để học được rồi. Vậy bạn hãy nhấn vào nút Download bên Community nhé.

Sau khi chờ đợi trong ít phút, gói cài đặt đã được down về. Bạn hãy tiến hành cài đặt.

Sau khi cài đặt xong, bạn hãy mở InteliJ lên để làm quen nào. Khi lần đầu tiên mở InteliJ lên bạn sẽ thấy một màn hình như thế này.

InteliJ
Màn hình đầu tiên khi khởi chạy InteliJ

 

Kết Luận

Xin chúc mừng, bạn đã cài đặt thành công InteliJ cũng như các công cụ cần thiết để phát triển ứng dụng Java rồi đấy.

Chúng ta kết chúc bài học ở đây, bạn có thể tiếp tục mày mò cách sử dụng công cụ InteliJ lúc này. Nhưng đừng lo lắng quá nếu bạn chưa biết cách sử dụng nó. Chúng ta sẽ từng bước tìm hiểu Java cũng như công cụ lập trình InteliJ mạnh mẽ ở những bài học tiếp theo.

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

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Tìm hiểu về xác thực và phân quyền trong ứng dụng

Tìm hiểu về xác thực và phân quyền trong ứng dụng

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài này, chúng ta sẽ cùng tìm hiểu về xác thực (authentication)phân quyền (authorization) trong ứng dụng.

Xác thực (Authentication) là gì?

Theo định nghĩa của wikipedia, Xác thực/ Định danh (authentication) là một hành động nhằm thiết lập hoặc chứng thực một cái gì đó (hoặc một người nào đó) đáng tin cậy, có nghĩa là, những lời khai báo do người đó đưa ra hoặc về vật đó là sự thật.

Như đã biết, RESTful web service sử dụng HTTP protocol như một phương tiện giao tiếp và HTTP request là stateless protocol. Tức là server không lưu giữ bất kỳ thông tin nào của client, server xử lý các request một cách độc lập, không phụ thuộc vào trạng thái hay kết quả của request trước.

Như hình bên dưới, do server không lưu giữ bất kỳ thông tin nào của request trước. Nên mỗi request gửi lên server đều phải phải chứng thực lại, mặc dù là request của cùng một user đã được chứng thực.

Xác thực (Authentication) là gì?

Một trong những cách để giải quyết vấn đề này là mỗi request client gửi lên đều gửi kèm thông tin đã chứng thực trước đó.

Xác thực (Authentication) là gì?

  Authentication trong Spring Security

Authentication được thực hiện như thế nào?

Dấu hiệu nhận biết

Một số dấu hiện nhận biết quá trình chứng thực có thể được thực hiện hay không là: ở mỗi request, client sẽ gửi kèm thông tin chứng thực lên server như username/ password, một chuỗi chứa thông tin mã hóa (token, api key), một chuỗi random (session_id). Chúng thường được gửi kèm với trong HTTP request như: query string trong URL, Header (Cookie header, Authorization header, Custom header), Body (Form field, Hidden field,…)

Authentication được thực hiện như thế nào?

Tham khảo việc làm Back-end hấp dẫn trên TopDev

Quá trình authentication

Để có được dấu hiệu nhận dạng phía trên, ta cần có sự thống nhất trước giữa người dùng và ứng dụng để ứng dụng của chúng ta có thể nhận dạng được người dùng.

Về cơ bản thì một quá trình authentication sẽ gồm 2 bước:

  • Xác thực một user (thường là request đầu tiên).
  • Lưu giữ đăng nhập (cho các request phía sau).

  Two-Factor Authentication (2FA) là gì và hoạt động như thế nào?

Một quá trình authentication sẽ bao gồm 3 phần:

  • Sinh ra dấu hiệu: đây là việc chúng ta quyết định xem dùng dấu hiệu gì, tạo ra dấu hiệu đó như thế nào. Một quá trình authentication có thể có sự xuất hiện của nhiều dấu hiệu, ví dụ username/password, user token, api key,… Các dấu hiệu này sẽ có cách sinh ra khác nhau, quy ước sử dụng khác nhau.
  • Lưu trữ dấu hiệu: Đây là việc ứng dụng sẽ quyết định lưu trữ dấu hiệu này ở đâu, ở cả server và client, thông qua vị trí nào trên HTTP request,…
  • Kiểm tra dấu hiệu: Đây là việc ứng dụng của chúng ta kiểm tra lại tính hợp lệ của dấu hiệu, đối chiếu xem dấu hiệu này có hợp lệ hay không và của người dùng nào,…

Quá trình authentication

Phía trên ảnh là ví dụ quá trình authentication, trong đó mỗi request tùy thuộc vào thông tin đầu vào sẽ được xử lý qua 1 hoặc nhiều phần của quá trình authentication.

Cơ chế lưu giữ đăng nhập người dùng

Trong bài viết này, chúng ta sẽ cùng tìm hiểu chủ yếu tới 3 cơ chế lưu giữ đăng nhập người dùng cơ bản là:

  • Basic Authentication
  • Session-based Authentication
  • Token-based Authentication

Basic Authentication

Basic Auth là cơ chế xác thực đơn giản nhất của một ứng dụng web. Cách hoạt động của Basic Auth là gửi chính username + password của người dùng theo mỗi request.

Flow

  • Dấu hiệu: Chuỗi username:password đã được mã hóa Base64. Ví dụ có username là abc, password là 123 thì ta tạo chuỗi mã hóa: abc:123 –Base64–> YWJjOjEyMw==
  • Lưu trữ dấu hiệu:
    • Tại server: Máy chủ web sẽ lưu lại username, password trong database, file (htpasswd),…
    • Tại client: Sau khi hỏi người dùng nhập username và password lần đầu, browser sẽ lưu lại 2 giá trị này trong bộ nhớ được quản lý bởi mỗi trình duyệt (và chúng ta không thể tiếp cận bộ nhớ này bằng code trên trang) để tránh phải liên tục hỏi chúng ta username, password. Tuy nhiên thời gian lưu thường là có giới hạn.
    • Truyền tải: chuỗi đã mã hóa base64 phía trên sẽ được truyền trong HTTP request trong Authorization header với từ khóa Basic phía trước: Authorization: Basic YWJjOjEyMw==
  • Kiểm tra dấu hiệu: Với mỗi request gửi lên kèm thông tin username/password trên, server sẽ so sánh username/password với database, config file,… để kiểm tra tính hợp lệ.

Flow của Basic Auth:

Flow của Basic Auth

Usecase

Ưu điểm:

  • Đơn giản, do đó được hầu hết các trình duyệt, webserver (nginx, apache,…) hỗ trợ. Bạn có thể dễ dàng config cho webserver sử dụng Basic Auth với 1 vài dòng config.
  • Dễ dàng kết hợp với các phương pháp khác. Do đã được xử lý mặc định trên trình duyệt và webserver thông qua truyền tải http header, các bạn có thể dễ dàng kết hợp phương pháp này với các phương pháp sử dụng cookie, session, token,…

Nhược điểm:

  • Username/password dễ bị lộ. Do mỗi request đều phải truyền username và password nên sẽ tăng khả năng bị lộ qua việc bắt request, log server,…
  • Không thể logout. Vì việc lưu username, password dưới trình duyệt được thực hiện tự động và không có sự can thiệp của chủ trang web. Do vậy không có cách nào logout được người dùng ngoại trừ việc tự xóa lịch sử duyệt web hoặc hết thời gian lưu của trình duyệt.
  • Không thân thiện với người dùng. Việc hiển thị hộp thoại đăng nhập cũng như thông báo lỗi của trình duyệt, như các bạn đã biết là vô cùng nhàm chán, không chứa đựng nhiều thông tin cho người dùng.

Vì những đặc điểm trên, Basic Auth thường được sử dụng trong các ứng dụng nội bộcác thư mục cấm như hệ thống CMSmôi trường developmentdatabase admin,… lợi dụng việc chặt chẽ của kiểm tra Basic Auth trên các web server để tránh tiết lộ thông tin hệ thống nội bộ cho người ngoài, phòng chống hack, khai thác lỗ hổng ứng dụng,…

Session-based Authentication

Session-based authentication là cơ chế xác thực người dùng dựa trên việc tạo ra session của người dùng ở phía server. Sau quá trình xác thực người dùng thành công (username/password,…) thì phía server sẽ tạo và lưu ra một Session ID duy nhất để định danh. Session này chứa thông tin của người dùng đang đăng nhập và trả lại cho client session ID để truy cập session cho những request sau.

Phía client có thể lưu Session ID lại dưới dạng cookie và gửi kèm nó trong mọi request. Hệ thống sau đó sẽ dùng Session ID được gửi đi để xác định danh tính của user truy cập, để người dùng không cần phải nhập lại thông tin đăng nhập lần sau.

Khi Session ID được gửi lên, server sẽ xác định được danh tính của người dùng gắn với Session ID đó, đồng thời sẽ kiểm tra quyền của user xem có được truy cập tác vụ đó hay không. Giải pháp session và cookie vẫn có thể sử dụng, tuy nhiên ngày nay chúng ta có nhiều yêu cầu hơn, chẳng hạn như các ứng dụng Hybrid hoặc SPA (Single Page Application) có thể cần truy cập tới nhiều hệ thống backend khác nhau, vì vậy session và cookie lấy từ 1 server có thể không sử dụng được ở server khác.

Flow

Chúng ta hãy điểm qua các khía cạnh cơ bản của cơ chế này:

  • Dấu hiệu: 1 chuỗi (thường là random) unique gọi là Session ID
  • Lưu trữ dấu hiệu:
    • Tại server: Lưu dữ liệu của session trong database, file, ram,… và dùng Session ID để tìm kiếm.
    • Tại client: Lưu Session ID trong bộ nhớ cookie, hoặc URL trang web, form field ẩn,…
    • Truyền tải: Session ID sẽ xuất hiện trong các HTTP request tiếp theo trong Cookie (header Cookie: SESSION_ID=abc), URL (/profile?session_id=abc), body (form field ẩn),…
  • Kiểm tra dấu hiệu: Server dùng Session ID client truyền lên để tìm dữ liệu của session từ các nguồn lưu như database, file, ram,…

Quá trình set Session ID thường được thực hiện một cách tự động bởi server, cho nên session-based authentication thường sử dụng Cookie, vì cookie có thể set được từ phía server và được browser áp dụng tự động cho các request tiếp theo. Do đó cơ chế này thường đi liền với cookie. Tuy nhiên hãy nhớ là có nhiều cách để sử dụng được session ID mà không dùng cookie nữa nhé.

Flow của Session-based Authentication

Flow của Session-based Authentication

Usecase

Ưu điểm:

  • Thông tin được giấu kín: Client chỉ được biết tới Session ID thường là 1 chuỗi random không mang thông tin gì của người dùng, còn mọi thông tin khác của phiên đăng nhập hay người dùng hiện tại đều được lưu phía server nên cơ chế này giữ kín được thông tin của người dùng trong quá trình truyền tải.
  • Dung lượng truyền tải nhỏ: Bởi vì tự thân Session ID không mang theo thông tin gì, thông thường chỉ là một chuỗi ký tự unique khoảng 20-50 ký tự, do vậy việc gắn Session ID vào mỗi request không làm tăng nhiều độ dài request, do đó việc truyền tải sẽ diễn ra dễ dàng hơn.
  • Không cần tác động client: Theo mình thì để sử dụng cơ chế session này bạn chủ yếu chỉ cần sửa phía server. Client mà cụ thể là browser hầu như không cần phải xử lý gì thêm bởi đã được tích hợp tự động (đối với cookie), hoặc response trả về của server đã có sẵn (đối với session ID ở URL hoặc hidden form)
  • Fully-controlled session: Tính chất này có thể cho phép hệ thống quản trị TẤT CẢ các hoạt động liên quan tới phiên đăng nhập của người dùng như thời gian login, force logout,…

Nhược điểm:

  • Chiếm nhiều bộ nhớ: Với mỗi phiên làm việc của user, server sẽ lại phải tạo ra một session và lưu vào bộ nhớ trên server. Số data này có thể còn lớn hơn cả user database của bạn do mỗi user có thể có vài session khác nhau. Do vậy việc tra cứu đối với các hệ thống lớn nhiều người dùng sẽ là vấn đề.
  • Khó scale: Vì tính chất stateful của việc lưu session data ở phía server, do đó bạn sẽ khó khăn hơn trong việc scale ngang ứng dụng, tức là nếu bạn chạy ứng dụng của bạn ở 10 máy chủ, hay 10 container, thì 1 là bạn phải dùng chung chỗ lưu session, 2 là nếu không dùng chung bộ nhớ session thì phải có giải pháp để ghi nhớ user đã kết nối tới server nào của bạn. Nếu không rất có thể chỉ cần ấn refresh thôi, user kết nối với server khác khi cân bằng tải là sẽ như chưa hề có cuộc login ngay.
  • Phụ thuộc domain: Vì thường sử dụng cookie, mà cookie lại phụ thuộc vào domain, do vậy khả năng sử dụng phiên đăng nhập của bạn sẽ bị giới hạn ở đúng domain được set cookie. Điều này không phù hợp với các hệ thống phân tán hoặc tích hợp vào ứng dụng bên thứ 3.
  • CSRF: Nói nôm na là Session ID thường được lưu vào Cookie, và cookie mới là thứ dễ bị tấn công kiểu này. Vì cookie được tự động gắn vào các request tới domain của bạn. Ví dụ:
    • User vừa login vào my-bank.com và được set cookie: session_id=123
    • User vào trang web taolahacker.com xem tut của mình
    • Trên taolahacker.com mình ngầm gửi 1 request ajax tới domain my-bank.com.
    • Vì browser tự động thêm cookie session_id=123 vào request ajax trên, do vậy request của mình có thể thao tác mọi thứ như User thật.

Vì những đặc điểm trên, Session-based Authentication thường được dùng trong các website và những ứng dụng web làm việc chủ yếu với browser, những hệ thống monolithic do cần sự tập trung trong việc lưu session data và sự hạn chế về domain.

Token-based Authentication

Token-based Authentication là cơ chế xác thực người dùng dựa trên việc tạo ra token – một chuỗi ký tự (thường được mã hóa) mang thông tin xác định người dùng được server tạo ra và lưu ở client. Server sau đó có thể không lưu lại token này.

Flow

  • Dấu hiệu: 1 chuỗi chứa thông tin người dùng (thường được mã hóa và signed) gọi là token
  • Lưu trữ dấu hiệu:
    • Tại server: Thường là không cần lưu.
    • Tại client: Ứng dụng client (javascript, mobile,…) phải tự lưu token trong các bộ nhớ ứng dụng, local storage, cookie,…
    • Truyền tải: Token sẽ xuất hiện trong các HTTP request tiếp theo trong Authorization header (Authorization: Bearer abc), Cookie (header Cookie: token=abc), URL (/profile?token=abc), body (ajax body, field),…
  • Kiểm tra dấu hiệu: Token thường có tính self-contained (như JWT), tức là có thể tự kiểm tra tính đúng đắn nhờ vào các thuật toán mã hóa và giải mã chỉ dựa vào thông tin trên token và 1 secret key nào đó của server. Do đó server không cần thiết phải lưu lại token, hay truy vấn thông tin user để xác nhận token.

JWT hay Json Web Token là một loại token được chấp nhận và sử dụng rộng rãi như một tiêu chuẩn của các nền tảng web hiện đại (RFC 7519) bởi nó thỏa mãn được tính chất self-contained, được hỗ trợ bởi nhiều ngôn ngữ và nền tảng và hơn hết là cấu trúc JSON đơn giản, nhỏ gọn hơn rất nhiều so với các loại token khác như Simple Web Tokens (SWT) and Security Assertion Markup Language Tokens (SAML). Chi tiết về JWT, chúng ta sẽ cùng tìm hiểu ở một bài viết khác.

Flow của Token-based Authentication:

Flow của Token-based Authentication

Usecase

Ưu điểm:

  • Stateless: Bởi vì token thường có tính chất self-contained, do vậy server không cần lưu thêm thông tin gì về token hay map giữa token và người dùng. Do vậy đây là tính chất quan trọng nhất, phục vụ cho việc scale ứng dụng theo chiều ngang khi không cần quan tâm tới việc bạn sẽ sinh ra token ở đâu và verify token ở đâu.
  • Phù hợp với nhiều loại client: Nên nhớ, cookie là một concept được các browser áp dụng tự động, còn với các client sử dụng Web API như mobile, IoT device, server,… thì việc sử dụng cookie lại rất hạn chế. Sử dụng token trong header hay URL,… sẽ dễ dàng hơn cho client trong việc lưu lại token và truyền tải token.
  • Chống CSRF: Do việc sử dụng token phải được client xử lý từ việc lưu tới truyền tải, do vậy sử dụng token (mà không dùng cookie) sẽ phòng chống được các trường hợp tấn công như với trường hợp session/cookie.
  • Không bị giới hạn bởi domain: Đây là tính chất giúp các hệ thống hiện đại có sự tham gia của bên thứ 3 hoạt động dễ dàng hơn khi không bị giới hạn chỉ ở domain của hệ thống đăng nhập.

Nhược điểm:

  • Khó quản lý đăng xuất: Bởi vì server không lưu thông tin gì về token hay session của user, do đó điều khó kiểm soát nhất chính là việc đăng xuất. Và vì việc kiểm tra token chỉ dựa vào thông tin trên token, do vậy sẽ khó để ứng dụng của chúng ta vô hiệu hóa một token vẫn còn hiệu lực.
  • Phức tạp phần client: Cơ chế sử dụng token thường yêu cầu client phải có xử lý liên quan tới lưu token, gửi token, do vậy sẽ không phù hợp với những website kiểu cũ, sử dụng nhiều server render html và phần javascript hạn chế.
  • Thông tin dễ lộ: Khác với session, thông tin về phiên đăng nhập của người dùng có trên token và được lưu phía client, do vậy sẽ có các nguy cơ liên quan tới lộ thông tin trong token trong quá trình lưu trữ, truyền tải,… Chính vì vậy, thông thường người ta chỉ lưu 1 số thông tin thiết yếu như user_id, username mà không lưu những thông tin nhạy cảm như password vào token.
  • Dung lượng truyền tải lớn: Thường thì 1 token sẽ dài hơn session ID khá nhiều, mà token lại được gửi với mỗi request, do vậy độ dài request sẽ tăng lên, do đó băng thông truyền tải cũng sẽ cần phải tăng theo. Tuy nhiên, đây chỉ là một điểm hạn chế nhỏ so với những lợi ích nó mang lại.

Vì các đặc điểm trên, Token-based Authentication thường được sử dụng trong các hệ thống Web API, các hệ thống phân tán, micro-services, các hệ thống có sự tham gia của các nền tảng khác như mobile, IoT, server,…, hoặc các website kiểu mới (phân tách rõ UI app và API).

Bảng so sánh

Sau đây là bảng so sánh để các bạn dễ hình dung về 3 cơ chế đăng nhập này:

ĐẶC ĐIỂM BASIC SESSION-BASED TOKEN-BASED
Dấu hiệu username + password Chuỗi random (Session ID) Chuỗi mang thông tin được mã hóa
Truyền tải Authorization Header Header (cookie) / URL / Body (form) Header (Auth, custom) / URL / Body
Lưu Server Không lưu (vì chính là UserDB) Có lưu Session Data (memory, database, file,…) Không lưu (vì token chứa đủ thông tin rồi)
Lưu Client Browser tự lưu (username + pass) Cookie (Session ID) Local storage, Cookie, session storage (browser)
Cách verify So sánh với User trong database Dùng Session ID để tìm data trong session storage Kiểm tra tính toàn vẹn của token qua signature của token
Phù hợp cho Hệ thống internal Monolithic website Web API của hệ thống phân tán, đa nền tảng,…

Phân quyền (Authorization) là gì?

Sau khi đã có định danh và giao thức dùng để giao tiếp, câu hỏi tiếp theo là cần trả lời câu hỏi đối tượng với định danh đó có quyền thực hiện 1 hành động, truy cập 1 tài nguyên nào đó hay không. Quá trình này gọi là phân quyền (Authorization). Authorization xảy ra sau khi hệ thống của bạn được Authentication (xác thực) thành công.

Xác thực (authentication) trả lời câu hỏi “bạn là ai?” và phân quyền (authorization) sẽ trả lời câu hỏi “bạn có thể làm được gì?” Hai câu hỏi này luôn là thành phần không thể thiếu của mọi hệ thống, nhưng mức độ áp dụng thì lại tùy thuộc vào từng giai đoạn. Nếu bạn làm mọi thứ chặt chẽ ngay từ đầu, nó có thể làm tăng độ phức tạp và làm chậm sự phát triển của công ty. Nhưng nếu bạn làm nó quá muộn, thì có thể bạn sẽ hứng chịu nguy cơ bị tấn công và rủi ro từ đó.

Phân quyền (Authorization) là gì?

So sánh Authentication với Authorization

Authentication Authorization
Authentication xác nhận danh tính của user để cấp quyền truy cập vào hệ thống. Authorization xác định xem user có được phép truy cập tài nguyên không.
Đây là quá trình xác nhận thông tin đăng nhập để có quyền truy cập của người dùng. Đó là quá trình xác minh xem có cho phép truy cập hay không.
Nó quyết định liệu người dùng có phải là những gì anh ta tuyên bố hay không. Nó xác định những gì người dùng có thể và không thể truy cập.
Authentication thường yêu cầu tên người dùng và mật khẩu. Các yếu tố xác thực cần thiết để authorization có thể khác nhau, tùy thuộc vào mức độ bảo mật.
Authentication là bước đầu tiên của authorization vì vậy luôn luôn đến trước. Authorization được thực hiện sau khi authentication thành công.
Ví dụ, sinh viên của một trường đại học cụ thể được yêu cầu tự xác thực trước khi truy cập vào liên kết sinh viên của trang web chính thức của trường đại học. Điều này được gọi là authentication. Ví dụ, authorization xác định chính xác thông tin nào sinh viên được phép truy cập trên trang web của trường đại học sau khi authentication thành công.

 

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

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

Xem thêm nhiều công việc IT hấp dẫn trên TopDev

Hướng dẫn Export và Import dữ liệu trong WordPress

Hướng dẫn Export và Import dữ liệu trong WordPress

Bài viết được sự cho phép của tác giả Lại Đình Cường

Export và Import dữ liệu trong WordPress là 2 chức năng hữu ích nếu như bạn muốn di chuyển hoặc khôi phục dữ liệu. Nếu trang bạn bị virus, bạn có thể export dữ liệu. Sau đó xóa hết mọi thứ. Cuối cùng là bạn import dữ liệu lại. Chức năng này cũng áp dụng cho trường hợp bạn di chuyển hosting hoặc đổi tên miền,…

Hướng dẫn Export dữ liệu trong WordPress

Không chỉ hỗ trợ import dữ liệu từ WordPress. Chức năng import còn cho phép bạn chuyển dữ liệu từ các mã nguồn khác sang WordPress, đặc biệt là Blogger.

Hướng dẫn Export và Import dữ liệu trong WordPress

Như mình đề cập đến lợi ích của công cụ import và export dữ liệu bên trên. Ở đây mình không nói thêm nữa mà đi vào vấn đề của bài viết luôn. Trong bài này có 2 phần đó là: Hướng dẫn export (xuất) dữ liệu cho WordPress và hướng dẫn import (nhập) dữ liệu cho WordPress.

Cả 2 cái này là chức năng của WordPress nha các bạn. Không phải là export và import cơ sở dữ liệu trong MySQL nhé.

  26 đoạn code hay dùng trong lập trình theme WordPress

Hướng dẫn export dữ liệu trên WordPress

Để export dữ liệu trong WordPress thì bạn vào Dashboard → Tools → Export. Nội dung trang export sẽ được hiển thị như hình ảnh mình gửi đầu bài. Bên trong này thì bạn có thể export toàn bộ dữ liệu hoặc từng thể loại.

Hướng dẫn export dữ liệu trên WordPress

Sau khi chọn xong thì bạn nhấn nút Download Export File. Tập tin dữ liệu được tải về máy tính dưới dạng là .xml nhé. Cái này bạn có thể áp dụng để backup dữ liệu theo khoảng thời gian cho blog WordPress.

Tham khảo việc làm WordPress lương cao trên TopDev

Hướng dẫn import dữ liệu trên WordPress

Nếu như export là xuất dữ liệu dưới dạng tập tin .xml thì import là bạn nhập dữ liệu vào lại cho blog WordPress. Bạn vào Dashboard → Tools → Import. Một trang sẽ hiển thị lên như hình ảnh bên dưới:

Hướng dẫn Import dữ liệu trong WordPress

Bên trong trang import này có rất nhiều chức năng. Ngoài chức năng nhập và chuyển đổi dữ liệu thì bạn còn có thể sử dụng để chuyển đổi qua lại giữa thẻ và chuyên mục. Ở đây mình hướng dẫn export và import dữ liệu trong WordPress nên bạn sẽ chọn WordPress Run Importer.

Một trang mới sẽ xuất hiện. Bạn chọn tập tin XML mà bạn đã export lúc trước. Sau khi chọn xong tập tin thì bạn nhấn nút Upload file and import. Màn hình Import WordPress hiển thị lên cho phép bạn gán nội dung bài viết cho tài khoản mới hoặc chọn tài khoản tác giả có sẵn. Mục tùy chọn Download and import file attachments là bạn dùng để chọn có nhập các tập tin đính kèm cùng bài viết hay không.

  Hướng dẫn xây dựng chức năng thay đổi avatar người dùng WordPress

Cuối cùng là bạn nhấn nút Submit và chờ đợi quá trình import hoàn tất.

Kết luận

Qua bài viết Hướng dẫn Export và Import dữ liệu trong WordPress này bạn đã có thể xử lý dữ liệu cho WordPress một cách dễ dàng. Không chỉ áp dụng cho dữ liệu của WordPress. Trong chức năng Import còn cho phép bạn nhập dữ liệu từ nhiều nguồn khác.

Hy vọng bài viết sẽ giúp ích được bạn. Nếu thấy bài viết hữu ích thì hãy chia sẻ cùng mọi người nhé. Và đừng quên để lại bình luận để trao đổi dù bạn có cần sự trợ giúp hay không. Chúc bạn thành công.

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

Xem thêm:

Android Developer là gì? Tất tần tật những điều cần biết

Android Developer là gì? Tất tần tật những điều cần biết

Hệ điều hành Android là một trong những hệ điều hành lớn nhất trên thế giới với thị phần chiếm trên 70%. Với sự phổ biến của hệ điều hành này đã kéo theo nhu cầu tuyển dụng lập trình viên Android Developer tăng cao, trở thành một ngành vô cùng tiềm năng cho những ai muốn theo đuổi. Vậy Android Developer là gì? Làm thế nào để trở thành một Android Developer giỏi? Cùng TopDev tìm hiểu chi tiết về công việc này nhé!

Android Developer là gì?

Android Developer là gì?

Android là hệ điều hành được phát triển bởi ông lớn Google dành cho các thiết bị di động thông minh (điện thoại, tivi, máy tính bảng,…). Với đặc điểm là một nền tảng mã nguồn mở nên các nhà phát triển sẽ dễ dàng điều chỉnh, thiết kế các ứng dụng trong hệ điều hành.

Các Android Developer là những lập trình viên sử dụng các ngôn ngữ lập trình để xây dựng, thiết kế ứng dụng chạy trên hệ điều hành Android. Bên cạnh đó, họ còn là người chịu trách nhiệm duy trì, phát triển và cập nhật những tính năng mới cho phần mềm này.

  Android Studio: Phần mềm hỗ trợ lập trình ứng dụng Android

  5 ứng dụng Android tuyệt vời dành cho Android Developer và Designer

Công việc của Android Developer là gì?

Những nhà phát triển ứng dụng – Android Developer sẽ làm các công việc liên quan đến xây dựng, phát triển phần mềm chạy trên hệ điều hành Android. Cụ thể:

  • Nghiên cứu yêu cầu của dự án, nhu cầu của người dùng.
  • Xây dựng khái quát các tính năng trên ứng dụng đó.
  • Xử lý nguồn dữ liệu bên ngoài và lập trình API hỗ trợ cho các thiết bị tương thích.
  • Thiết kế giao diện, tối ưu trải nghiệm cho người dùng.
  • Chạy test phần mềm để phát hiện và sửa các lỗi.
  • Xuất bản ứng dụng dưới dạng APK trên Google Play.
  • Nâng cấp và cập nhật các tính năng mới cho ứng dụng qua các bản cập nhật.

Tham khảo việc làm Mobile Developer hấp dẫn trên TopDev

Cần học gì để trở thành Android Developer?

Cần học gì để trở thành Android Developer?

Để trở thành một lập trình viên Android bạn có thể học nhiều ngôn ngữ lập trình. Tuy nhiên, việc lựa chọn một ngôn ngữ lập trình chính và hiểu sâu về nó sẽ tốt hơn là việc học tất cả các ngôn ngữ mà không giỏi ngôn ngữ nào. Dưới đây là một số ngôn ngữ lập trình bạn có thể học nếu muốn trở thành Android Developer:

  • Kotlin: Đây là ngôn ngữ lập trình đa nền tảng do chính Google phát triển nên sẽ được ưu tiên hỗ trợ hàng đầu.
  • Java: Đây là ngôn ngữ lập trình được các lập trình viên Android sử dụng nhiều nhất. Việc thông thạo nó sẽ giúp bạn hoàn thành tốt công việc, hiệu quả và nhanh chóng.
  • C++: Ngôn ngữ này sẽ tương thích với phần cứng giúp tiết kiệm tài nguyên phần cứng hơn, nâng cao hiệu suất và tốc độ chạy của chương trình.
  • Python: Các bước lập trình Python khá đơn giản và bạn không cần phải cài thêm quá nhiều công cụ. Các lập trình viên có thể chạy thử ứng dụng trên thiết bị Android dễ dàng.
  • Android SDK và Android Studio IDE: Android SDK cung cấp các công cụ để tạo và quản lý tài nguyên, các trình biên dịch và trình giả lập để kiểm tra ứng dụng trước khi triển khai trên thiết bị Android. Bên cạnh đó, Android Studio sẽ cung cấp một giao diện đồ họa và các công cụ để tạo và quản lý các dự án Android, xây dựng giao diện người dùng, lập trình phần mềm, và triển khai ứng dụng trên các thiết bị Android.

Nên học lập trình Web hay lập trình Mobie?

Web Developer và Mobile Developer là hai vai trò khác nhau trong lĩnh vực phát triển phần mềm. Tuy nhiên, với những bạn lập trình viên mới ra trường thì việc tìm hiểu và lựa chọn học nào gặp phải nhiều khó khăn.

Dưới đây là một vài phân tích giúp bạn đưa ra quyết định chính xác khi phân vân giữa 2 công việc này.

Lập trình Web Lập trình Mobile
Tính chất Có 3 hướng đi cho sự nghiệp:

  • Lập trình Frontend
  • Lập trình Backend
  • Lập trình FullStack
Có 3 nhóm chính:

  • Ứng dụng Native
  • Ứng dụng HTML5
  • Ứng dụng Hybrid
Ngôn ngữ lập trình JavaScript, Java, Python, Ruby, PHP,… Java, Swift, Kotlin,…
Tính linh hoạt Tính linh hoạt cao, khi bạn thành thạo một ngôn ngữ, bạn có thể sử dụng trong nhiều mục đích công việc khác nhau. Mobile Developer mang tính đặc thù hơn, bạn sẽ phải    sử dụng nhiều ngôn ngữ và công cụ để phát triển app trên các nền tảng khác nhau.
Cơ hội nghề nghiệp và mức lương Cơ hội nghề nghiệp hấp dẫn với đa dạng vị trí tuyển dụng. Mức lương cũng vô cùng hấp dẫn, dao động từ 10 – 25 triệu đồng/tháng. Thiết bị di động ngày càng nhiều kéo theo nhu cầu tuyển dụng tăng cao. Kèm theo đó mức lương của Mobile Developer cũng cao hơn Web Developer vì sự phức tạp trong việc phát triển ứng dụng.

Kỹ năng và tố chất cần thiết để trở thành Android Developer

Để trở thành một lập trình viên Android giỏi bạn phải thành thạo một số kỹ năng dưới đây:

  • Kỹ năng sử dụng ngôn ngữ lập trình: Việc hiểu và thành thạo các ngôn ngữ lập trình (Java, C, C++,…) là điều tất yếu giúp cho bạn làm việc hiệu quả.
  • Thành thạo Android Studio: Bạn cần có kiến thức về cách sử dụng các công cụ và thư viện của Android để thao tác nhanh chóng và hiệu quả hơn.
  • Kỹ năng làm việc nhóm: Hợp tác với các thành viên trong team sẽ giúp xây dựng và phát triển ý tưởng tốt hơn.
  • Kỹ năng phân tích và giải quyết vấn đề: Các vấn đề xảy ra trong quá trình chạy phần mềm là khó tránh khỏi, bạn cần nhạy bén với vấn đề và đưa ra các giải pháp phù hợp để giải quyết nó.
  • Liên tục cập nhật các kiến thức mới: Các lập trình viên nên update thường xuyên những kiến thức mới trên các trang blog, medium, trên youtube, google,… phát triển phần mềm tốt hơn.

Cơ hội nghề nghiệp và mức lương của Android Developer

Cơ hội nghề nghiệp và mức lương của Android Developer

Việc phát triển mạnh mẽ của các thiết bị công nghệ cùng nhu cầu giải trí và sử dụng ứng dụng thông minh từ người dùng ngày càng cao, điều này làm tăng nhu cầu tuyển dụng  Android Developer. Cơ hội tìm việc làm lập trình Android tại các công ty công nghệ ngày càng rộng mở với mức thu nhập cực hấp dẫn.

Mức lương của vị trí Android Developer khá tốt, dao động khoảng 10 – 12 triệu đồng/tháng với những người từ 1 – 2 năm kinh nghiệm. Lập trình viên làm việc lâu năm mức lương có thể lên đến 30 triệu đồng/tháng. Cần lưu ý, mức lương này có thể thay đổi tùy thuộc vào nhiều yếu tố như kinh nghiệm, công ty, vị trí làm việc,…

Qua bài viết này, mong rằng bạn đã có cái nhìn tổng quan về nghề Android Developer, cũng như có thêm định hướng cho việc chọn ngành trong tương lai. Cơ hội việc làm lập trình Android đang rộng mở tại TopDev, truy cập ngay để biết thêm thông tin về yêu cầu và mức lương bạn nhé!

Xem thêm:

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

Mobile App Developer là gì? Cơ hội nghề nghiệp và mức lương hấp dẫn

Mobile App Developer là gì? Cơ hội nghề nghiệp và mức lương hấp dẫn

Với sự phát triển nhanh chóng của công nghệ và Internet đã giúp các thiết bị di động trở thành một phần không thể thiếu trong cuộc sống con người. Điều này tạo ra một cơ hội tuyệt vời cho những Mobile App Developer, họ là những nhà phát triển ứng dụng tên các chiếc smartphone bạn đang sử dụng. Đây là một công việc đầy tiềm năng và rất đáng để các bạn trẻ theo đuổi. Cùng TopDev tìm hiểu một vài thông tin hữu ích về vị trí Mobile App Developer này nhé!

Mobile App Developer là gì?

Mobile App Developer là gì?

Mobile App Developer (hay còn gọi là nhà phát triển ứng dụng di động) là người thiết kế, phát triển và triển khai các ứng dụng trên các thiết bị di động như điện thoại thông minh, máy tính bảng và các thiết bị đeo tay. Các ứng dụng di động có thể được phát triển cho các nền tảng khác nhau như iOS (Apple), Android (Google), Windows Phone (Microsoft) hoặc những nền tảng di động khác.

Bên cạnh đó, các Mobile App Developer sẽ không ngừng nâng cấp và cải tiến ứng dụng để mang lại nhiều tính năng mới, nâng cao trải nghiệm người dùng. Có thể thấy, các lập trình viên Mobile không chỉ đơn giản ngồi code, mà họ tham gia vào tất cả các giai đoạn của việc phát triển sản phẩm.

  7 Xu hướng Mobile Marketing đáng mong chờ nhất năm 2023

Phân loại Mobile App Developer

Mobile App Developer có thể chia làm hai loại chính là iOS Developer và Android Developer:

  • iOS Developer là những người chịu trách nhiệm xây dựng, phát triển, cập nhật các ứng dụng cho các thiết bị chạy hệ điều hành iOS. Các iOS Developer sẽ viết code bằng ngôn ngữ lập trình Swift hoặc Objective-C để phát triển ứng dụng. 
  • Android Developer sẽ đảm nhiệm việc phát triển ứng dụng cho các thiết bị chạy hệ điều hành Android. Để viết được các ứng dụng này bạn cần có kiến thức cơ bản về Java, điều này sẽ giúp ích cho chặng đường sự nghiệp của bạn.

Tham khảo việc làm Mobile App Developer tại TopDev

Công việc của một Mobile App Developer

Một Mobile App Developer thực thụ sẽ làm các công việc liên quan đến việc lên kế hoạch, xây dựng ý tưởng và phát triển ứng dụng. Cụ thể, họ phải thực hiện những công việc sau:

  • Tìm hiểu và phân tích nhu cầu của người dùng.
  • Đề xuất và đưa ra ý tưởng về sản phẩm, dịch vụ ứng dụng di động.
  • Viết code lập trình và xây dựng khung tính năng nền tảng cho phần mềm.
  • Chạy thử và đánh giá chất lượng ứng dụng trên các phần mềm giả lập.
  • Lên kế hoạch, ý tưởng bổ sung để sửa đổi và nâng cấp ứng dụng theo những tiêu chuẩn chất lượng của hệ điều hành iOS hay Android.

Công việc của một Mobile App Developer

Cần có những kỹ năng gì khi làm Mobile App Developer?

Với nhu cầu sử dụng các thiết bị di động thông minh trong việc học tập, làm việc, giải trí,… đã đưa nghề Mobile App Developer thành một vị trí có mức lương vô cùng hấp dẫn. Tuy nhiên, để thành công trong công việc này bên cạnh việc thành thạo các ngôn ngữ lập trình bạn cần trau dồi thêm nhiều kỹ năng liên quan. Dưới đây là một số kỹ năng cần có của một Mobile App Developer.

Kỹ năng chuyên môn

  • Kỹ năng thiết kế giao diện người dùng: Xây dựng giao diện người dùng (UI) trực quan, dễ sử dụng, thu hút và mượt mà là nhiệm vụ của Mobile App Developer. Lập trình viên cần nắm được các quy tắc thiết kế để sáng tạo ra những ứng dụng có điểm riêng nhưng vẫn người dùng vẫn dễ dàng sử dụng.
  • Kỹ năng phát triển đa nền tảng: Một lập trình viên Mobile cần có nhiều kiến thức về các nền tảng di động khác nhau như Android, iOS, Windows Phone. Điều này sẽ giúp bạn có cơ hội tiến xa hơn trên con đường sự nghiệp.
  • Kỹ năng lập trình các ngôn ngữ mới: Bạn cần có kỹ năng sử dụng thành thạo các ngôn ngữ lập trình thông dụng như Java, C++. Hiểu biết các ngôn ngữ lập trình như CSS, HTML, có khả năng thực hiện bộ di động đa nền tảng như AMP và Anten.
  • Biết cách phát hành ứng dụng lên store: Mỗi cửa hàng ứng dụng sẽ có chính sách, quy trình deploy ứng dụng khác nhau. Các Mobile App Developer cần nắm được cách upload ứng dụng, setup các nội dung trên ứng dụng,…

Kỹ năng mềm

  • Kỹ năng giao tiếp: Kỹ năng này sẽ giúp bạn làm việc nhóm hiệu quả hơn, bởi việc phát triển một phần mềm cần sự cộng tác của cả một tập thể.
  • Kỹ năng giải quyết vấn đề: Các sự cố xảy ra liên quan đến ứng dụng di động cần đều cần lập trình viên phát hiện và giải quyết kịp thời. Do đó, bạn cần có kỹ năng này để tìm ra lỗi và chỉnh sửa để ứng dụng hoạt động ổn định nhất.
  • Kỹ năng sáng tạo: Một Mobile App Developer nên có kỹ năng này để tạo được sự mới mẻ, giúp người dùng cảm thấy hứng thú khi sử dụng ứng dụng.

  Lập trình viên mobile cần học những gì?

Học gì để trở thành Mobile App Developer

Để trở thành một lập trình viên Mobile, bạn có thể học các ngôn ngữ lập trình dưới đây:

Dart (Flutter)

Dart (Flutter)

Flutter là một Framework được phát triển bởi Google và Dart, bạn có thể sử dụng để viết code khá đơn giản. Đây là ngôn ngữ lập trình đa nền tảng 1 code – base build cho các hệ điều hành trên điện thoại, tuy nhiên có thể sẽ khó tiếp cận với người mới.

JavaScript/Typescript (React Native)

Đây là 2 ngôn ngữ lập trình sử dụng cho Framework React Native đa nền tảng. Người mới có thể sử dụng JavaScript, người nhiều kinh nghiệm hơn thì dùng Typescript.

Kotlin/Java (Android)

Kotlin và Java là một native-apps dành riêng cho Android nên việc sử dụng sẽ đơn giản và linh hoạt hơn.

Swift (iOS)

Đây là ngôn ngữ lập trình dành cho các lập trình viên iOS với ưu điểm tương đối clean, dễ dùng và có thể tái sử dụng dễ dàng. Tuy nhiên, các Mobile App Developer phải đầu tư thiết bị của Apple để thực hiện ngôn ngữ lập trình này.

Mức lương của lập trình viên Mobile

Với sự phát triển mạnh mẽ của các thiết bị di động kéo theo nhu cầu tuyển dụng lập trình viên Mobile App Developer tăng cao. Vì vậy,  mức lương của lập trình viên Mobile khá tốt, dao động từ 8-12 triệu đồng/tháng với những người mới ra trường. Còn với các lập trình viên trên 2 năm kinh nghiệm mức lương có thể trên 20 triệu đồng.

Có thể thấy, thị trường nhân sự ngành IT đang rất khát nhân lực nên việc lựa chọn theo nghề Mobile App Developer sẽ giúp bạn kiếm được nhiều thu nhập trong tương lai. 

Hy vọng rằng, qua bài viết này bạn đã hiểu hơn về công việc và những yêu cầu cần có của một Mobile App Developer. Bạn có thể truy cập TopDev để tìm các công việc liên quan đến lập trình Mobile với mức lương và nhiều chính sách đãi ngộ hấp dẫn.

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Giới Thiệu Về Android & Môi Trường Phát Triển Phần Mềm

Giới Thiệu Về Android & Môi Trường Phát Triển Phần Mềm

Bài viết được sự cho phép của tác giả Nhựt Danh

Xin chào các bạn. Bạn đang ở đây và đang đọc các dòng mở đầu cho các bài viết về lập trình Android của mình, chứng tỏ bạn đang quan tâm đến lĩnh vực lập trình cho các thiết bị Android này. Dù cho bạn có đang là một người mới muốn làm quen và thử sức với lập trình Android, hay bạn là người đã có kinh nghiệm nhất định về Android và đang muốn tham khảo thêm các thông tin và ý kiến từ những lập trình viên khác, thì việc bạn chú ý đến các bài viết này, theo mình nghĩ, đều là các quyết định sáng suốt.

Với chuỗi bài viết về lập trình Android này, mình sẽ cố gắng mang đến cho các bạn các thông tin cơ bản và cơ sở nhất, cùng những xây dựng từng bước, giúp các bạn mới làm quen với Android có thể dễ dàng tiếp cận và thực hiện mong ước xây dựng một ứng dụng Android hoàn chỉnh của các bạn. Đồng thời mình sẽ tìm hiểu các bài viết từ các nguồn khác để nói rộng hơn một chút về Android cho các bạn đã hiểu về lĩnh vực này có cơ hội cùng chia sẻ kiến thức.

Tuy cố gắng trong việc xây dựng một bộ kiến thức ổn về Android là vậy, nhưng thực sự với tốc độ phát triển và sự nâng cấp nhiệt tình từ chính Google dành cho hệ điều hành của họ, cũng khiến mình nhiều phen “hụt hơi”“chới với” (trong việc viết và cập nhật trên blog). Do đó nếu bạn có đang đọc các bài viết trong chuỗi bài này của mình mà thấy kiến thức đã cũ, thì vui lòng giúp mình để lại comment ở mỗi bài viết, đồng thời cũng hãy chủ động tìm kiếm thông tin mới mẻ hơn từ các trang web khác hoặc trang “chính chủ” Google nhé, dĩ nhiên mình luôn để link đến trang web gốc ở các mục liên quan rồi.

Hãy bắt đầu nào. Trước tiên, để có thể yêu thích lập trình Android, thì mình mời bạn tìm hiểu về Android trước.

  Mobile App Developer là gì? Cơ hội nghề nghiệp và mức lương hấp dẫn

Giới Thiệu Android

Vâng, Android là một hệ điều hành, và hệ điều hành này là một hệ điều hành mã nguồn mở.

Giới Thiệu Android
Biểu tượng hình chú robot của hệ điều hành Android

 

Ban đầu hệ điều hành này được xây dựng hướng đến việc sử dụng trên các điện thoại di động thông minh, sau này nó tiếp tục được phát triển để sử dụng rộng rãi trên các máy tính bảng, TV, thiết bị đeo được, xe hơi,…

Liệt kê ra như vậy để bạn thấy rằng, tiếp cận vào lập trình Android không chỉ gói gọn trong một lĩnh vực là viết ứng dụng cho các điện thoại thông minh, mà bạn còn có cơ hội mở rộng hơn kiến thức bản thân cho các nền tảng khác, như TV chẳng hạn. Hơn nữa với việc đây là hệ điều hành mã nguồn mở, bạn có thể còn phát triển được các ứng dụng chạy trên rất nhiều thiết bị phần cứng của nhiều hãng sản xuất khác nhau. Về cơ bản tất cả các hệ điều hành liên quan này đều dựa trên nền tảng Android, nhưng mỗi nhà sản xuất lại đưa vào những cập nhật riêng, mang đến các diện mạo khác nhau đôi chút hoặc rất nhiều tùy từng nhà sản xuất (sự đa dạng này vừa là lợi thế nhưng cũng gây ra các vấn đề tương thích khá hóc búa cho các lập trình viên chúng ta, nhưng không sao, hãy cùng nhau trải nghiệm thôi).

Tham khảo việc làm Mobile Developer hấp dẫn trên TopDev

Tại Sao Lại Chọn Lập Trình Android?

Sau khi nhìn “sơ” qua Android là gì, chúng ta đến một bước lựa chọn nữa khi tìm hiểu sâu hơn về Android dưới con mắt của một lập trình viên.

Dễ Tiếp Cận

Có thể nói trở thành một lập trình Android là một quyết định khá dễ dàng, chỉ cần bạn thích và… bùm, bắt tay vào thôi.

Có được điều này thứ nhất phải kể đến Trang thiết bị. Chắc chắn để lập trình thì bạn phải trang bị máy tính rồi, nhưng máy tính nào thì lập trình được Android? Thì có thể nói là, hầu như bạn chẳng cần quá bận tâm về nó.

Dù máy tính bạn có chạy được Windows, Mac, Linux hay thậm chí Chrome OS, bạn đều thoải mái bắt đầu với Android. Còn về một điện thoại di động thông minh để kiểm thử ứng dụng ư? Điều đó cũng không quá khó khi mà các điện thoại Android trên thị trường hiện nay đa số đều có giá khá “mềm”, bạn rất dễ để tìm mua một chiếc nếu chưa có thiết bị này trong tay.

Thêm nữa, các lập trình viên Android được Google trang bị cho một công cụ lập trình có tên Android Studio, bạn sẽ được làm quen công cụ này sau. Công cụ lập trình này phải nói là khá mạnh mẽ, và như mình nói ở trên, tương thích được với nhiều loại hệ điều hành, khiến chúng ta vừa dễ cài đặt, dễ tiếp cận, lại yên tâm code vì rõ ràng ở những bước đầu tiên này chúng ta đã cảm nhận được sự trang bị đầy đủ từ Google như nào rồi ha.

  Android Studio: Phần mềm hỗ trợ lập trình ứng dụng Android

Android Studio
Nhìn giao diện hiện đại này của Android Studio bạn có thấy kích thích không?

 

Điều tiếp theo dẫn đến lập trình Android trở nên dễ tiếp cận, đó là Ngôn ngữ lập trình. Nếu bạn đã biết Java, điều đó thật tuyệt, bạn sẽ chỉ cần học thêm về cách thức tương tác với hệ điều hành thông qua Java. Nhưng nếu như bạn chưa từng biết đến Java, thì việc học Java cũng không quá khó khăn, đặc biệt nếu bạn đã từng biết đến một ngôn ngữ lập trình Hướng đối tượng nào khác như C++ hay C# (bạn có thể tìm hiểu về Java qua các bài viết của mình ở đây). Hoặc một lựa chọn tuyệt vời hơn, đó là bạn tìm hiểu luôn Kotlin, một ngôn ngữ khá hiện đại và mạnh mẽ. Tóm lại nếu bạn biết Java hay Kotlin đều có thể bắt tay vào lập trình Android ngay được rồi.

Java và Kotlin
Biết Java hay Kotlin đều có thể lập trình Android

 

Tính Tương Thích

Mục này cũng có thể hiểu với nhiều ý.

Thứ nhất, có thể thấy sự tương thích nằm ở Hệ điều hành. Android là một hệ điều hành mở, lại là một hệ điều hành nổi tiếng số một trên thế giới hiện nay. Việc Android được ứng dụng trên nhiều lĩnh vực khác nhau mang đến cho bạn có cơ hội suy nghĩ đến việc phát triển một ứng dụng trên thiết bị điện thoại thông minh, lại có thể nhanh chóng mở rộng ra để chạy trên các thể loại thiết bị khác, như TV hay các thiết bị giải trí khác.

Sự tương thích cũng nằm ở Ngôn ngữ lập trình cho hệ điều hành này. Không cần phải nói đến việc ngôn ngữ Java được sử dụng rộng rãi cho các lĩnh vực khác nhau như thế nào vì ai cũng biết, điều này cho thấy nếu bạn từng lập trình Android bằng Java, bạn cũng có thể nhanh chóng ứng dụng logic hay nền tảng của ứng dụng này cho các lĩnh vực khác cũng dùng ngôn ngữ Java. Hay nếu bạn biết Kotlin, bạn cũng dễ dàng phát triển ra các ứng dụng cho iOS hay các ứng dụng Web khác cũng bằng ngôn ngữ Kotlin này.

Ứng Dụng Của Bạn Được Đưa Lên Google Play

Chắc hẳn bạn cũng biết cái “chợ” cho các ứng dụng Android này. Nó được gọi là Google Play, hay Google Play store. Không cần phải là một lập trình viên, bạn vẫn thường xuyên sử dụng nó, và bạn cũng nhận ra rằng Google Play là một nơi chứa vô số các ứng dụng khác nhau.

Google-Play
Giao diện Google Play quen thuộc

 

Đúng vậy, mình đã từng nghe Google Play đã cán mốc 2,6 triệu ứng dụng được đưa lên đây. Và bạn hãy tưởng tượng mà xem, trong số 2,6 triệu ứng dụng này, cũng có vài ứng dụng của bạn trên đó thì sao. Khi đó, có khi có đến hàng trăm, hoặc hàng ngàn, hoặc hơn nữa, người dùng trên khắp thế giới đang sử dụng ứng dụng của bạn hàng ngày thì sao. Nghĩ thôi đã thấy thích rồi.

Ngoài việc dễ dàng tải ứng dụng xuống, thì việc đưa ứng dụng lên Google Play cũng khá dễ dàng. Bạn chỉ cần bỏ ra $25 cho một lần duy nhất trong đời để mua tài khoản trên đây, rồi sau đó thoải mái phát triển các ứng dụng của riêng bạn và xuất bản.

Thêm nữa, bên cạnh có nhiều người dùng trên thế giới biết đến và sử dụng ứng dụng của bạn, bạn còn có khả năng kiếm thêm tiền nhờ vào việc tận dụng hiển thị quảng cáo trong ứng dụng, hoặc xây dựng các chức năng có trả phí, hoặc xây dựng các ứng dụng cần người dùng phải mua mới dùng được. Thật tuyệt đúng không nào.

Chưa hết, khi bạn đã quyết định đưa ứng dụng lên Google Play thì chỉ mất vài giờ để ứng dụng của bạn đến với người dùng trên toàn thế giới (con số này so với Apple App Store là vài ngày, thậm chí có khi đến cả tuần). Việc đưa các bản cập nhật hay sửa lỗi lên Google Play chính vì vậy cũng khá là nhanh chóng và dễ thở hơn nhiều.

Môi Trường Phát Triển Phần Mềm

Chúng ta đã hiểu về Android qua tìm hiểu các ý trên đây rồi. Nhưng bài hôm nay sẽ không dừng lại sớm vậy, hãy cùng xem thêm chút nữa về cái gọi là Môi trường phát triển phần mềm là gì nhé.

Môi trường phát triển phẩm mềm là một môi trường mà ở đó nhà Phát Triển Phần Mềm có được những công cụ cần thiết nhất để viết ra một ứng dụng hoàn chỉnh. Vì bài học liên quan đến Android, do đó chúng ta sẽ tập trung vào tìm hiểu Môi trường phát triển phần mềm Android (Android Development Environment) sẽ bao gồm những công cụ cần thiết gì tiếp theo đây.

Hệ Điều Hành (Operating System)

Như mình có nói trên kia, ứng dụng Android có thể được lập trình trên hầu hết các nền tảng hệ điều hành phổ biến nhất hiện nay như Windows, Mac, Linux hay thậm chí Chrome OS.

Operating System
Dù bạn có đang dùng hệ điều hành nào thì cũng đừng quá lo lắng

 

Java Development Kit (JDK)

Bộ Công Cụ Phát Triển Cho Java, chắc chắn rồi, vì ứng dụng Android được viết dựa trên ngôn ngữ Java mà, do đó chúng ta cần phải có bộ JDK này để các công cụ khác có thể dùng nó để biên dịch ra mã Java, rồi từ Java sẽ biên dịch tiếp thành các mã máy. Ngay cả như nếu bạn dùng Kotlin để lập trình Android, thì bạn vẫn cần đến bộ JDK này, vì Kotlin vẫn tận dụng máy ảo JVM bên trong JDK mà thôi.

Java JDK
JDK

 

Android Software Development Kit (Android SDK)

Tương tự như JDK, Android SDK là Bộ Công Cụ Phát Triển Cho Android. SDK này sẽ cung cấp cho chúng ta một bộ các thư viện và công cụ cần thiết để chúng ta có thể build, kiểm tra và debug cho các ứng dụng Android mà chúng ta sắp lập trình đây.

Android SDK
Android SDK

 

Android Studio

Cuối cùng chúng ta phải cần công cụ này, như đã nói ở trên, đây là công cụ mà chúng ta sẽ tương tác trực tiếp và dài lâu. Android Studio cung cấp cho chúng ta một giao diện trực quan để chúng ta có thể viết code, chỉnh sửa, biên dịch, debug, quản lý bộ nhớ,… tất cả mọi thứ cần thiết để chúng ta có thể tạo nên một phần mềm trên đó.

Android Studio
Android Studio

 

Kết Luận

Chúng ta vừa có cái nhìn sơ lược nhất về việc xây dựng ứng dụng trên hệ điều hành Android này. Hi vọng các thông tin căn bản này giúp tạo cho bạn một kiến thức và một động lực nhất định để xây dựng ước mơ lập trình trên nền tảng di động của chính bạn.

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

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Unity Developer là gì? Cần học gì để trở thành Unity Developer

Unity Developer là gì? Cần học gì để trở thành Unity Developer

Unity là một công cụ phát triển game đa nền tảng được phát triển bởi Unity Technologies từ những năm 2005, hiện nay nó đã dần trở thành một game engine phổ biến nhất trên thế giới. Unity Developer – lập trình viên Unity đang là 1 lựa chọn tiềm năng của các bạn có đam mê với game và muốn sử dụng kĩ năng lập trình của mình để tạo ra được những ứng dụng game sáng tạo và hấp dẫn. Bài viết hôm nay mình sẽ cùng các bạn tìm hiểu sâu hơn về ngành nghề này, và cần học những gì để có thể trở thành 1 lập trình viên Unity nhé.

Unity Engine là gì?

Unity Engine là gì?

Unity Engine là 1 cross-flatform game engine sử dụng để phát triển game trên nền tảng PC, consoles, websites và các thiết bị di động.

Hầu hết các nền tảng chơi game phổ biến hiện nay đều được Unity hỗ trợ, bao gồm: mobile (Android, iOS, WindowPhone), PC (Window, MacOS), Consoles (Nintendo, PlayStation), Browsers (sử dụng WebGL), … Không chỉ vậy, Unity cũng sẵn có các tính năng công nghệ thực tế ảo VR hay thực tế tăng cường AR có thể chạy tốt trên các thiết bị như Google Cardboard, GearVR, Hololens, Oculus, … 

Về mặt đồ họa, Unity hỗ trợ cả 2D và 3D, có thể sử dụng các đồ họa APIs phổ biến như Direct3D, OpenGL, WebGL, … Unity cung cấp cho các lập trình viên những công cụ dựng hình, kết xuất đồ họa, xử lý về cả âm thanh, hình ảnh, đồng thời có sẵn công cụ vật lý (tính toán và phát hiện va chạm).

  Game Developer là gì? Lộ trình trở thành Game Developer

  Top 5 Ngôn Ngữ Lập Trình Game Không Thể Bỏ Qua 2024

Unity Developer là gì?

Unity Developer là những lập trình viên sử dụng nền tảng Unity để phát triển, xây dựng những dự án game theo yêu cầu của khách hàng. Những dự án Unity phổ biến như: trò chơi (game), phim ảnh, hoạt hình, ô tô, kiến trúc, quảng cáo, xây dựng, …

Cũng giống như các lập trình viên ở mảng khác, công việc của 1 Unity Developer bao gồm việc viết code để thực hiện chương trình với ngôn ngữ mà game engine này sử dụng phổ biến là C# – ngôn ngữ kịch bản hướng đối tượng. Tuy nhiên, Unity Developer không chỉ viết code, làm game sẽ có những công việc đặc thù khác với lập trình khác như dưới đây:

  • Lên ý tưởng và triển khai gameplay trong môi trường phát triển:

Đây là yêu cầu bắt buộc mà Unity Developer cần phải nắm được. Không như các ứng dụng thì game có những logic, kịch bản, gameplay hoạt động độc lập theo logic nhất định là thường xuyên suốt quá trình chơi; vì thế lập trình viên cần nắm được các logic này, đồng thời còn phát huy sự sáng tạo trong quá trình phát triển để tạo ra sản phẩm thu hút được người dùng cuối.

Ứng tuyển ngay các vị trí tuyển dụng Unity Developer trên TopDev

  • Sử dụng thành thạo Unity Editor:

Unity cung cấp cho chúng ta Unity Editor và bạn phải làm việc chính trên công cụ này. Nó giúp bạn tạo ra các Scenes (màn chơi), import và sử dụng các assets (2D, 3D resources, sound, animation, …), tạo ra các đối tượng (GameObject), gắn kịch bản (Scripts) cho đối tượng, … Có thể nói tất cả các công việc của bạn đều thực hiện cùng Unity Editor, vì vậy việc học và sử dụng nó là điều tất yếu mà bạn cần phải làm để tạo ra game của mình.

  • Làm việc với Unity Asset Store:

Đây là 1 nơi cung cấp cho bạn vô số các resources hữu ích mà có thể sử dụng trong dự án. Bạn có thể tìm được từ các mô hình (model) nhân vật, các hiệu ứng chuyển động (animation) hay cả những đoạn code (script) có sẵn và chính thống đến từ Unity và các nhà phát triển khác phát hành. Ngoài ra, bạn cũng cần tài khoản Unity ID cho việc phát hành game, đồng thời có thể tích hợp các tính năng như quảng cáo, kiếm tiền, phân tích số liệu thông qua các service mà Unity cung cấp.

  • Phát hành, quảng cáo game:

Đối với game, việc thu hút được số lượng người chơi ngay từ ban đầu lúc phát hành là điều vô cùng quan trọng quyết định đến thành công của sản phẩm. Lập trình viên làm game nói chung hay Unity nói riêng để hỗ trợ phát hành game cũng tham gia tích cực vào giai đoạn này với việc kiểm thử (chơi thử), phát hành các bản demo, dùng thử, tạo các quảng cáo cho game nhằm thu hút người dùng,…

Tham khảo việc làm Game Developer hấp dẫn trên TopDev

Lộ trình học để trở thành Unity Developer

Lộ trình học để trở thành Unity Developer

Trước hết nếu muốn làm Unity, theo mình thì các bạn cần có 1 sự đam mê nhất định về game và thích chơi game. Mặc dù Unity có thể làm nhiều thứ khác ngoài game, tuy vậy logic và tư duy lập trình Unity khá là khác so với việc làm Web, làm ứng dụng đơn thuần. Đam mê chơi và tạo ra game bằng chính những dòng code của mình lúc nào cũng tạo ra động lực lớn hơn đúng không nào.

Để lập trình thì bước đầu tiên luôn là học ngôn ngữ lập trình cùng các kiến thức cơ bản, với Unity thì bạn cần học C#, từ cách khai báo biến, cách viết các câu lệnh điều kiện, vòng lặp. Kiến thức và tư duy về thuật toán, giải thuật cũng khá cần thiết trong game, vì vậy hãy đầu tư tìm hiểu và học về nó để sẵn sàng có thể giải quyết các bài toán gặp phải.

Bước tiếp theo, hãy làm quen với Unity Editor, hàng năm đều có phiên bản mới được cập nhật với những cải thiện và tính năng mới được Unity thêm vào.

Unity Editor

Cái thành phần cơ bản nhất trong Unity Editor mà bạn cần nắm vững:

  • Scene View: màn hình thế giới game, nơi chứa tất cả những gì trong game của bạn tạo ra
  • Game View: màn hình game, hiển thị những gì mà người dùng nhìn thấy khi chơi game.
  • Hierarchy: hiển thị danh sách các gameObjects mà bạn tạo ra theo phân cấp (dạng cây)
  • Inspector: hiển thị các thông số, thuộc tính của gameObject như tọa độ, hình ảnh, các script được gắn vào
  • Project: hiển thị các assets cùng các script mà bạn sử dụng

Có rất nhiều công cụ, tính năng được Unity Editor cung cấp cho bạn. Hãy cố gắng tìm hiểu nhiều nhất có thể.

Sau khi làm quen được với Unity Editor, hãy tập trung tìm hiểu về phần xử lý hình ảnh, âm thanh, animation,… gồm cả 2D và 3D trong Unity. Đây là bước giúp bạn có thể sử dụng resources và tạo ra các gameobject, xây dựng nhân vật, hiệu ứng cho game của mình. Trong Unity, bạn cũng có những component cơ bản như Button, Text, Image, Input, … tương tự trên Web; tuy vậy thì thứ bạn thường xuyên làm việc cùng đấy là Canvas, Materials, 3D Objects, Camera, Light, Particale, Terrains, … và nó cũng là đặc thù của việc làm game.

Bên cạnh đó điều mới mẻ và cũng là khó nhất trong Unity là làm việc với engine vật lý (Physic): Rigidbody, Collider (Box, Capsule, Mesh, Sphere, Wheel,…), Mass, Gravity, … Xử lý vật lý luôn là phần cốt lõi trong việc hình thành ra game, tương tác giữa các nhân vật (characters), giữa nhân vật với chướng ngại vật (obstacle) hay với background xung quanh có trọng lực (gravity) sẽ giúp game giống với thực tế và tạo sự hấp dẫn cho nó. Đây là 1 kiến thức khó, vì thế để làm được Unity, bạn cần nắm được nó thì mới có thể thực sự lập trình được cùng engine này.

Unity Developer

Đến bước này, các bạn đã có thể nắm được cơ bản kiến thức về Unity và tự tin làm việc cùng nó trong các dự án game của mình hay của khách hàng. Để phát triển sâu, hãy tìm hướng đi bằng cách chọn những thể loại game phù hợp, tìm hiểu sâu về kiến thức mảng mà mình tìm hiểu. Có 1 số mảng game mà Unity được xem là thế mạnh và bạn có thể lựa chọn:

  • Game Casual: thể loại game phổ thông, dễ chơi thường chạy trên Web hoặc mobile, nổi bật gần đây là tựa game Untitled Goose phát hành bởi House House
  • Online MultiPlayer: thể loại game online nhiều người chơi, chạy trên nhiều platform khác nhau từ mobile, web đến PC, consoles. Đại diện ưu tú của dòng game này được phát triển bằng Unity là Amoung Us
  • VR/AR Game: dòng game thực tế ảo / thực tế tăng cường là 1 thế mạnh của Unity. Nổi bật nhất là Pokemon Go của Niantic
  • Action/RPG: dòng game hành động nhập vai, đây được xem là dòng game đỉnh cao nhất của các thể loại game với đồ họa, logic, xử lý vô cùng phức tạp. Unity cũng đóng góp những đại diện cho dòng game này nổi bật như Escape from Tarkov

Ngoài ra còn vô số dòng game khác mà các bạn nếu đam mê hãy tìm hiểu thêm nhé.

Kết bài

Nói về Unity thì chỉ trong khuôn khổ một bài viết là không hề đủ, có rất nhiều kiến thức thú vị và hấp dẫn về game engine cũng như cộng đồng lập trình viên Unity. Unity Developer đã, đang và sẽ là 1 nghề hấp dẫn với mức đãi ngộ tốt trong tương lai sắp tới. Hy vọng bài viết đã mang lại cho bạn những thông tin hữu ích về ngành lập trình game bằng Unity. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

Tin tuyển dụng IT mới nhất trên TopDev, tìm việc ngay!

Triển khai RPC đơn giản trong java

Triển khai RPC đơn giản trong java

Bài viết được sự cho phép của tác giả Trần Văn Dem

Gần đây mọi người hay so sánh REST với RPC nên chọn công nghệ nào để truyền tải dữ liệu qua các server. Với REST chúng ta có thể tìm thấy rất nhiều bài hướng dẫn trên internet. Các bài về tìm hiểu cơ chế chạy, cách truyền dữ liệu thông qua body,… Những bài viết đó khiến chúng ta quá quen thuộc với REST và nó không còn là hộp đen nữa. Trái ngược với điều trên thì RPC lại không nhiều bài viết hướng dẫn mọi người implement, mọi người thường tìm thấy cách sử dụng của một số framework như gRPC, thrift,… và các bài so sánh hiệu năng viết RPC nhanh hơn REST và thích hợp với truyền tải thông tin liên server hơn REST. Tại đây tôi có 1 implement nhỏ đơn giản về RPC hy vọng thông qua bài này mọi người sẽ không còn cảm thấy lạ với loại hình này và có thể giải thích được tại sao nó lại thích hợp giữa các server.

Cũng như các hệ thống client-server khác để giao tiếp giữa client và server chúng ta cần một network protocol. Các framework về RPC nổi tiếng họ dùng tầng transport sau:

  • gRPC sử dụng http2 truyền tải dũ liệu dữa client – server. Với Java thì họ dùng netty để dựng server http2. Vì Netty là một Non Blocking IO Framework
  • thrift sử dụng http1.1 truyền tải dữ liệu giữa client-server

Trong lúc đi làm tôi thường thấy mọi người hay so sánh giữa http và rpc. Hai khái niệm này không thể so sánh với nhau được vì nó thuộc 2 phạm trù khác nhau. Hy vọng sau bài viết này các bạn sẽ tự mình phân biệt được.

Trong bài demo này tôi cũng sẽ sử dụng Netty để xây dựng tầng transport dữ liệu giữa client server cụ thể sẽ dùng Non Blocking Socket của Netty

  Giới thiệu về GraphQL. Cách giải quyết những hạn chế của RESTful API

  System Design Cơ Bản: REST, GraphQL, gRPC và Webhooks

Bạn dễ dàng tìm được code hướng dẫn với Netty trên trang chủ. Với server ta sẽ mở 1 socket :

public class NettyTransport {
//..........
    public void server() throws Exception {
        this.group = new NioEventLoopGroup();
        bootstrap = new ServerBootstrap();
        bootstrap.group(group)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.TCP_NODELAY,true)
                .handler(new LoggingHandler(LogLevel.INFO))
                .childHandler(new ChannelInitializer() {
                    protected void initChannel(Channel channel) throws Exception {
                        channel.pipeline().addLast(new RpcHandle(listener));
                    }
                });
        ChannelFuture f = bootstrap.bind(port).sync(); // (5)
    }
}

Với client ta sẽ kết nối với socket :

    public void connectNetty() {
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            Bootstrap b = new Bootstrap(); // (1)
            b.group(workerGroup); // (2)
            b.channel(NioSocketChannel.class); // (3)
            b.option(ChannelOption.SO_KEEPALIVE, true); // (4)
            b.option(ChannelOption.TCP_NODELAY,true);
            b.handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(transport = new ClientHandle(SimpleRpcClient.this));
                }
            });
            // Start the client.
            ChannelFuture f = b.connect(host, port).sync(); // (5)
            // Wait until the connection is closed.
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  • Với REST dữ liệu thường sẽ truyền tải giữa client server sẽ nằm trong body của request và được chuyển sang dưới dạng json. Với dạng Json sẽ dễ dàng đọc hiểu với mọi người nhưng với máy tính thì việc đó không dễ dàng. Nó kiến việc Deserialize và Serialize dữ liệu chậm hơn.
  • Với RPC dữ liệu truyền tải giữa client và server thì thường sẽ được serialize thành array byte việc này làm tiết kiệm được tài nguyên thực hiện serialize và deserialize
  • Hẹn các bạn ở bài viết sau sẽ giải thích lý do vì sao dạng byte array lại nhanh hơn so với json. Các bạn có thể tham khảo một bài viết trên medium
  • Với gRPC họ sử dụng protobuf để serialize dữ liệu thành byte array và ngược lại. Apache thrift cũng sẽ có một bộ serialize và deserialize riêng để biến dữ liệu truyền tải giữa server và client
  • Tại bài viết này tôi sẽ dùng thư viện kryo một thư viện mạnh mẽ với java về serialize và deserialize dữ liệu. Việc tự xây cho mình một cách serialize dữ liệu cũng hoàn toàn có thể làm được nhưng tôi sẽ để một bài viết khác.

Qua github của Kryo ta sử dụng thư viện này đơn giản nhất như sau:

import com.esotericsoftware.kryo.kryo5.Kryo;
import com.esotericsoftware.kryo.kryo5.io.ByteBufferInput;
import com.esotericsoftware.kryo.kryo5.io.ByteBufferOutput;
import com.esotericsoftware.kryo.kryo5.io.Input;
import com.esotericsoftware.kryo.kryo5.io.Output;

public class RPCSerialize {
    public static RPCSerialize serialize = new RPCSerialize();

    private final Kryo kryo;

    public RPCSerialize() {
        this.kryo = new Kryo();
        kryo.register(RPCRequest.class);
        kryo.register(RPCResponse.class);
        kryo.register(Object[].class);
        kryo.register(User.class);
    }

    public <T> T deSerialize(byte[] arr, Class<T> t) {
        Input input = new ByteBufferInput(arr);
        return this.kryo.readObject(input, t);
    }

    public <T> byte[] serialize(T t) {
        Output output = new ByteBufferOutput(1024);
        kryo.writeObject(output, t);
        return output.toBytes();
    }
}

Ta chỉ cần đăng ký các object cần giải serialize và deserialize với Kryo sau đó dựa vào reflection thư viện có thể serialize, deserialize dữ liệu.

Tại bài này chúng ta sẽ implement một service đơn giản sau :

import blog.rpc.support.User;

public interface SimpleService {

    int add(int a, int b);

    User getUser();

}
import blog.rpc.service.SimpleService;
import blog.rpc.support.User;

public class ServerImpl implements SimpleService {
    @Override
    public int add(int a, int b) {
        return a+b;
    }

    @Override
    public User getUser() {
        return new User("demtv");
    }
}

Một RPC server cần phải lưu được lại các method của các service của mình để khi nhận được request chúng sẽ thực hiện gọi các method này theo cơ chế RPC. Tôi sẽ sử dụng một Map để lưu trữ thông tin này và sử dụng java reflection để gọi method.

import blog.rpc.listener.RpcListener;
import blog.rpc.service.SimpleService;
import blog.rpc.service.impl.ServerImpl;
import blog.rpc.support.*;
import blog.rpc.tranport.imp.NettyTransport;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class SimpleRpcServer implements RpcListener<ByteBuf> {

    private Map<Integer, XMethod> methodService;

    private RPCSerialize serialize = RPCSerialize.serialize;

    public SimpleRpcServer(int port) {
        new NettyTransport(this, port);
        this.methodService = new HashMap<>();
    }

    public void addHandle(Object target) {
        Method[] methods = target.getClass().getDeclaredMethods();
        for (Method method : methods) {
            XMethod xMethod = new XMethod(method, target);
            methodService.put(xMethod.getSignature(), xMethod);
        }
    }

    public XFuture<ByteBuf> onMessage(ByteBuf buf) {
        byte[] bytes;
        int length = buf.readableBytes();
        if (buf.hasArray()) {
            bytes = buf.array();
        } else {
            bytes = new byte[length];
            buf.getBytes(buf.readerIndex(), bytes);
        }

        RPCRequest request = serialize.deSerialize(bytes, RPCRequest.class);
        try {
            Object result = this.methodService.get(request.getMethod()).invoke(request.getArgs());
            RPCResponse response = new RPCResponse(request.getId(), result);
            XFuture<ByteBuf> future = new XFuture<>();
            byte[]x = serialize.serialize(response);
            future.setResult(Unpooled.copiedBuffer(x));
            return future;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

Trong code sẽ sử dụng một số Class support sau:

  • IdGenerator chịu trách nhiệm tạo id cho request và response. Vì netty là Non Blocking IO nên cần thiết có id để đánh dấu response này được phản hồi cho request nào.
  • RPCRequest là object sẽ được truyền từ client lên server
  • RPCResponse là object sẽ được truyên từ server lên client
  • XFuture một custom của class Future nhằm đợi kết quả được gửi về server.
  • XMethod tạo ra signature để đánh dấu method và thực hiện invoke method.

    Sau khi implement server, chúng ta thực hiện implement clientClient khi implement cần gửi lên server đúng method và param thực hiện method. Ta Override lại các method interface SimpleService đơn giản như sau để gửi lên server và nhận lại kết quả.

    @Override
    public int add(int a, int b) {
        int rs = Integer.MAX_VALUE;
        try {
            RPCRequest request = new RPCRequest();
            request.setId(idGenerator.nextId());
            Method method = this.getClass().getMethod("add", int.class, int.class);
            request.setMethod(XMethod.signature(method));
            request.setArgs(new Object[]{a, b});
            byte[] x = serialize.serialize(request);
            transport.sendMsg(Unpooled.copiedBuffer(x));
            XFuture<Integer> future = new XFuture<>();
            futures.put(request.getId(), future);
            rs = future.get(100, TimeUnit.SECONDS);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs;
    }

    @Override
    public User getUser() {
        try {
            RPCRequest request = new RPCRequest();
            request.setId(idGenerator.nextId());
            Method method = this.getClass().getMethod("getUser");
            request.setMethod(XMethod.signature(method));
            request.setArgs(null);
            byte[] x = serialize.serialize(request);
            transport.sendMsg(Unpooled.copiedBuffer(x));
            XFuture<User> future = new XFuture<>();
            futures.put(request.getId(), future);
            return future.get(100, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  • RPC là một dạng giao tiếp giữa client và server thông tin trao đổi gồm có: method,param của method và kết quả. Nó thường được sử dụng hơn so với REST để truyền tải dữ liệu giữa client và server vì có thể dùng được nhiều loại transport khác nhau. Sử dụng Serialize dữ liệu hiệu quả hơn so với REST
  • RPC server cần phải có cơ chế lưu lại cái method và gọi đúng method khi nhận được request.
  • RPC client cần phải gửi lên method và param và đợi kết quả trả về từ server

Hy vọng mọi người cũng có thể hiểu hơn RPC là gì nhưng khi sử dụng thì mọi người nên sử dụng framework cho nó nhàn :)).

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

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

Đừng bỏ lỡ việc làm IT mọi cấp độ tại TopDev

Giới thiệu về Mono-Repo

Giới thiệu về Mono-Repo

Bài viết được sự cho phép của tác giả Phạm Minh Khoa

Trong các hệ thống kiểm soát sửa đổi (Revision Control System), monorepo là một chiến lược phát triển phần mềm trong đó mã cho nhiều dự án được lưu trữ trong cùng một kho. Tính đến năm 2017, các  hình thức khác nhau của thực hành kỹ thuật phần mềm này đã được hơn hai  thập kỷ, nhưng khái niệm chung mới chỉ được đặt tên gần đây.

THEO WIKIPEDIA

Mono trong tiếng Hy Lạp là một, cô đơn, đơn lẻ và repo ở đây là repository (trong tiếng anh là kho chứa). Trường hợp ở đây là các repository trong các hệ thống kiểm soát phiên bản (Version Control System) như Git hay SVN.

Mono-repo là repository đơn lẻ mà trong đó các module con nằm gói gọn trong 1 repo. Ngoài ra, bên cạnh mono-repo thì còn có Multi-repo (nhiều repository) và Monolith (nguyên khối).

Mỗi kiến trúc Microservice trên đều đem lại một lợi ích nhất định. Với Monolith thì đây là kiến trúc căn nguyên và thường được sử dụng để kiến trúc các mô hình đúng nghĩa “nguyên khối” là không có sự phân chia module. Hiểu nôm na là mã nguồn dành cho giao diện người dùng (front-end truy vấn, truy cập vào database (back-end) sẽ nằm chung một repository.

Song các kiến trúc như Multi-repo và Mono-repo được tái kiến trúc từ Monolith để cách thức lưu trữ và quản lý mã nguồn trở nên “dễ thở” hơn.

  Messege Queue - Bộ phận không thể thiếu trong các hệ thống lớn và Microservice Architecture

Monolith Multirepo Monorepo

Không phải mỗi ứng dụng nào cũng được phát triển dưới dạng microservices. Tuy nhiên, dù có phải tái cấu trúc mã nguồn từ một khối nguyên khối hay không, chúng ta đều sẽ phải lựa chọn cách thức lưu trữ và quản lý mã nguồn theo kiểu multiple repositories (multirepo) hay mono repositories (monorepo). Sơ lược của hai kiểu cách thức lưu trữ và quản lý này như sau:

  • Monorepo là kiểu cấu trúc project trong đó tất cả module (hoặc project con) đều nằm trong cùng 1 git repository.
  • Multirepo, ngược lại, là kiểu cấu trúc project trong đó mỗi module (hoặc project con) chứa ở những git repository riêng lẻ.

Tuyển dụng lập trình viên Frontend lương cao tại đây!

Ưu điểm của Monorepo

  • Tổ chức liền mạch: Với mono repo, các dự án có thể được tổ chức và nhóm lại với nhau theo bất kỳ cách nào bạn thấy là nhất quán về mặt logic nhất. Sử dụng một repo duy nhất cũng làm giảm chi phí quản lý các phần dependencies.
  • Cải thiện văn hóa làm việc chung giữa các nhóm: Với việc áp dụng mono repo, mọi cá nhân trong tổ chức đều nhận thức được các mục tiêu của ứng dụng và điều này làm cho cả tổ chức trở thành một nhóm thống nhất và do đó có thể đóng góp cụ thể hơn cho các mục tiêu và mục tiêu của tổ chức.
  • Phối hợp tốt hơn giữa các nhà phát triển: Các nhà phát triển có thể dễ dàng chạy toàn bộ nền tảng trên máy của họ và điều này giúp họ hiểu tất cả các dịch vụ và cách chúng làm việc cùng nhau. Điều này đã khiến các nhà phát triển tìm thấy nhiều lỗi cục bộ hơn trước khi gửi một pull request.
  • Tái cấu trúc dễ dàng: Bất kỳ lúc nào chúng ta muốn đổi tên một cái gì đó, việc tái cấu trúc trở nên vô cùng dễ dàng. Việc tái cấu trúc cũng dễ dàng hơn vì mọi thứ đều gọn gàng ở một nơi và dễ hiểu hơn.

  Kiến trúc một khối (Monolithic)

Monorepos không chỉ duy trì được hầu hết các ưu điểm khi triển khai dưới dạng microservices mà còn đơn giản hóa việc chia sẻ mã và tái cấu trúc dự án chéo, chúng giảm đáng kể chi phí tạo libs, microservices và microfrontends. Vì vậy, việc áp dụng monorepo thường cho phép triển khai linh hoạt hơn.

Ưu điểm của Monorepo

Các tools sử dụng để triển khai Monorepo

  1. Yarn Workspaces: https://classic.yarnpkg.com/en/docs/workspaces/
  2. Bit: https://bit.dev/
  3. NX: https://nx.dev/
  4. Rush: https://rushjs.io/
  5. Lerna: https://lerna.js.org/
  6. Bazel Build System (Google): https://bazel.build/
  7. Buck: https://buck.build/
  8. Pants Build System (Twitter): https://github.com/pantsbuild/pants
  9. Please Build System: https://please.build/
  10. Oao: https://github.com/guigrpa/oao
  11. Bolt: https://github.com/boltpkg/bolt

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

Xem thêm:

Xem thêm các vị trí it job hấp dẫn trên TopDev

Hướng dẫn Java Design Pattern – Flyweight

Hướng dẫn Java Design Pattern – Flyweight

Bài viết được sự cho phép của tác giả Giang Phan

Trong một số tình huống trong phát triển phần mềm, chúng ta có thể cải thiện hiệu suất của ứng dụng với việc sử dụng Cache. Hãy tưởng tượng rất nhiều đối tượng được tạo ra và lãng phí bộ nhớ. Mô hình Flyweight được tạo ra để tránh vấn đề này và tối ưu hóa hiệu suất.

Flyweight Pattern là gì?

Use sharing to support large numbers of fine-grained objects efficiently.

Flyweight Pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Nó cho phép tái sử dụng đối tượng tương tự đã tồn tại bằng cách lưu trữ chúng hoặc tạo đối tượng mới khi không tìm thấy đối tượng phù hợp.

Flyweight Pattern được sử dụng khi chúng ta cần tạo một số lượng lớn các đối tượng của 1 lớp nào đó. Do mỗi đối tượng đều đòi hỏi chiếm giữ một khoảng không gian bộ nhớ, nên với một số lượng lớn đối tượng được tạo ra có thể gây nên vấn đề nghiêm trọng đặc biệt đối với các thiết bị có dung lượng nhớ thấp. Flyweight Pattern có thể được áp dụng để giảm tải cho bộ nhớ thông qua cách chia sẻ các đối tượng. Vì vậy performance của hệ thống được tối ưu.

Flyweight object là immutable, nghĩa là không thể thay đổi khi nó đã được khởi tạo.

  Hướng dẫn Java Design Pattern – Proxy

  Bridge Pattern trong Java – Code ví dụ Composite Pattern

Hai trạng thái của Flyweight Object

Trạng thái của flyweight object là một phần quan trọng trong việc thiết kế Flyweight Pattern. Mục tiêu chính của Flyweight Pattern là giảm bộ nhớ bằng cách chia sẽ các đối tượng. Điều này có thể đạt được bằng cách tách các thuộc tính của đối tượng thành hai trạng thái: độc lập và phụ thuộc. Hay còn gọi là Intrinsic (trạng thái nội tại) và Extrinsic (trạng thái bên ngoài).

  • Intrinsic State (trạng thái nội tại) : Trạng thái này chứa dữ liệu không thể thay đổi (unchangeable) và không phụ thuộc (independent) vào ngữ cảnh (context) của đối tượng Flyweight . Những dữ liệu đó có thể được lưu trữ vĩnh viễn bên trong đối tượng Flyweight. Vì vậy mà Flyweight object có thể chia sẻ. Dữ liệu nội tại là phi trạng thái (stateless) và thường không thay đổi (unchanged). Tính năng này cho phép khả năng tái tạo các thuộc tính đối tượng Flyweight giữa các đối tượng tương tự khác. Điều quan trọng cần lưu ý là các đối tượng Flyweight chỉ nên nhận trạng thái bên trong của chúng thông qua các tham số của hàm tạo và không cung cấp các phương thức setter hay các biến public.
  • Extrinsic State (trạng thái bên ngoài) : Trạng thái bên ngoài thể hiện tính chất phụ thuộc ngữ cảnh của đối tượng flyweight. Trạng thái này chứa các thuộc tính và dữ liệu được áp dụng hoặc được tính toán trong thời gian thực thi (runtime). Do đó, những dữ liệu đó không được lưu trữ trong bộ nhớ. Vì trạng thái bên ngoài là phụ thuộc ngữ cảnh và có thể thay đổi nên các đối tượng đó không thể được chia sẻ. Do đó, client chịu trách nhiệm truyền dữ liệu liên quan đến trạng thái bên ngoài cho đối tượng flyweight khi cần thiết, có thể thông qua các tham số (argument).

Tóm lại, tốt nhất là xem xét cách mỗi dữ liệu hoạt động bên trong đối tượng khi tạo đối tượng flyweight. Nghĩa là thành phần nào không được thay đổi, cần lưu trữ, thành phần nào không được thay đổi, không cần lưu trữ. Điều này giúp cho chúng ta tiết kiệm được bộ nhớ và thực thi được hiệu quả.

Tham khảo việc làm Fresher Java mới nhất trên TopDev

Cài đặt Flyweight Pattern như thế nào?

Các thành phần trong mẫu thiết kế Flyweight:

  • Flyweight : là một interface/ abstract class, định nghĩa các các thành phần của một đối tượng.
  • ConcreteFlyweight : triển khai các phương thức đã được định nghĩa trong Flyweight. Việc triển khai này phải thực hiện các khả năng của trạng thái nội tại. Đó là dữ liệu phải không thể thay đổi (unchangeable) và có thể chia sẻ (shareable). Các đối tượng là phi trạng thái (stateless) trong triển khai này. Vì vậy, đối tượng ConcreteFlyweight giống nhau có thể được sử dụng trong các ngữ cảnh khác nhau.
  • UnsharedFlyweight : mặc dù mẫu thiết kế Flyweight cho phép chia sẻ thông tin, nhưng có thể tạo ra các thể hiện không được chia sẻ (not shared). Trong những trường hợp này, thông tin của các đối tượng có thể là stateful.
  • FlyweightFactory (Cache): lớp này có thể là một Factory Pattern được sử dụng để giữ tham chiếu đến đối tượng Flyweight đã được tạo ra. Nó cung cấp một phương thức để truy cập đối tượng Flyweight được chia sẽ. FlyweightFactory bao gồm một Pool (có thể là HashMap, không cho phép bên ngoài truy cập vào) để lưu trữ đối tượng Flyweight trong bộ nhớ. Nó sẽ trả về đối tượng Flyweight đã tồn tại khi được yêu cầu từ Client hoặc tạo mới nếu không tồn tại.
  • Client : sử dụng FlyweightFactory để khởi tạo đối tượng Flyweight.

Ứng tuyển các vị trí việc làm Java lương cao trên TopDev

Ví dụ:

Một ứng dụng game bao gồm rất nhiều Solider (lính), được chia thành các loại: Yuri, Spy, Doctor, … Mỗi Solider sẽ có id và cấp độ khác nhau. Thời gian để tạo một loại Solider là 3 giây.

Chương trình chúng ta được cài đặt với Flyweigth Pattern như sau:

  • ISoldier : đóng vai trò là một Flyweight. Định nghĩa phương thức promote với tham số là context, giá trị tham số này được quyết định bởi Client.
  • Context : đóng vai trò là Extrinsic State. Tùy vào ngữ cảnh khác nhau sẽ có giá trị khác nhau.
  • Soldier : đóng vai trò là ConcreteFlyweight. Triển khai các phương thức đã được định nghĩa trong Flyweight. Nó có một giá trị name (ứng với loại lính – Intrinsic State) không thay đổi, có thể chia sẻ được.
  • SoldierFactory : đóng vai trò là FlyweightFactory. Nó giữ một private Map để lưu giữ các loại soldier đã được tạo. Một phương thức createSoldier() để tạo soldier ứng với tên loại được truyền vào. Một phương thức getTotalOfSoldiers() để kiểm tra số lượng các loại soldier đã tạo.
  • GameApp : đóng vai trò là Client. Sử dụng SoldierFactory để tạo các Soldier.

ISoldier.java

package com.gpcoder.patterns.structural.flyweight;

/**
 * Flyweight
 */
public interface ISoldier {

    void promote(Context context);

}

Context.java

package com.gpcoder.patterns.structural.flyweight;

/**
 * Extrinsic State
 */
public class Context {

    private String id;
    private int star;

    public Context(String id, int star) {
        this.id = id;
        this.star = star;
    }

    public String getId() {
        return this.id;
    }

    public int getStar() {
        return this.star;
    }
}

Soldier.java

package com.gpcoder.patterns.structural.flyweight;

/**
 * Concrete Flyweight
 */
public class Soldier implements ISoldier {

    private final String name; // Intrinsic State

    public Soldier(String name) {
        this.name = name;
        System.out.println("Soldier is created! - " + name);
    }

    @Override
    public void promote(Context context) {
        System.out.println(name + " " + context.getId() + " promoted " + context.getStar());
    }
}

SoldierFactory.java

package com.gpcoder.patterns.structural.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * FlyweightFactory
 */
public class SoldierFactory {

    private static final Map<String, ISoldier> soldiers = new HashMap<>();

    private SoldierFactory() {
        throw new IllegalStateException();
    }

    public static synchronized ISoldier createSoldier(String name) {
        ISoldier soldier = soldiers.get(name);
        if (soldier == null) {
            waitingForCreateASoldier();
            soldier = new Soldier(name);
            soldiers.put(name, soldier);
        }
        return soldier;
    }

    public static synchronized int getTotalOfSoldiers() {
        return soldiers.size();
    }

    private static void waitingForCreateASoldier() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

GameApp.java

package com.gpcoder.patterns.structural.flyweight;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

/**
 * Client
 */
public class GameApp {

    private static List<ISoldier> soldiers = new ArrayList<>();

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        createSoldier(5, "Yuri", 1);
        createSoldier(5, "Spy", 1);
        createSoldier(3, "Spy", 3);
        createSoldier(2, "Yuri", 2);
        long endTime = System.currentTimeMillis();
        System.out.println("---");
        System.out.println("Total soldiers made : " + soldiers.size());
        System.out.println("Total time worked : " + Duration.ofMillis(endTime - startTime).getSeconds() + " seconds");
        System.out.println("Total type of soldiers made : " + SoldierFactory.getTotalOfSoldiers());
    }

    private static void createSoldier(int numberOfSoldier, String soldierName, int numberOfStar) {
        for (int i = 1; i <= numberOfSoldier; i++) {
            Context star = new Context("Soldier" + (soldiers.size() + 1), numberOfStar);
            ISoldier soldier = SoldierFactory.createSoldier(soldierName);
            soldier.promote(star);
            soldiers.add(soldier);
        }
    }
}

Output của chương trình trên như sau:

Soldier is created! - Yuri
Yuri Soldier1 promoted 1
Yuri Soldier2 promoted 1
Yuri Soldier3 promoted 1
Yuri Soldier4 promoted 1
Yuri Soldier5 promoted 1
Soldier is created! - Spy
Spy Soldier6 promoted 1
Spy Soldier7 promoted 1
Spy Soldier8 promoted 1
Spy Soldier9 promoted 1
Spy Soldier10 promoted 1
Spy Soldier11 promoted 3
Spy Soldier12 promoted 3
Spy Soldier13 promoted 3
Yuri Soldier14 promoted 2
Yuri Soldier15 promoted 2
---
Total soldiers made : 15
Total time worked : 6 seconds
Total type of soldiers made : 2

Như bạn thấy, chúng ta đã tạo ra 15 soldier chỉ với 6 giây (do chỉ tạo 2 lần ứng với 2 loại Yuri và Spy, mỗi loại mất 3 giây). Nếu không sử dụng Flyweight mà tạo từng soldier riêng lẻ, chúng ta sẽ mất đến 45 giây (do mỗi soldier mất 3 giây và có tất cả 15 soldier).

Lợi ích của Flyweight Pattern là gì?

  • Giảm số lượng đối tượng được tạo ra bằng cách chia sẻ đối tượng. Vì vậy, tiết kiệm bộ nhớ và các thiết bị lưu trữ cần thiết.
  • Cãi thiện khả năng cache dữ liệu vì thời gian đáp ứng nhanh.
  • Tăng performance.

Sử dụng Flyweight Pattern khi nào?

  • Khi có một số lớn các đối tượng được ứng dụng tạo ra một cách lặp đi lặp lại.
  • Khi việc tạo ra đối tượng đòi hỏi nhiều bộ nhớ và thời gian.
  • Khi muốn tái sử dụng đối tượng đã tồn tại thay vì phải tốn thời gian để tạo mới.
  • Khi nhóm đối tượng chứa nhiều đối tượng tương tự và hai đối tượng trong nhóm không khác nhau nhiều.

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

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

Xem thêm Việc làm IT hấp dẫn trên TopDev

5 yếu tố để trở thành một lập trình viên giỏi

5 yếu tố để trở thành một lập trình viên giỏi

Bài viết được sự cho phép của tác giả Võ Quang Huy

1. Có kiến thức cơ bản về lập trình

Kiến thức cơ bản về lập trình là một trong những yếu tố cần thiết để trở thành một lập trình viên giỏi. Để có được kiến thức cơ bản về lập trình, bạn cần phải tập trung vào các khía cạnh của ngôn ngữ lập trình, cách thức lập trình, hoạt động của các công cụ lập trình và các lý thuyết cơ bản.

Bắt đầu bằng cách học các khía cạnh cơ bản của ngôn ngữ lập trình. Bạn cần phải tìm hiểu các cấu trúc cơ bản, biến, hàm, tham số, dữ liệu, và các từ khóa của ngôn ngữ. Bạn cũng cần phải học cách dùng các cấu trúc điều khiển để tạo ra các lệnh điều hành và đảm bảo rằng các lệnh được thực hiện theo cách mong muốn.

Tiếp theo, bạn cần phải học cách thức lập trình. Điều này bao gồm việc hiểu cách làm việc của các quy trình, lời gọi hàm, các phần mềm để giải quyết vấn đề, và để thiết kế các chương trình phức tạp.

  Những cái “khó” khi mới học lập trình

  9 project nhỏ mà bạn có thể code để luyện tập kỹ năng lập trình

Khi bạn hiểu rõ các khía cạnh cơ bản của ngôn ngữ lập trình và cách thức lập trình, bạn cần phải hiểu cách hoạt động của các công cụ lập trình. Việc hiểu cách hoạt động của các công cụ sẽ giúp bạn làm việc nhanh hơn và hiểu rõ cách lập trình của hệ thống hơn.

Cuối cùng, bạn cần phải hiểu các lý thuyết cơ bản của lập trình. Lý thuyết lập trình giúp bạn hiểu rõ cách các chương trình làm việc, các quy trình lập trình, và cách thức sử dụng các công cụ lập trình.

2. Khám phá khả năng của công cụ lập trình

Khi học lập trình, một yếu tố quan trọng là khám phá khả năng của các công cụ lập trình. Khám phá các công cụ là một phần quan trọng trong quá trình học lập trình, bởi nó cung cấp cho bạn những công cụ cần thiết để tiến hành công việc. Các công cụ này bao gồm các ngôn ngữ lập trình, các phần mềm, công cụ thống kê, hệ thống hỗ trợ, mô hình hóa và thiết kế, các ứng dụng hỗ trợ công việc liên quan đến lập trình và các công cụ khác.

Khi sử dụng các công cụ lập trình, bạn cần phải hiểu rõ cách để sử dụng chúng một cách hiệu quả. Điều này có nghĩa là bạn cần phải có kiến thức về các công cụ lập trình, phân tích các yêu cầu, xây dựng các giải pháp và thực hiện các bước để sử dụng công cụ. Bạn cũng cần phải làm quen với các công cụ lập trình mới nhất để duy trì các kỹ năng lập trình của mình.

Bạn cũng cần phải đọc cẩn thận các tài liệu về các công cụ lập trình, cũng như các hướng dẫn sử dụng các công cụ. Nếu có thể, hãy thử sử dụng công cụ trên môi trường thực nghiệm để trải nghiệm cách thức sử dụng các công cụ trong thực tế. Học cách sử dụng các công cụ sẽ giúp bạn hiểu rõ hơn về lập trình và cũng sẽ giúp bạn trong quá trình thực hiện.

Tham khảo việc làm PHP lương cao trên TopDev

Top 5 công cụ lập trình phổ biến

3. Tự học các tính năng và công nghệ mới nhất.

Việc tự học các tính năng và công nghệ mới nhất là một trong những yếu tố quan trọng của việc học lập trình giỏi. Để làm được điều này, bạn cần phải thực hành nhiều và nắm bắt những thay đổi của công nghệ. Bạn cần phải tự học các tính năng và công nghệ mới nhất trong lập trình. Bạn có thể bắt đầu bằng cách tìm hiểu các công nghệ mới cũng như các sản phẩm lập trình. Bạn có thể tìm kiếm những nguồn thông tin đáng tin cậy và đọc nhiều nhất có thể. Bạn cũng nên tìm hiểu các ví dụ về tính năng và công nghệ mới để hiểu hơn về chúng.

Bạn cũng cần phải làm nhiều bài tập để thực hành những kiến thức đã học. Bạn có thể tạo ra những dự án nhỏ để làm quen với công nghệ mới. Tìm hiểu cách sử dụng các tính năng mới và công nghệ để tạo ra các dự án lớn hơn. Bạn cũng có thể tham gia những dự án cộng đồng để học hỏi thêm về các công nghệ và tính năng mới.

Bạn cũng nên tìm hiểu về các công cụ lập trình và cách sử dụng chúng để tối ưu công việc của mình. Hãy tự học cách sử dụng các công cụ, công nghệ và tính năng lập trình để có thể làm việc hiệu quả và tối ưu hóa thời gian của bạn.

Bạn cũng nên tìm những nhóm học tậpđối thoại với những người chuyên về lập trình. Điều này sẽ giúp bạn tạo ra một môi trường học tập có ích và hữu ích với những người cùng sở thích. Bạn cũng có thể thảo luận về các vấn đề về công nghệ và lập trình với nhau để có thể học hỏi nhiều hơn.

4. Làm nhiều bài tập để luyện tập.

Việc làm nhiều bài tập là yếu tố rất quan trọng để học lập trình giỏi. Việc làm nhiều bài tập giúp bạn củng cố lại các kiến thức đã học, và đồng thời giúp bạn học những kỹ năng thiết yếu cần thiết như làm việc với các dữ liệu, quản lý các biến, giải quyết vấn đề, v.v. Khi làm bài tập, hãy xem xét và phân tích những vấn đề mà bạn đang gặp phải, và cố gắng tìm ra cách giải quyết nó. Điều này sẽ giúp bạn phát triển kỹ năng tự học, tự động hóa việc giải quyết vấn đề, và cố gắng tìm ra các giải pháp tối ưu nhất.

Hãy thử làm nhiều bài tập khác nhau, và hãy tham gia các cuộc thi lập trình nhằm nâng cao khả năng của bạn. Việc tham gia các cuộc thi lập trình sẽ giúp bạn tăng cường kỹ năng lập trình của mình, và học được rất nhiều kiến thức về lập trình từ những người khác. Bên cạnh đó, việc đặt ra những câu hỏi và trả lời những câu hỏi này cũng sẽ giúp bạn học được nhiều hơn.

Cố gắng tập trung vào việc làm bài tập, và luôn đề cao việc sử dụng các công cụ và các công nghệ mới nhất để giúp bạn cải thiện kỹ năng lập trình của mình. Khi làm bài tập, hãy luôn luôn ghi chép lại các quá trình giải quyết vấn đề của bạn, để có thể tham khảo lại và tìm ra các giải pháp tốt hơn trong tương lai.

Trong tổng thể, việc làm nhiều bài tập là yếu tố thiết yếu để học lập trình giỏi. Việc làm bài tập sẽ giúp bạn đào sâu vào lập trình và luôn đề cao việc sử dụng công nghệ mới nhất.

5. Tham gia nhóm học tập và đối thoại với những người chuyên về lập trình.

Những người chuyên về lập trình luôn là một nguồn thông tin vô cùng có giá trị. Tham gia nhóm học tập cũng như đối thoại với những người này có thể giúp bạn cải thiện những kỹ năng lập trình của bạn rất nhanh. Những nhóm này cũng là nơi bạn có thể được giải đáp những thắc mắc về lập trình của bạn, họ sẽ cung cấp cho bạn những ý tưởng sáng tạo và làm cho bạn cảm thấy bản thân hứa hẹn hơn trong việc học tập và lập trình. Để học lập trình giỏi, những nhóm này cũng là nơi bạn được học thêm những kỹ năng lập trình cần thiết như là lập trình đồ họa, lập trình web, lập trình mạng, v.v. Điều này là rất hữu ích vì bạn sẽ được nhận được những góp ý và tham khảo từ những người có tay nghề và kinh nghiệm trong lĩnh vực này. Họ sẽ giúp bạn hiểu được những câu hỏi cơ bản của lập trình và cách tốt nhất để giải quyết các vấn đề. Ngoài ra, đối thoại với những người chuyên về lập trình cũng giúp bạn có được những ý tưởng sáng tạo trong lập trình và hiểu hơn về các công nghệ hiện đại. Vậy thì tham gia nhóm học tập và đối thoại với những người chuyên về lập trình là một trong những yếu tố quan trọng nhất để học lập trình giỏi.

Tổng kết:

Để trở thành một lập trình viên tốt, bạn cần có kiến thức cơ bản về lập trình, hiểu các tính năng và công nghệ mới nhất, khám phá khả năng của công cụ lập trình, luyện tập thực hành và tham gia nhóm học tập. Những yếu tố này sẽ giúp bạn có được những kiến thức và kỹ năng lập trình tốt hơn.

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

Bạn có thể xem thêm:

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

Frontend là gì? Những kỹ năng quan trọng Front-end Developer cần có

Frontend Developer là gì? Những kỹ năng quan trọng Frontend Developer cần có

Frontend là 1 phần của website mà ở đó người dùng có thể tương tác để sử dụng, nói cách khác thì tất cả những gì mà bạn có thể nhìn thấy trên website từ nội dung, font chữ, màu sắc, menu, thanh điều hướng, … đều là frontend, và là thứ mà Frontend Developer tạo ra. Trong bài viết này bạn sẽ biết được Frontend là gì? thế nào là một Frontend developer, những kỹ năng và nền tảng công nghệ mà bạn có thể học hỏi được từ việc trở thành một Frontend, cũng như tương lai nào cho bạn khi bạn trở thành một Frontend.

Frontend là gì?

Trước hết hãy tìm câu trả lời Frontend là gì?

Frontend là phần của trang web mà người dùng trực tiếp tương tác. Nó bao gồm thiết kế, thanh điều hướng, text, hình ảnh, video, và cấu trúc tổng thể của trang. Mục tiêu chính của frontend là đảm bảo tính tương thích và hiệu suất của trang web.

Khi vào một website hay một application, những gì bạn thấy, các nút bấm, những hành động click hay scroll trên trang đó là kết quả của lập trình Front End. Bạn có thể coi Front-End là client-side và Back-End là server-side.

Sự khác biệt giữa Front-EndBack-End là Front-End đề cập đến giao diện của trang web, trong khi Back-end đề cập đến cách trang web hoạt động.

Các ngôn ngữ chính dùng trong phát triển frontend bao gồm HTML, CSS và JavaScript. HTML định dạng cấu trúc nội dung, CSS điều chỉnh kiểu dáng và bố cục, còn JavaScript cung cấp tính năng động và tương tác cho trang web.

Đọc thêm: Phân biệt Frontend, Backend và Fullstack Developer

Frontend Developer là ai, làm công việc gì?

Trách nhiệm chính của Lập trình viên Front-End là tạo ra giao diện người dùng.

Lập trình frontend là việc sử dụng các ngôn ngữ HTML, CSS và ngôn ngữ lập trình JavaScript để thiết kế, viết code tạo ra giao diện của các ứng dụng hay trang web dành cho người dùng. 

Frontend Developer là gì?

Giao diện mà Frontend Developer tạo ra không chỉ chạy trên 1 loại thiết bị duy nhất mà còn phải đảm bảo nó tương thích với nhiều phần cứng khác nhau từ kích thước màn hình, độ phân giải, hệ điều hành, loại trình duyệt,… giúp mang lại trải nghiệm tốt nhất cho khách hàng. Ngoài việc xử lý các logic ở Client Side, Frontend Developer cũng đảm nhận việc xử lý giao tiếp với phía Backend (Server Side) thông qua việc gửi request API, nhận response dữ liệu và hiển thị kết quả cho người dùng.

  9 Câu Hỏi Phỏng Vấn Frontend Developer Có Thể Bạn Chưa Biết

  Mobile Developer là gì? Trở thành Mobile Developer từ con số 0

Những kĩ năng cần có của Frontend Developer

  • HTML và CSS: đây là 2 ngôn ngữ cơ bản nhất để xây dựng nên các building block cơ bản, từ đó tạo ra giao diện của 1 website. 
  • JavaScript: ngôn ngữ lập trình sử dụng để xử lý các sự kiện, tương tác của người dùng với website, đây cũng là 1 phần không thể thiếu khi muốn tạo ra các website động.
  • Các framework, thư viện: để tiết kiệm thời gian xây dựng thành phần của website, chúng ta có thể tận dụng các framework, thư viện có sẵn hiện nay như  ReactJS, AngularJS, jQuery, … Ngoài việc tận dụng các thành phần và xử lý có sẵn thì việc sử dụng các thư viện cũng giúp bạn viết code và quản lý source code dễ dàng hơn theo các cấu trúc rõ ràng.
  • Responsive: website của bạn không chỉ chạy trên 1 loại màn hình, vì thế cần thiết kế để website hiển thị 1 cách hợp lý và tối ưu trên các loại màn hình khác nhau và cả trên các thiết bị di động.
  • Cross-Browser: ngoài việc tối ưu hiển thị trên các kích thước màn hình khác nhau, website của bạn cũng cần chạy được trên nhiều trình duyệt khác nhau như Chrome, Firefox, IE, … mỗi trình duyệt có những đặc thù riêng, CSS, JS hỗ trợ cũng khác nhau. Vì thế bạn cần nắm rõ những đặc điểm trên để website có thể chạy tốt trên các nền tảng trình duyệt đó.
  • Rest API: cách để Frontend giao tiếp với Backend thông qua việc gửi yêu cầu (request) và nhận lại phản hồi (response) và dữ liệu để hiển thị. Việc nắm rõ các phương thức giao tiếp POST, GET, DELETE, …cùng body gửi lên là cần thiết để truyền và nhận dữ liệu 1 cách chính xác.

Tham khảo nhiều vị trí JavaScript Developer hấp dẫn trên TopDev

Kỹ năng cần có của một lập trình viên Frontend

Lập trình viên Frontend cần sở hữu một loạt các kỹ năng để phát triển và duy trì các giao diện người dùng hiệu quả và hấp dẫn. Dưới đây là những kỹ năng quan trọng mà một lập trình viên Frontend nên có:

1. Ngôn Ngữ Lập Trình Cơ Bản

  • HTML và CSS: đây là 2 ngôn ngữ cơ bản nhất để xây dựng nên các building block cơ bản, từ đó tạo ra giao diện của 1 website. 
  • JavaScript: ngôn ngữ lập trình sử dụng để xử lý các sự kiện, tương tác của người dùng với website, đây cũng là 1 phần không thể thiếu khi muốn tạo ra các website động.

2. Framework và Thư Viện JavaScript và CSS

Các framework, thư viện: để tiết kiệm thời gian xây dựng thành phần của website, chúng ta có thể tận dụng các framework, thư viện có sẵn hiện nay như  ReactJS, AngularJS, jQuery, … Ngoài việc tận dụng các thành phần và xử lý có sẵn thì việc sử dụng các thư viện cũng giúp bạn viết code và quản lý source code dễ dàng hơn theo các cấu trúc rõ ràng:

  • Bootstrap: Một framework CSS phổ biến giúp tạo giao diện người dùng responsive.
  • W3.CSS: Một framework CSS đơn giản và dễ sử dụng.
  • jQuery: Thư viện JavaScript giúp đơn giản hóa việc thao tác với DOM.
  • Angular: Một framework JavaScript mạnh mẽ để xây dựng các ứng dụng web động.
  • React: Một thư viện JavaScript của Facebook dùng để xây dựng giao diện người dùng.

Xử Lý API

  • REST: Giao thức API phổ biến dùng để tương tác với các dịch vụ web.
  • GraphQL: Một ngôn ngữ truy vấn API giúp lấy dữ liệu hiệu quả hơn.

Responsive

Website của bạn không chỉ chạy trên 1 loại màn hình, vì thế cần thiết kế để website hiển thị 1 cách hợp lý và tối ưu trên các loại màn hình khác nhau và cả trên các thiết bị di động.

Định Dạng Dữ Liệu

  • JSON: Định dạng dữ liệu nhẹ thường được sử dụng để truyền tải dữ liệu giữa client và server.
  • XML: Một định dạng dữ liệu khác, thường dùng trong các ứng dụng web truyền thống.

Công Cụ Phát Triển

  • Git: Hệ thống quản lý phiên bản phân tán, quan trọng để theo dõi và quản lý mã nguồn.

Những kỹ năng này giúp lập trình viên Frontend phát triển các giao diện người dùng hiệu quả, đáp ứng nhu cầu của người dùng và đảm bảo hiệu suất tối ưu cho trang web.

Những nền tảng công nghệ trong lập trình Frontend

Phần tiếp theo của bài viết, chúng ta sẽ lướt qua các nền tảng công nghệ mà khi bạn muốn trở thành frontend developer bạn cần phải biết cũng như có hiểu biết đúng đắn, đầy đủ và thật sâu về nó.

Những nền tảng này không chỉ ảnh hưởng đã từ rất lâu trong quá khứ, mà còn hiện tại cho đến tương lai về sau.

Hệ sinh thái CSS Framework

Ngày nay không khó để điểm mặt chỉ tên các nền tảng về css framework phổ biến như: Bootstrap, Foundation, SemanticUI và hàng loạt các tên tuổi khác có các thế mạnh, triết lý riêng.

Các framework cung cấp hàng loạt các tính năng, đáp ứng gần như là đầy đủ các yêu cầu cơ bản cần có đối với một sản phẩm được thiết kế theo hướng hiện đại: carousel, form, modal, drag/drop, datetime picker… nhằm giúp lập trình viên phát triển nhanh hơn ứng dụng của mình.

Hệ sinh thái jQuery

Sau nhiều năm đứng đầu về sự đóng góp của mình trong lĩnh vực Frontend, JQuery đã tạo cho mình một hệ sinh thái, một vị trí thống lĩnh mà hiếm có thư viện nào có thể sánh kịp. Các plugin của jQuery đã cung cấp hầu hết mọi thứ mà các lập trình viên cần đến, với lại rất dễ dàng để tích hợp vào source code của họ. API jQuery được thiết kế thông minh, dễ sử dụng, hầu hết là tương thích với các trình duyệt phổ biến đã làm giảm đi chi phí phát triển, kiểm lỗi và hạn chế được rất nhiều rủi ro.

Ngay cả khi các nền tảng về frontend lớn hiện tại như Angular, React, Vuejs không còn phụ thuộc vào nó nữa thì tư tưởng và tầm ảnh hưởng của nó sẽ vẫn còn trong rất nhiều năm tới, nếu không muốn nói là khó có thể thay thế được trong tương lai gần.

Và cũng tránh nhầm lẫn trong việc jQuery so sánh với các nền tảng như Angular, Reactjs… thì trong giới hạn của bài viết, bạn đọc có thể hình dung rằng đó là 2 nền tảng tiếp cận theo hai hướng hoàn toàn khác nhau, có thể chúng không phụ thuộc lẫn nhau nhưng không có nghĩa là chúng phủ định lẫn nhau.

Hệ sinh thái Nodejs

Nodejs có một hệ sinh thái đa dạng và rộng lớn, phát triển với tốc độ khủng khiếp chưa từng có, cùng với sự tham gia hỗ trợ của các ông lớn trong ngành bao gồm Microsoft, Google, Facebook v.v…

Với Nodejs bạn có thể tìm thấy mọi thứ mình cần, bao gồm các công cụ để phát triển Frontend, các phương pháp phát triển sản phẩm mới.

Hệ sinh thái Webpack

Webpack là một phần trong hệ sinh thái của Nodejs, nhưng vì tầm vóc và tương lai của nó nên chúng ta cũng nên tách nó ra thành một phần tương xứng. Webpack cung cấp cho chúng ta công cụ quan trọng để hiện thực hoá nhiều thao tác vốn phức tạp nay trở nên dễ dàng.

Các tiện ích mà Webpack cung cấp gần như là bao phủ tất cả, bao gồm giải quyết các vấn đề về tổ chức source code, giải quyết sự phụ thuộc giữa các thư viện, quản lý các resource như image, font, đi kèm với các công cụ để tối ưu source code như tách source nhỏ ra để tăng tốc tải trang…

Lộ trình để trở thành Frontend Developer

Frontend Developer là những lập trình viên tạo ra các website ở phía client side, vì thế bước đầu tiên bạn cần là trang bị kiến thức về Internet:

  • Cách Internet hoạt động, HTTP là gì?
  • Trình duyệt (browser) hoạt động thế nào, các trình duyệt thông dụng
  • Nắm được các khái niệm DNS, Domain, hosting

trang bị kiến thức về Internet

Tiếp theo chúng ta cần trang bị kiến thức cơ bản trực tiếp liên quan đến lập trình frontend bao gồm: HTML, CSS và JavaScript:

  • HTML: các thẻ (tag), form, thẻ media và cách sử dụng. Trang bị kiến thức về HTML5, kỹ thuật SEO cơ bản.
  • CSS: các thuộc tính CSS của từng thẻ HTML tương ứng. Cách sử dụng thẻ media để xử lý responsive cho các kích thước màn hình khác nhau. Cách xây dựng layout cơ bản. Tìm hiểu thêm về SCSS hay SASS
  • JavaScript: Cú pháp lập trình, các kiểu dữ liệu cơ bản trong JS. ES6+ và các module cơ bản trong JavaScript. Cách xử lý với API (fetch, xhr). Sau khi nắm vững được cơ bản về JS thì chúng ta có thể tìm hiểu sâu hơn về các thư viện JS thường sử dụng như jQuery, React, Vue,…

html css javascript là gì

Việc chọn 1 framework để sử dụng và tiếp tục tìm hiểu sâu là cần thiết, giúp bạn có thể tối ưu hóa được thời gian và chi phí lập trình; đồng thời đáp ứng được nhu cầu tuyển dụng của các công ty.

Ngoài ra trong quá trình làm việc, các bạn cũng cần có kiến thức liên quan đến trình quản lý package, các tools giúp định dạng hiển thị sourcode và tự động format đúng chuẩn:

  • Framework và thư viện: React, Angular, Vue.js, Svelte, Solid JS
  • Package Managers: npm, yarn, pnpm
  • Formatters: Prettier, ESLint
  • Module Bundlers: Webpack, Vite, Rollup, Parcel

Ứng tuyển ngay các vị trí tuyển dụng Frontend trên TopDev

Đến đây bạn có thể tự tin chinh chiến các dự án được giao trách nhiệm, code các module theo đúng yêu cầu của khách hàng. Tất nhiên việc học không bao giờ là đủ, 1 senior Frontend Developer cần trang bị thêm nhiều kiến thức chuyên sâu hơn nữa, 1 số gạch đầu dòng dưới đây để các bạn có thể tham khảo:

  • Authentication: JWT, Oauth, Sessio Auth, SSO
  • SSR, SSG: Server Side Rendering, Static Site Generation
  • Progressive Web Apps: làm việc với Web Sockets, Service Workers, sử dụng Lighthouse hay Devtools cho việc tối ưu hóa website
  • GraphQL: cách để phía frontend tương tác trực tiếp với Database mà không cần qua Backend
  • Tạo ra các ứng dụng dành cho mobile hay desktop: hiện tại với JS chúng ta không chỉ còn tạo ra các ứng dụng web, mà nó còn có thể tạo ra các ứng dụng chạy trên mobile hay desktop. 1 số framework hay thư viện có thể giúp chúng ta làm điều đó: React Native, Flutter, Ionic, NativeScript cho mobile; Electron, Tauri dành cho desktop.

Tương lai của một Frontend Dev

Ngày nay, với phong trào khởi nghiệp, các sản phẩm mới được phát triển không chỉ nhiều về số lượng, mà đa dạng về lĩch vực, các sản phẩm cũ cũng được nâng cấp lên về chất lượng, performance bên trong cũng như UI/UX bên ngoài tạo ra một nguồn cầu rất lớn từ thị trường.

Các ứng dụng giờ không chỉ được xây dựng cho desktop, mà còn phải chạy tốt trên nền tảng di động tạo ra gần như gấp đôi khối lượng công việc để làm. Ngoài ra nền tảng di động đòi hỏi các yêu cầu khắt khe hơn về các tiêu chí kỹ thuật như về performance, network, optimize việc sử dụng tài nguyên của thiết bị sao cho tối ưu nhất.

Một thị trường đa dạng, rộng lớn chắc chắn sẽ mang lại nhiều cơ hội nghề nghiệp hấp dẫn (số lượng), với mức lương cạnh tranh (chất lượng), điều đó làm nên một tương lai tươi sáng cho nghề nghiệp của chúng ta.

Kết bài

Frontend là 1 phần không thể thiếu trong 1 website nói riêng và hệ thống Web nói chung. Lập trình viên Frontend có thể học thêm NodeJS để làm backend cũng khiến cho nghề này trở nên hấp dẫn hơn trong định hướng của bạn. Bài viết này hy vọng đã mang đến cho các bạn cái nhìn tổng quan nhất về frontend developer và lộ trình học để trở thành 1 lập trình viên trong tương lai. Cảm ơn các bạn đã đọc bài và hẹn gặp lại các bạn trong những bài viết tiếp theo của mình.

Xem thêm việc làm công nghệ hấp dẫn trên TopDev