Home Blog Page 142

Tìm kiếm thông minh với Typeahead trong ứng dụng Laravel

Tìm kiếm thông minh với Typeahead trong ứng dụng Laravel

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

Trong những website lớn, các phần tìm kiếm hay nhập liệu rất cần những tính năng thông minh như gợi ý dựa trên các từ nhập vào, nó giúp cho nâng cao trải nghiệm người dùng, giúp tìm kiếm và nhập liệu trở lên đơn giản hơn. Google là một minh chứng không cần phải bàn cãi cho vấn đề này. Những năm đầu của thế kỉ 21, Google xuất hiện với chỉ duy nhất một ô tìm kiếm và tính năng gợi ý ngay lập tức khi từ khóa được đánh vào, nó đã giúp người dùng định hướng được ngay khi chỉ gõ vào 1-2 từ trong từ khóa.

Ở thời điểm đó, gợi ý khi tìm kiếm là một tính năng phức tạp và xa xỉ, nhưng khi công nghệ phần mềm phát triển, đặc biệt với phần mềm mã nguồn mở, những tính năng như vậy thật đơn giản để thực hiện. Bài viết này sẽ hướng dẫn bạn thực hiện các tìm kiếm thông minh hay gợi ý nhập liệu sử dụng thư viện Typeahead là một gói phần mềm mã nguồn mở của Twitter trong các ứng dụng Laravel.

  Các Laravel route tips giúp bạn cải thiện routing
  Cách sử dụng Laravel với Socket.IO

Tìm kiếm thông minh với Typeahead trong ứng dụng Laravel

Trong bài viết này chúng ta sẽ thực hiện một ví dụ tìm kiếm thông minh thông tin khách hàng bằng cách tạo ra dữ liệu mẫu khoảng 10,000 khách hàng. Như bạn thấy khi tìm kiếm hệ thống sẽ gợi ý các bản ghi trong database rất nhanh giúp người dùng có thể lựa chọn luôn chính xác người dùng. Typeahead sử dụng kết hợp Bloodhound cho tốc độ rất nhanh mặc dù dữ liệu là 10k bản ghi.

1. Giới thiệu về Typeahead

  • Typeahead.js là một thư viện Javascript rất linh hoạt, nó có thể làm nền tảng tốt để xây dựng các tính năng tìm kiếm gợi ý thông minh. Typeahead bao gồm hai thành phần: Typeahead: Phần chuyên xử lý giao diện người dùng
    • Hiển thị gợi ý đến người dùng ngay khi họ nhập liệu
    • Hiển thị các gợi ý ngay trên ô nhập liệu
    • Hỗ trợ các tùy chỉnh giao diện linh hoạt
    • Highlight các từ khóa trùng khớp trong phần gợi ý
    • Kích hoạt các sự kiện tùy chỉnh cho phép mở rộng các xử lý
  • Bloodhound: Bộ máy gợi ý nâng cao
    • Cho phép các dữ liệu được hardcode
    • Lấy dữ liệu từ trước để giảm độ trễ khi gợi ý
    • Sử dụng Local Storage giảm số lượng các request đến máy chủ.
    • Sử dụng rate limit và bộ đệm cho các request đến máy chủ làm giảm nhẹ tải dữ liệu

Bộ máy gợi ý Bloodhound sẽ được sử dụng để tính toán kết quả với các truy vấn cho trước và Typeahead sẽ sử dụng để render ra mã HTML. Cả hai thành phần này là độc lập, trong bài viết này chúng ta sẽ sử dụng cả hai để xây dựng công cụ tìm kiếm gợi ý thông minh.

1.1 Cài đặt Typeahead

Trước khi đi vào sử dụng Typeahead chúng ta cần cài đặt gói thư viện này, có ba cách thức để cài đặt.

Sử dụng npm

npm i typeahead

Tải gói thư viện dạng file zip

Vào đường dẫn Github của Typeahead chọn Clone or download và click vào Download zip. Giải nén ra chúng ta sẽ thấy trong thư mục dist có những file như sau:

  • bloodhound.js (chỉ có thành phần Bloodhound).
  • typeahead.bundle.js (Bao gồm cả Typeahead và Bloodhound).
  • typeahead.jquery.js (chỉ có thành phần Typeahead).

Các file có thêm min.js là các file được tối ưu hóa dung lượng.

Tích hợp thông qua CDN

Sử dụng CDN giúp file có thể được tải về nhanh hơn, tuy nhiên cũng gặp phải một vấn đề là khi cá mập cắn cáp, internet chập chờn nếu các CDN không có server ở gần Việt Nam thì các thư viện này rất khó để tải về. jQuery: https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js Typeahead: https://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js

Chú ý: Typeahead yêu cầu jquery phiên bản từ 1.9 trở lên. Trong bài viết này chúng ta sẽ sử dụng cách thứ ba cho nhanh, với dự án lớn nên sử dụng cách 1 để tối ưu hóa các tài nguyên với Laravel Mix.

1.2 Khởi tạo Typeahead

  • Typeahead có nhiều cách khởi tạo và sau đây là cách khởi tạo hay dùng nhất jQuery#typeahead(options, [*datasets]). Tính năng typeahead được áp dụng cho các input dạng text input[type=”text”] có hai tham số cho khởi tạo: options là các tùy chọn cấu hình, một số giá trị cần quan tâm như sau:
    • highlight: thêm thẻ <strong> vào các từ trùng khớp trong phần gợi ý. Mặc định là false.
    • hint: hiển thị cả từ gợi ý trong ô nhập liệu, mặc định true.
    • minLength: Số ký tự tối thiểu cần nhập khi tính năng gợi ý được bắt đầu, mặc định là 1.
    • classNames: Cho phép sử dụng tên class khác với mặc định.
  • dataset: một typeahead có thể có nhiều dataset, ví dụ khi bạn tìm kiếm trong một trang bán hàng có thể trả về gợi ý cho cả sản phẩm và các tin tức liên quan đến sản phẩm. Các dataset có một số các tùy chọn cấu hình như sau:
    • name: tên của dataset.
    • source: nguồn dữ liệu dùng cho gợi ý, có thể là một instance của Bloodhound, như ở phần đầu chúng ta có nói Typeahead chỉ xử lý giao diện người dùng và Bloodhound với là bộ máy thực hiện các gợi ý.
    • limit: Số gợi ý tối đa sẽ được hiển thị, mặc định là 5.
$("#navbar-search-input").typeahead({
    hint: true,
    highlight: true,
    minLength: 1
});

1.3 Khởi tạo Bloodhound

Bloodhound là bộ máy gợi ý cho Typeahead.js, sử dụng thành phần này mang lại nhiều tính năng nâng cao hơn vì nó có thể lấy dữ liệu từ một nguồn remote và sử dụng bộ đệm để tăng tốc.

var engine = new Bloodhound({
    remote: {
        url: 'api/customer?q=%QUERY%',
        wildcard: '%QUERY%'
    },
    datumTokenizer: Bloodhound.tokenizers.whitespace('q'),
    queryTokenizer: Bloodhound.tokenizers.whitespace
});

Chúng ta sẽ thiết lập đường dẫn /find?q= trong phần Laravel, datumTokenizer cần một mảng JSON. Như vậy, chúng ta đã có dữ liệu và có thể sử dụng nó cho thiết lập source của typeahead như sau:

source: engine.ttAdapter()

1.4 Tạo mẫu cho các gợi ý

Typeahead cho phép sử dụng các template để thay đổi kiểu mẫu cho các gợi ý, bạn cũng có thể sử dụng bootstrap để style:

templates: {
    empty: [
        '<div class="list-group search-results-dropdown"><div class="list-group-item">Không có kết quả phù hợp.</div></div>'
    ],
    header: [
        '<div class="list-group search-results-dropdown">'
    ],
    suggestion: function (data) {
         return '<a href="' + data.id + '" class="list-group-item">' + data.name + '</a>'
    }
}

1.5 Code hoàn chỉnh cho Typeahead.js

jQuery(document).ready(function($) {
    var engine = new Bloodhound({
        remote: {
            url: 'api/customer?q=%QUERY%',
            wildcard: '%QUERY%'
        },
        datumTokenizer: Bloodhound.tokenizers.whitespace('q'),
        queryTokenizer: Bloodhound.tokenizers.whitespace
    });

    $(".search-input").typeahead({
        hint: true,
        highlight: true,
        minLength: 1
    }, {
        source: engine.ttAdapter(),
        name: 'usersList',
        templates: {
            empty: [
                '<div class="list-group search-results-dropdown"><div class="list-group-item">Không có kết quả phù hợp.</div></div>'
            ],
            header: [
                '<div class="list-group search-results-dropdown">'
            ],
            suggestion: function (data) {
                return '<a href="' + data.id + '" class="list-group-item">' + data.name + '</a>'
      }
        }
    });
});

2. Xây dựng backend với Laravel

Phần 2 chúng ta sẽ xây dựng ứng dụng Laravel

2.1 Cài đặt môi trường Laravel

Tham khảo công cụ Laragon cài đặt nhanh môi trường Laravel, chúng ta tạo ra một môi trường test có tên là typeahead và Laragon tự động tạo ra tên miền ảo typeahead.dev. Laragon cũng tự động tạo ra database tên typeahead cho chúng ta. Việc đầu tiên là thiết lập file .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=typeahead
DB_USERNAME=root
DB_PASSWORD=secret

2.2 Tạo bảng Customer và dữ liệu mẫu

Tạo ra Model Customer cùng với file migrate thông qua câu lệnh artisan make:model (Xem thêm Laravel Artisan là gì?)

D:\Laragon\www\typeahead
λ php artisan make:model Customer -m
Model created successfully.
Created Migration: 2017_09_04_084521_create_customers_table

Chỉnh sửa file migrate xxx_create_customers_table.php trong thư mục database\migrations:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCustomersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 255);
            $table->string('address', 255);
            $table->string('phone', 255);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('customers');
    }
}

Thực hiện tạo ra bảng customers trong database với câu lệnh artisan migrate. (Tìm hiểu thêm về Laravel Migration và Laravel Seeding tạo database và dữ liệu test)

D:\Laragon\www\typeahead
λ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2017_09_04_084521_create_customers_table
Migrated:  2017_09_04_084521_create_customers_table

Có nhiều các bảng khác được tạo ra do các bảng này được sử dụng cho xác thực người dùng (xem Laravel Authentication xác thực người dùng thật đơn giản). Tiếp theo chúng ta sẽ sử dụng Laravel Seeding để tạo ra 10000 dữ liệu customer mẫu trong database.

D:\Laragon\www\typeahead
λ php artisan make:seeder CustomersTableSeeder
Seeder created successfully.

Tạo file CustomerFactory.php trong thư mục database\factories:

<?php
use Faker\Generator as Faker;

$factory->define(App\Customer::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'address' => $faker->address,
        'phone' => $faker->phoneNumber
    ];
});

Class này sử dụng Faker để tạo ra dữ liệu test. Tiếp theo chúng ta tạo file Seeder:

D:\Laragon\www\typeahead
λ php artisan make:seeder CustomersTableSeeder
Seeder created successfully.

Và thêm đoạn mã sau vào file CustomersTableSeeder.php trong thư mục database\seeds:

<?php
use Illuminate\Database\Seeder;

class CustomersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(Customer::class, 10000)->create();
    }
}

và khai báo sử dụng Seeder này trong file database\seeds\DatabaseSeeder.php:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(CustomersTableSeeder::class);
    }
}

Thực hiện tạo ra 10000 dữ liệu khách hàng mẫu với câu lệnh artisan db:seed

D:\Laragon\www\typeahead
λ php artisan db:seed
Seeding: CustomersTableSeeder

2.3 Route

Chúng ta đã tạo ra bảng customer với 10 nghìn dữ liệu khách hàng mẫu được đưa vào, tiếp theo chúng ta cần tạo ra một đường dẫn để thực hiện tìm kiếm khách hàng và trả về dữ liệu dạng JSON cho truy vấn Bloodhound, thêm route sau đây vào file routes\api.php:

Route::get('find', 'SearchController@find');

Tạo thêm một route trong routes\web.php để hiển thị thông tin chi tiết của khách hàng, ở đây chỉ thực hiện in ra màn hình thông tin mà không có tạo view, coi như bài tập thêm cho các bạn :).

Route::get('customer/{id}', function() {
   $customer = Customer::find($id);
   return $customer->name . '@' . $customer->phone . '-' . $customer->address;
});

2.4 Controller

Tạo controller SearchController bằng lệnh artisan:

D:\Laragon\www\typeahead
λ php artisan make:controller SearchController
Controller created successfully.

Thêm phương thức find vào SearchController.php trong app\Http\Controllers:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Customer;

class SearchController extends Controller
{
    public function find(Request $request) {
      $customer = Customer::where('name', 'like', '%' . $request->get('q') . '%')->get();
      return response()->json($customer);
    }
}

Vào đường dẫn http://typeahead.dev/customer?q=jo chúng ta sẽ có kết quả là dữ liệu dạng JSON:

Tìm kiếm thông minh với Typeahead trong ứng dụng Laravel

2.5 View

Tiếp đến chúng ta thay đổi welcome view nằm trong thư mục resources\views:

<!DOCTYPE html>
<html lang="vi">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="description" content="Tìm kiếm thông minh sử dụng Typeahead trong ứng dụng Laravel">
        <meta name="author" content="FirebirD ['www.allaravel.com']">
        <title>Tìm kiếm thông minh trong Laravel sử dụng Typeahead - Allaravel.com</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">

        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
        <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
        <style type="text/css">html{position:relative;min-height:100%;}body{margin-bottom:60px;}.footer{position:absolute;bottom:0;width:100%;height:60px;background-color:#f5f5f5;}body>.container{padding:60px 15px 0;}.container.text-muted{margin: 20px 0;}.footer>.container{padding-right:15px;padding-left:15px;}code{font-size:80%;}</style>
    </head>
    <body>
        <!-- Fixed navbar -->
        <nav class="navbar navbar-default navbar-fixed-top">
            <div class="container">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                        <span class="sr-only">Toggle navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <a class="navbar-brand" href="https://allaravel.com">Typeahead</a>
                </div>
                <div id="navbar" class="collapse navbar-collapse">
                    <ul class="nav navbar-nav">
                        <li class="active"><a href="#">Home</a></li>
                        <li><a href="#about">About</a></li>
                        <li><a href="#contact">Contact</a></li>
                    </ul>
                </div><!--/.nav-collapse -->
            </div>
        </nav>

        <!-- Begin page content -->
        <div class="container">
            <div class="page-header">
                <h3>Ví dụ tìm kiếm thông minh sử dụng typeahead.js trong ứng dụng Laravel - Allaravel.com</h3>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <form class="form-inline typeahead">
                        <div class="form-group">
                            <input type="name" class="form-control search-input" id="name" autocomplete="off" placeholder="Nhập tên khách hàng">
                        </div>
                        <button type="submit" class="btn btn-default">Tìm kiếm</button>
                    </form>
                </div>
            </div>
        </div>

        <footer class="footer">
            <div class="container">
                <p class="text-muted">Example in <a href="https://allaravel.com">allaravel.com</a></p>
            </div>
        </footer>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/typeahead.js/0.11.1/typeahead.bundle.min.js"></script>
        <script>
            jQuery(document).ready(function($) {
                var engine = new Bloodhound({
                    remote: {
                        url: 'api/customer?q=%QUERY%',
                        wildcard: '%QUERY%'
                    },
                    datumTokenizer: Bloodhound.tokenizers.whitespace('q'),
                    queryTokenizer: Bloodhound.tokenizers.whitespace
                });

                $(".search-input").typeahead({
                    hint: true,
                    highlight: true,
                    minLength: 1
                }, {
                    source: engine.ttAdapter(),
                    name: 'usersList',
                    templates: {
                        empty: [
                            '<div class="list-group search-results-dropdown"><div class="list-group-item">Không có kết quả phù hợp.</div></div>'
                        ],
                        header: [
                            '<div class="list-group search-results-dropdown">'
                        ],
                        suggestion: function (data) {
                            return '<a href="customer/' + data.id + '" class="list-group-item">' + data.name + '</a>'
                        }
                    }
                });
            });
        </script>
    </body>
</html>

Kết quả khi vào http://typeahead.dev và thực hiện tìm kiếm khách hàng chúng ta được như sau:

Tìm kiếm thông minh với Typeahead trong ứng dụng Laravel

3. Lời kết

Với việc sử dụng Typeahead trong ứng dụng Laravel, trải nghiệm người dùng được nâng cao hơn. Typeahead không chỉ sử dụng trong các phần tìm kiếm mà chúng ta có thể sử dụng trong các form nhập liệu giúp gợi ý thông tin nhập liệu. Hi vọng bài viết sẽ giúp ích cho các bạn trong các dự án riêng sử dụng Laravel, có bất kỳ thắc mắc hoặc góp ý các bạn comment cuối bài nhé.

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

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

Xem thêm việc làm lập trình viên laravel hấp dẫn tại TopDev

PHP 8: match hay là switch?

PHP 8: match hay là switch?

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

PHP 8 sẽ giới thiệu một biểu thức mới “match“. Một tính năng mạnh mẽ và sẽ là sự lựa chọn tốt hơn so với “switch“. Vậy chính xác sự khác biệt là gì?

  10 PHP Instagram Scripts & Widgets tốt nhất
  10 Frameworks tốt nhất hiện nay cho PHP

Hãy bắt đầu bằng cách so sánh cả hai. Đây là một ví dụ về “switch” cổ điển:

switch ($statusCode) {
    case 200:
    case 300:
        $message = null;
        break;
    case 400:
        $message = 'not found';
        break;
    case 500:
        $message = 'server error';
        break;
    default:
        $message = 'unknown status code';
        break;
}

Đoạn code ở dưới đây sẽ tương đương với ở trên khi dùng biểu thức “match“:

$message = match ($statusCode) {
    200, 300 => null,
    400 => 'not found',
    500 => 'server error',
    default => 'unknown status code',
};

Trước hết, biểu thức khớp ngắn hơn đáng kể:

  • nó không yêu cầu break statement
  • nó có thể kết hợp các trường hợp giống nhau thành một bằng dấu phẩy
  • nó trả về một giá trị, vì vậy bạn chỉ phải gán giá trị một lần

Nhưng thậm chí còn nhiều hơn thế!

Không ép kiểu

match sẽ kiểm tra loại nghiêm ngặt thay vì kiểm tra lỏng lẻo. Giống như sử dụng === thay vì ==. Mọi người có thể sẽ không đồng ý liệu đó có phải là điều tốt hay không, nhưng đó là một chủ đề riêng chúng ta sẽ bàn sau.

$statusCode = '200';

$message = match ($statusCode) {
    200 => null,
    default => 'unknown status code',
};

// Kết quả trả về
// $message = 'unknown status code'

Giá trị không xác định gây ra lỗi

Nếu bạn quên kiểm tra giá trị và khi không có nhánh default được chỉ định, PHP sẽ đưa ra ngoại lệ UnhandledMatchError. Tuy kiểm tra chặt chẽ, nhưng nó sẽ ngăn chặn các lỗi nhỏ nhặt không được chú ý.

$statusCode = 400;

$message = match ($statusCode) {
    200 => 'perfect',
};

// UnhandledMatchError sẽ throw

Hiện tại chỉ có các biểu thức một dòng

Bạn chỉ có thể viết một biểu thức trên một dùng. Các khối biểu thức có thể sẽ được thêm vào tại một thời điểm nào đó, nhưng vẫn chưa rõ chính xác khi nào .

Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev

Kết hợp điều kiện

match có thể kết hợp nhiều điều kiện lại với nhau và viết trên 1 dòng ngăn cách bởi dấu phẩy

$message = match ($statusCode) {
    200, 300, 301, 302 => 'combined expressions',
};

Throwing exceptions

Trong PHP 8 có thay đổi về cách dùng throw trước đây throw chỉ bắt đầu từ câu lệnh thì giờ có thể bắt đầu từ biểu thức, nghĩa là bạn có thể throw exception ở giá trị 500 mà k phải cần đưa vào trong hàm

$message = match ($statusCode) {
    200 => null,
    500 => throw new ServerError(),
    default => 'unknown status code',
};

Pattern matching

Ok, có một điều nữa: Pattern matching. Đây là một kỹ thuật được sử dụng trong các ngôn ngữ lập trình khác, để cho phép kết hợp phức tạp hơn các giá trị đơn giản. Hãy nghĩ về nó như regex, nhưng đối với các biến thay vì văn bản.

Pattern matching không được hỗ trợ ngay bây giờ, vì đây là một tính năng khá phức tạp, nhưng Ilija Tovilo (tác giả RFC) đã đề cập đến nó như là một tính năng có thể có trong tương lai.

Vậy thì, switch hay là match?

match với phiên bản chặt chẽ và hiện đại hơn so với người anh switch

Trong một số trường hợp switch sẽ cung cấp linh hoạt hơn so với match, đặc biệt là với các khối code có nhiều dòng. Tuy nhiên, sự nghiêm ngặt của toán tử match là hấp dẫn và pattern matching sẽ là một yếu tố thay đổi cuộc chơi cho PHP.

Tôi thừa nhận tôi chưa bao giờ viết một switch statement trong những năm qua vì nhiều điều kỳ quặc của nó. Vì vậy, trong khi nó chưa hoàn hảo, nhưng có những trường hợp sử dụng được thì match sẽ là một sự lựa chọn tốt đối với tôi.

Ý kiến của bạn là gì, hãy để lại bình luận nhé!

Dịch từ stitcher.io

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

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

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

Cover Letter cho Dev là gì? Tips nâng cấp Cover Letter dành cho Developer

Cover Letter cho Dev
Cover Letter cho Dev

Cover Letter chuẩn Dev sẽ như thế nào? Nhiều ứng viên ngành IT cảm thấy khó khăn trong việc tìm kiếm một Cover Letter cho Dev với một format chuyên nghiệp. Vậy Cover Letter cho Developer là gì và đâu là những điểm cần lưu ý? Cùng TopDev điểm qua bài viết sau để giải đáp các thắc mắc đấy

Thế nào là Cover Letter cho Dev?

Cover Letter (hay còn gọi là Thư xin việc), là một loại văn bản được xây dựng dưới hình thức một trang. Cover Letter cho Dev truyền tải các thông tin về cá nhân, năng lực, trình độ, mục tiêu phát triển ngành lập trình đến với nhà tuyển dụng. 

Cover Letter
thư xin việc – Cover Letter  được hiểu như thế nào?

Chất lượng của một Cover Letter cho Developer sẽ quyết định 30-50% kết quả ứng tuyển. Điều đó cho thấy, cần đầu tư cho chiếc Cover Letter của mình sao cho chỉn chủ nhất. Đừng xem thường vai trò của Cover Letter cho Dev. Vì biết đâu bạn sẽ bị “out” vì sự hời hợt đối với nó đấy!

Cover Letter không chỉ phản ánh bạn là ứng viên Developer phù hợp mà còn cho trong nhiều trường hợp, nó còn thể hiện bạn là người không phù hợp với vị trí đó.

Tips nâng cấp Cover Letter cho Developer

Hãy lưu tâm các tips sau để Cover Letter của bạn không trở nên quá tệ hại trong mắt nhà tuyển dụng.

CV ngành IT
Tips viết CV giúp ứng viên có thêm bí quyết hoàn thiện Cover Letter Developer

Cover Letter bám sát tính trọng tâm về nội dung

Ứng viên IT nên chú trọng đến việc chia sẻ về các thông tin quan trọng. Tránh liệt kê những nội dung thừa thải, không liên quan. Điều đó chứng tỏ bạn là người thiếu sự nhìn nhận, sàng lọc và phân tích thông tin.

Đồng thời, viết CV chuẩn đẹp giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Nội dung cần được triển khai theo format chuẩn và đúng định hướng. Không dài dòng, dàn trải với nhiều thông tin lan man, thiếu tính kết nối. Sự rời rạc về nội dung khiến giá trị của Cover Letter cho Developer bị giảm đi. 

Trọng tâm còn nằm ở chỗ vấn đề ứng viên chia sẻ các kỹ năng cần thiết cho vị trí ứng tuyển. Đừng nói quá và phô trương quá nhiều kỹ năng. Bạn cần nhớ là nhà tuyển dụng cần chất lượng hơn số lượng.

Số liệu thực minh chứng cho các trải nghiệm trong Cover Letter 

Những minh chứng rất quan trọng. Nhà tuyển dụng sẽ có ấn tượng hơn với nhiều ứng viên trình bày rõ ràng các minh chứng về các trải nghiệm của mình. 

Đó có thể là:

+ Số liệu cho thấy tốc độ tăng trưởng dưới sự phồi hợp giải quyết các công việc giữa bạn và team trong một dự án.

+Lời đánh giá chuyên môn.

+ Các thành tích, giải thưởng từ quá trình phân tích, nghiên cứu chuyên sâu.

Kiểm tra lại nội dung Cover Letter cho Dev

Khó có thể nói có một công thức chung nào để được gọi là sự ấn tượng. Thế nhưng, việc rà soát lại các lỗi trong Cover Letter sẽ giúp cho thư xin việc IT được nâng cấp một cách toàn diện hơn.

Xem thêm các vị tri tuyển dụng IT fresher nổi bật

Định dạng Cover Letter đã đúng hay chưa? Một điều lưu ý là Cover Letter cho Dev không quá nhiều chữ. Khoảng cách lề chuẩn là từ 1’’- 1,5’’.

Dù cho bạn viết CV ngành IT, CV IT tiếng anh (CV English IT), CV cho sinh viên IT mới ra trường (CV IT student), CV IT Developer hay CV dành cho Senior Developer,… bạn vẫn nên quan tâm đến vấn đề văn phong và giọng điệu.  

Không nên dùng những từ ngữ quá phức tạp, có sắc thái biểu đạt quá cao. Điều này làm giảm đi tính hiệu quả của Cover Letter cho Developer . Thay vào đó hãy ưu tiên dùng các từ ngữ đơn giản, dễ hiểu. Ứng viên cần lượt bỏ đi những thông tin không quan trọng. Vì đôi khi, quá nhiều nội dung sẽ khiến nhà tuyển dụng khó nắm bắt được những điều bạn muốn truyền tải trong Cover Letter cho Dev.

Gợi ý các mẫu template Cover letter/mẫu thư xin việc cho Dev

Tải ngay những mẫu CV đẹp dành cho lập trình viên tại đây

CV cho sinh viên IT mới ra trường
M1 – Cover Letter
Cover Letter
M2 – Cover Letter

Khi đã đủ tự tin, bạn hãy chuẩn bị một chiếc CV IT thật chất lượng. Đừng chần chờ mà không nắm bắt cơ hội trải nghiệm việc làm IT tại TopDev.

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

Xem thêm Jobs Developer trên TopDev

“Quyền năng” dữ liệu trong Kỷ nguyên mới?! | VWS2020

Vietnam Web Summit 2020 (VWS2020) với hàng loạt chủ đề hấp dẫn về tính “quyền năng” của dữ liệu đặc biệt trong thời đại Digital Transformation! Sự phát triển mạnh mẽ và ứng dụng công nghệ đa dạng vào trong đời sống tạo ra một lượng lớn dữ liệu khách hàng, tạo nên những câu chuyện và rồi lại tác động trở lại đến quyết định của nhiều tổ chức, doanh nghiệp. Tuy nhiên trong thực tế, liệu những câu chuyện được kể bởi dữ liệu có phản ánh toàn bộ thực tế? Dữ liệu có phải là một ‘đấng toàn năng’ và chi phối mọi quyết định của doanh nghiệp?

Hãy để các diễn giả của Vietnam Web Summit 2020 giúp bạn ‘tỏ tường’ hơn về quyền năng của dữ liệu và lý do dữ liệu không phải là toàn năng. Ai sẽ thực hiện điều này?

  Lộ diện những "nhân vật" đầu tiên góp mặt tại Vietnam Web Summit 2020 | VWS2020
◸Mr. Nguyễn Tấn Triều
CEO @USPA Technology Company◿

Câu trả lời mà bạn đang tìm kiếm có thể sẽ được tìm thấy dưới góc nhìn của “dataism”. Thông qua topic “Thinking with Dataism and LEO Customer Data Platform”, anh Nguyễn Tấn Triều sẽ cho bạn một góc nhìn tổng quan về ‘tôn giáo’ này cùng phương pháp LEO CDP.

◸Ms. Đặng Huỳnh Mai Anh
Data Science Manager @Amanotes◿

Tự thân dữ liệu không thể tạo ra câu chuyện nếu không có bàn tay của con người. Trong topic “Data Quality Control System – what it is and how it is employed in a music-tech company”, chị Đặng Huỳnh Mai Anh sẽ “bật mí” cách tận dụng triệt để loại ‘quyền năng’ này với một Data Quality Control System – một ‘cỗ máy’ quản trị chất lượng dữ liệu của một công ty đã chạm đến con số 1 tỷ lượt tải ứng dụng và với 95 triệu MAU.

◸Mr. Nghiêm Xuân Bách
Vietnam Country Manager @Cinnamon AI◿

“Data never sleep” – dữ liệu luôn được sản sinh liên tục, vì lẽ đó một Data Harvest Loop sẽ là giải pháp cho các doanh nghiệp. Để hiểu rõ hơn Data Harvest Loop là gì, doanh nghiệp sẽ ứng dụng như thế nào trong quá trình chuyển đổi, hãy để anh Nghiêm Xuân Bách tiết lộ cho bạn.

◸Ms. Kelly Tran
Client Partner – Monetization @Unity Technologies◿

Ở giai đoạn cuối cùng của quá trình chuyển hóa dữ liệu, chị Kelly Tran sẽ giải đáp lý do vì sao đôi lúc dữ liệu lại ‘nói dối’ với bạn, đặc biệt trong lĩnh vực gaming, thông qua topic “Why A/B testing by data go wrong in gaming”.

Với lượng topic lên đến con số hàng trăm, xoay quanh 6 nhóm chủ đề liên quan đến công nghệ web, VWS2020 hứa hẹn là điểm hẹn công nghệ hoành tráng nhất cuối năm 2020, nơi các tech-guys gặp gỡ và chia sẻ về những ứng dụng công nghệ mới và đón đầu xu hướng trong giai đoạn 5 năm tiếp theo!

==

Vietnam Web Summit 2020: LEAD THE AGE OF REVOLUTION TECHNOLOGIES

Vào tháng 12/2020, Vietnam Web Summit trở lại tại 2 thành phố TP.HCM và HN – nơi những ý tưởng sẽ gặp nhau và cùng đón đầu những xu hướng, công nghệ mới trong chặng đường 5 năm tiếp theo – một kỷ nguyên mới của công nghệ!

► Tìm hiểu thêm: www.vietnamwebsummit.com
► Hồ Chí Minh: 11/12/2020 | Hà Nội: 18/12/2020

Giới thiệu IDE phổ biến trong lập trình Python

Giới thiệu IDE phổ biến trong lập trình Python

Bài viết gốc được sự cho phép của tác giả Nguyễn Chí Thức

IDE là gì?

IDE là viết tắt của Integrated Development Environment (môi trường phát triển tích hợp) được định nghĩa là một công cụ mã hóa giúp tự động hóa quá trình chỉnh sửa, biên dịch, kiểm thử mã nguồn và nó giúp nhà phát triển dễ dàng chạy, viết và debug code.

Nó được thiết kế đặc biệt để phát triển phần mềm bao gồm một số công cụ được sử dụng để phát triển và kiểm thử phần mềm.

Giới thiệu IDE phổ biến trong lập trình Python như sau:

  • PyCharm
  • Spyder
  • PyDev
  • Atom
  • Wing
  • Jupyter Notebook
  • Thonny
  • Rodeo
  • Microsoft Visual Studio
  • Eric
  Python là gì? Tổng hợp kiến thức cho người mới bắt đầu

PyCharm

PyCharm được phát triển bởi Jet Brains và đây là môi trường phát triển tích hợp đa nền tảng (IDE) được thiết kế đặc biệt cho Python. Đây là IDE được sử dụng rộng rãi nhất và có sẵn ở cả phiên bản trả phí và nguồn mở miễn phí.

PyCharm là một IDE Python hoàn hảo với một các tính năng phong phú như tự đồng hoàn thiện code, điều hướng project nhanh, test và debug nhanh, hỗ trợ phát triển từ xa, khả năng truy cập cơ sở dữ liệu, v.v.

Tính năng, đặc điểm:

  1. Điều hướng mã thông minh
  2. Đánh dấu lỗi
  3. Trình gỡ lỗi (debug) mạnh mẽ
  4. Hỗ trợ các framework phát triển web Python, ví dụ, Angular JS, Javascript

Tuyển python lương cao không yêu cầu kinh nghiệm

Spyder

Spyder là một công cụ mã nguồn mở có sự công nhận cao trong thị trường IDE và phù hợp nhất với khoa học dữ liệu. Tên đầy đủ của Spyder là môi trường phát triển Python khoa học. Nó hỗ trợ tất cả các nền tảng quan trọng Linux, Windows và MacOS X.

Nó cung cấp một tập hợp các tính năng như trình soạn thảo mã cục bộ, trình xem tài liệu, trình thám hiểm biến, bảng điều khiển tích hợp, v.v. và hỗ trợ các mô-đun khoa học như NumPy, SciPy, v.v.

Tính năng, đặc điểm:

Làm nổi bật cú pháp đúng và hoàn thành mã tự động
Tích hợp mạnh mẽ với Python console
Hoạt động tốt trong chế độ chỉnh sửa đa ngôn ngữ và chế độ hoàn thành mã tự động
PyDev
PyDev được định nghĩa là một trong những IDE Python thường được sử dụng, là một plugin bên ngoài cho Eclipse. Đó là một lựa chọn tự nhiên của các nhà phát triển Python đến từ nền tảng Java và rất phổ biến trên thị trường với tư cách là trình thông dịch Python.

Pydev có một tính năng bao gồm tích hợp Django, hoàn thành mã tự động, thụt lề thông minh, v.v.

Tính năng, đặc điểm:

  1. Các tham số mạnh như tái refactor, debug, phân tích mã và chức năng bao phủ mã.
  2. Nó hỗ trợ các môi trường ảo, Mypy và định dạng màu đen.
  3. Cũng hỗ trợ tích hợp PyLint, trình debug từ xa, tích hợp unit test, v.v.

Atom

Atom được phát triển bởi GitHub, ban đầu được bắt đầu như một nguồn mở, đa nền tảng. Nó dựa trên một framework, nghĩa là nó cho phép ứng dụng máy tính để bàn cross-platform sử dụng Chromium và Node.js và thường được gọi là “Text Editor Hack cho thế kỷ 21 st

Tính năng, đặc điểm:

  1. Trực quan hóa kết quả trên Atom mà không cần mở bất kỳ cửa sổ nào khác.
  2. Một plugin có tên “Markdown Preview Plus” cung cấp hỗ trợ tích hợp để chỉnh sửa và hiển thị các tệp Markdown.
  Một số thủ thuật hay trong Python

Wing

Nó được định nghĩa là một IDE đa nền tảng được tích hợp các tính năng cần thiết và hỗ trợ phát triển tốt. Phiên bản cá nhân của nó là miễn phí. Phiên bản pro đi kèm bản dùng thử 30 ngày.

Nó có một số tính năng bao gồm tự động hoàn thành code, highlight cú pháp, thụt lề và debug.

Tính năng, đặc điểm:

  1. Có phần tùy chình và cũng có thể mở rộng.
  2. Hỗ trợ phát triển từ xa, test-driven development cùng với kiểm thử đơn vị.

Jupyter Notebook

Jupyter là một trong những trình soạn thảo sổ ghi chép IPython được sử dụng nhiều nhất được sử dụng trong ngành Khoa học dữ liệu. Nó là một ứng dụng web dựa trên cấu trúc máy chủ-máy khách và cho phép bạn tạo và thao tác với các tài liệu sổ ghi chép.

Tính năng, đặc điểm:

  1. Hỗ trợ đánh dấu
  2. Dễ dàng tạo và chỉnh sửa mã
  3. Lý tưởng cho người mới bắt đầu trong khoa học dữ liệu

Thonny

Thonny là một IDE khác phù hợp nhất cho việc học và dạy lập trình. Nó là một phần mềm được phát triển tại Đại học Tartu và hỗ trợ hoàn thành mã và đánh dấu các lỗi cú pháp.

Tính năng, đặc điểm:

  1. Trình debug đơn giản
  2. Hỗ trợ đánh dấu lỗi và hoàn thành mã tự động

Rodeo

Rodeo được định nghĩa là một trong những IDE tốt nhất cho python được sử dụng rộng rãi nhất cho các dự án khoa học dữ liệu như lấy dữ liệu và thông tin từ các tài nguyên khác nhau.

Nó hỗ trợ chức năng đa nền tảng và cung cấp tự động hoàn thành mã.

Tính năng, đặc điểm:

  1. Cho phép các chức năng so sánh dữ liệu, tương tác, vẽ đồ thị và kiểm tra dữ liệu.
  2. Hoàn thành mã tự động, highlight cú pháp, trình điều hướng tệp trực quan, v.v.

Microsoft Visual Studio

Microsoft Visual Studio là một trình soạn thảo mã nguồn mở phù hợp nhất để phát triển và gỡ lỗi các dự án web và đám mây mới nhất. Nó có thị trường riêng cho các phần mở rộng.

Tính năng, đặc điểm:

  1. Hỗ trợ mã hóa Python trong Visual studio
  2. Có sẵn ở cả phiên bản trả phí và miễn phí

Eric Python

Eric Python là một trình soạn thảo được phát triển bằng chính Python và có thể được sử dụng cho cả công việc chuyên nghiệp và không chuyên nghiệp.

Tính năng, đặc điểm:

  1. Cung cấp bố trí cửa sổ cấu hình, editor
  2. Khả năng quản lý dự án nâng cao, kiểm soát phiên bản
  3. Trình debug tích hợp và hỗ trợ quản lý tác vụ

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

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

MySQL: case vs. if vs. if function

mysql

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

Bạn đã bao giờ tự hỏi: Trong MySQL, câu lệnh CASE, câu lệnh IF và hàm IF khác nhau thế nào? Bạn có thấy phân vân khi chọn một trong ba thứ trên để viết query? Đây không phải câu hỏi mới nhưng nhiều bạn sẽ bỡ ngỡ khi tiếp xúc với nó. Nhất là khi bạn vừa bắt đầu tìm hiểu về MySQL và cơ sở dữ liệu quan hệ.

  Kinh nghiệm vận hành MySQL - Chú ý khi chọn MySQL làm database
  PHP & MySQL: Novice to Ninja, 5th Edition

Nếu bạn muốn tìm hiểu cơ sở dữ liệu là gì và có những loại nào, hãy tham khảo bài viết này.

Cú pháp

Câu lệnh CASE

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

Câu lệnh IF

IF condition1 THEN
   {...statements to execute when condition1 is TRUE...}

[ ELSEIF condition2 THEN
   {...statements to execute when condition1 is FALSE and condition2 is TRUE...} ]

[ ELSE
   {...statements to execute when both condition1 and condition2 are FALSE...} ]

END IF;

Hàm IF

IF(expr1,expr2,expr3)

Đào sâu hơn

Nhìn vào cú pháp trên đây, ta có thể thấy, dường như hàm IF ít linh hoạt hơn câu lệnh CASE. Nếu bạn viết thế này:

SELECT IF(movie = 'The Matrix', 'high', 'low') AS suggestion

Thì bạn hoàn toàn có thể dùng CASE như thế này:

SELECT CASE WHEN movie = 'The Matrix' THEN 'high' ELSE 'low' END AS suggestion

Khá là giống nhau đúng không? Trừ việc hàm IF trông gọn gàng hơn chút ít. Nhưng nếu có nhiều hơn hai nhánh thì sao? Có lẽ bạn sẽ không muốn viết thế này:

SELECT IF(movie = 'The Matrix', 'high', IF(movie = 'Endgame', 'medium', 'low')) AS suggestion

Mà nên là thế này:

SELECT CASE movie 
    WHEN = 'The Matrix' THEN 'high'
    WHEN = 'Endgame'    THEN 'medium'
    ELSE 'low'
END AS suggestion

Nó cũng tương tự như khi ta dùng switch để rẽ nhánh vậy, tự nhiên vào thoải mái hơn rất nhiều.

Có một điều bạn phải chú ý. Trong khi câu lệnh CASE là câu lệnh chuẩn của SQL thì hàm IF lại hoàn toàn không phải. Điều đó có nghĩa gì? Nếu bạn có ý định chuyển sang dùng SQL Server hay PostgreSQL chẳng hạn, hàm IF sẽ không còn hoạt động nữa.

Ở một diễn biến khác, câu lệnh IF là cái gì đó rất lạ lẫm với hai thứ trên. Nó được dùng khi viết thủ tục (procedure). Ví dụ:

CREATE FUNCTION get_suggestion (movie varchar(50))
RETURNS varchar(20)
BEGIN
   IF movie = 'The Matrix' THEN
      return 'high';
   ELSEIF movie = 'Endgame' THEN
      return 'medium';
   ELSE
     return 'low';
   END IF;
END;

Do đó, chớ nên nhầm lẫn mục đích sử dụng của câu lệnh IF với hàm IF, hay thậm chí câu lệnh CASE. Chúng sinh ra vì những “sứ mệnh” khác nhau.

Generate fake UUID cực kì đơn giản

Generate fake UUID cực kì đơn giản

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

UUID là viết tắt của Universally Unique IDentifier. Mình chỉ hiểu đơn giản đây là một mã định danh duy nhất là một số gồm 128bit. Tổng cộng có 32 kí tự chia thành 5 phần cách nhau bởi 4 dấu gạch nối đơn cử

123e4567-e89b-12d3-a456-426655440000

Để generate ra một UUID thì bạn hoàn toàn có thể dùng 1 package nào đó mà khỏi cần nghĩ nhiều, nhưng mình sẽ tự generate ra 1 fake uuid bằng cách random ra một slice byte gồm 16 phần tử (8 bit) và sau đó để cho đẹp mắt thì mình sẽ convert hệ thập phân về base16.

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer

  10 câu nói cực hay về lập trình

Vì sao là 16 phần tử và base 16. Thứ nhất mình muốn các kí tự trong uuid là chữ hoặc số A-Z 0–9, cộng thêm cty mình đang làm 1 dự án mang tên là HexSafe, mà hex là hexadecimal thập lục phân là 16 luôn. Và nếu số 8bit phân sang base16 thì chỉ tốn hai char nên mình sẽ random 16 số 8 bit.

b := make([]byte, 16)
_, err := rand.Read(b)	
if err != nil {
   return "", err
}

Sau đó mình sẽ lấy 4 số cho phần đầu, tiếp theo là 2,2,2 và cuối cùng là 6 số,

để chuyển qua hex thì quá easy luôn. Có sẵn fmt.Sprintf(“%X”,n) để convert n về base16 dạng in hoa.

fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]), nil

Mình có kết quả sau 3 lần generate

CB0C7CF2-B9C0-9133-0C6B-0EB0380305D8 <nil>
FA18D239-BF14-4D82-B2E6-1000DA7870AF <nil>
EDB05EC8-8AB1-E994-6E7E-67AB30708872 <nil>

Mặc dù là fake uuid, trên lý thuyết là có thể trùng lẫn nhau xác xuất 1/(256¹⁶)
và nếu nó xảy ra thì thôi ý trời :)) đến UUID còn có thể trùng nhau cơ mà.

Đây là full đoạn code gen uuid của mình.

package main
import (
   "crypto/rand"
   "fmt"
)
func main() {
   f.mt.Println(uuid())
   fmt.Println(uuid())
   fmt.Println(uuid())
}
func uuid() (string, error) {
   b := make([]byte, 16)
   _, err := rand.Read(b)
   if err != nil {
    return "", err
   }
   return fmt.Sprintf("%X-%X-%X-%X-%X", b[0:4], b[4:6], b[6:8],b[8:10], b[10:]), nil
}

Happy coding ^_^

Nguồn : https://twitter.com/pliutau

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

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

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

Các cách khai báo function trong JS

Khai báo function trong javascript

Bài viết được sự cho phép của tác giả Lưu Bình An

Khai báo tường minh

Cách khai báo function “vở lòng” mà ai cũng phải biết, sau từ khóa function là tên function chúng ta muốn khai báo

  5 kinh nghiệm khi viết arrow function
  5 điểm khác nhau giữa function thường và arrow function
function foo() {
	console.log(‘vui lap trinh’)
}

Gán function vào một biến

Chúng ta khai báo một biến, gán giá trị của biến này là một function

const foo = function () {
	console.log(‘vui lap trinh’)
}

Với cách này, lưu ý là không dùng function trước khi khai báo, giống như chúng ta không thể dùng một biến mà chưa được khai báo vậy.

foo(); // Uncaught ReferenceError: foo is not defined

const foo = function() {
   console.log(‘vui lap trinh’)

}

Arrow function

Khai báo function bằng dấu => mũi tên, bên trái là params của function, bên phải là phần ruột function

() => console.log(‘vui lap trinh’)

// hoặc bỏ luôn ngoặc kép
[‘An’, ‘luckyluu’, ‘vui’, ‘laptrinh’]
  .filter(name => name.length > 5)
  .map(name => name.toLowerCase())

Lưu ý cho arrow function, sẽ không có

  • object đặc biệt arguments, các function khác sẽ có cái object tên là arguments chứa các tham số truyền vào cho function đó
  • Ko có gọi new (() => {})
  • Không có thissupernew.target

constructor

Ko được khuyến khích sử dụng, đọc cho vui

const myStrangeFunc = new Function("a", "console.log(a + ' with Functions')");
myStrangeFunc("Fun"); // logs --> "Fun with Functions"

3 thằng còn lại, cũng không phổ biến, chưa thấy giá trị sử dụng

  • generator function expression
  • generator function declaration
  • GeneratorFunction constructor

    Nếu có đam mê bạn có thể tìm hiểu thêm

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

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

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

Tổng hợp 15+ CV Template IT đẹp và chuyên nghiệp

CV Template IT
CV Teamplate IT

CV đóng một vai trò rất quan trọng đối với việc thu hút nhà tuyển dụng. Một CV Template IT đúng chuẩn lại giúp gia tăng nhiều hơn các lợi thế ở ứng viên. Vậy liệu dân lập trình IT đã có những hình dung chính xác về CV online IT hay chưa? Cùng TopDev điểm qua top các mẫu CV Template IT (IT CV Template) đẹp chuẩn.

Những lưu ý ban đầu về CV Template IT

Dù đó là CV cho sinh viên IT mới ra trường hay CV ứng tuyển các vị trí Junior Developer, Senior Developer,… bạn vẫn phải đầu tư cho CV IT Developer của mình. Nó là tài liệu quan trọng ghi dấu ấn trong sự nghiệp phát triển của bạn. Đồng thời, dựa trên các thông tin bạn truyển tải, nhà tuyển dụng có thể đánh giá được các tiêu chí về trình độ, năng lực, tiềm năng phát triển,…

  Cách viết CV giúp lập trình viên ghi điểm với nhà tuyển dụng
  5 mẹo và mẫu CV IT để gây ấn tượng với nhà tuyển dụng!

Hãy lưu tâm vấn đề này để CV Template IT của bạn chuẩn format, Phải nhớ nó không giống sơ yếu lý lịch đơn thuần. CV ngành IT nhấn mạnh các giá trị nổi bật về kỹ năng, trình độ chuyên môn, quan điểm – mục tiêu,… 

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Lợi thế điểm nhấn có thể đến từ các lưu ý về kỹ năng và các khoa học chuyên sâu dưới đây:

Kỹ năng (Skills)

Kỹ năng duy trì các ứng dụng phần mềm khoa học hiện. Phát triển các ứng dụng mới hơn.

Kết nối và chia sẻ kinh nghiệm áp dụng các nguyên tắc, chiến thuật phát triển dựa trên các nền tảng lý thuyết.

Kỹ năng phân tích, xử lý – giải quyết vấn đề.

Kỹ năng giao tiếp 

Đây là các kỹ năng khá quan trọng mà bạn cần bổ sung vào IT CV Template.

Tạo CV IT chuẩn ATS miễn phí trên TopDev

Các khóa học chuyên sâu (Specialize Courses)

+ Phát triển phần mềm (Software Development)

+ Coding cơ bản và nâng cao (Coding Basics, Advanced)

+ Quản lý dự án (IT Project Management)

+ An ninh Mạng (Cyber Security)

+ Quản lý bảo trì thiết bị (CMMS)

+ Xử lý sự cố (Troubleshooting)

Và các khóa học khác…

15+ IT CV Template chuẩn chuyên nghiệp nhất

Mẫu Template IT chuẩn 

CV cho sinh viên IT mới ra trường
M1 – CV Template đa nhiệm
Senior Developer
M2 – CV Template đa nhiệm
CV ngành IT
M3- CV Template đa nhiệm
CV cho sinh viên IT mới ra trường
CV Pro 1
Senior Developer
CV Pro 2
cv ngành IT
M1 – CV cổ điển
CV cho sinh viên IT mới ra trường
M2 – CV cổ điển

IT Programmer CV 

Senior Developer
IT Programmer CV

Data Scientist

CV ngành IT
Data Scientist

Fullstack Developer

CV cho sinh viên IT mới ra trường
Fullstack Developer

CV IT Manager

Senior Developer
CV IT Manager

IT Project Manager

CV ngành IT
IT Project Manager

Java Developer

CV cho sinh viên IT mới ra trường
Java Developer

Networking Engineer

Senior Developer
Networking Engineer

PHP Developer

CV ngành IT
PHP Developer

Product Manager

CV cho sinh viên IT mới ra trường
Product Manager

Data Analyst

Senior Developer
Data Analyst

UX Designer

CV ngành IT
UX Designer

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

Xem thêm Top Việc làm Developer trên TopDev

Toán tử instanceof trong Java

Toán tử instanceof trong Java

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

Toán tử instanceof trong Java là một toán tử được sử dụng để kiểm tra xem đối tượng này có phải là instance của một class hay interface nào đó hay không? Kết quả trả về của toán tử này sẽ là true nếu đối tượng đó là thể hiện của class mà các bạn đang check, ngược lại thì false.

Tuyển lập trình viên Java nhiều công ty HOT

Ví dụ, mình có một class Application như sau:

package com.huongdanjava.java;

public class Application {

public static void main(String[] args) {
Application application = new Application();
System.out.println(application instanceof Application);
}

}

Trong hàm main() của class này, mình initialize một đối tượng của class Application và sử dụng toán tử instanceof để kiểm tra xem đối tượng này có phải là instance của class Application này hay không? Các bạn sẽ thấy kết quả sẽ như sau:

Toán tử instanceof trong Java

Nếu các bạn viết code như sau:

package com.huongdanjava.java;

public class Application {

public static void main(String[] args) {
Application application = new Application();
System.out.println(application instanceof String);
}

}

thì IDE sẽ báo lỗi ngay:

Toán tử instanceof trong Java

Đây là trong trường hợp quá tường minh, quá rõ ràng, IDE có thể báo lỗi cho các bạn biết ngay.

Nhưng nếu bạn có một interface với hai implementation như sau:

package com.huongdanjava.java;

public interface Shape {

}
package com.huongdanjava.java;

public class Rectangle {

}

thì lúc này nếu các bạn initialize đối tượng của class Triangle nhưng lại đi kiểm tra đối tượng này có phải là thể hiện của class Rectangle,

package com.huongdanjava.java;

public class Application {

public static void main(String[] args) {
Shape shape = new Triangle();

System.out.println(shape instanceof Rectangle);
}

}

IDE sẽ không thể detect lỗi lúc compile time nhưng khi chạy các bạn sẽ thấy kết quả như sau:

Toán tử instanceof trong Java

Chúng ta sẽ thường sử dụng toán tử instanceof trong trường hợp kiểm tra xem tham số truyền vào của một phương thức có phải là instance của một class nào đó hay không? Ví dụ như:

private void check(Shape shape) {
    if (shape instanceof Triangle) {
        Triangle triangle = (Triangle) shape;

        System.out.println("This is triangle: " + triangle.toString());
    }
}

Kết quả:

package com.huongdanjava.java;

public class Application {

private void check(Shape shape) {
if (shape instanceof Triangle) {
Triangle triangle = (Triangle) shape;

System.out.println("This is triangle: " + triangle.toString());
}
}

public static void main(String[] args) {
Application application = new Application();
application.check(new Triangle());
}

}

Toán tử instanceof trong Java

Từ Java 14, các bạn có thể viết lại phương thức check() sử dụng pattern matching instanceof, đơn giản như sau:

private void check(Shape shape) {
    if (shape instanceof Triangle triangle) {
        System.out.println("This is triangle: " + triangle.toString());
    }
}

Với cách viết mới, chúng ta không cần viết thêm một dòng code để cast instance về đối tượng mà chúng ta muốn nữa. Tất cả sẽ được thực hiện trong dòng lệnh if.

Kết quả vẫn như vậy:

Toán tử instanceof trong Java

Bài viết gốc được đăng tải tại huongdanjava.com
Có thể bạn quan tâm:

Hướng dẫn sử dụng Factory trong Design Pattern

Hướng dẫn sử dụng Factory trong Design Pattern

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

Xin chào các bạn, bài viết hôm nay mình sẻ giới thiệu đến các bạn Factory Design Pattern dùng thế nào trong lập trình C#, Winform.

[C#] How to using Factory Design Pattern

Factory Pattern  là một design pattern thuộc nhóm khởi tạo (Creational patterns).

Pattern này được sinh ra nhằm mục đích khởi tạo một đối tượng mới mà không cần thiết phải chỉ ra một cách chính xác class nào sẽ được khởi tạo.

  30 tiện ích Chrome cho designer và dev
  9 công cụ siêu tiện lợi cho cả Developer và Designer

Factory Method Pattern giải quyết vấn đề này bằng cách định nghĩa một factory method cho việc tạo đối tượng, và các lớp con thừa kế có thể override phương thức này để chỉ rõ đối tượng nào sẽ được khởi tạo.

Hướng dẫn sử dụng Factory trong Design Pattern

Bây giờ, mình sẽ có một ví dụ, cho các bạn dễ hiểu về factory design pattern này.

Mình có yêu cầu viết một ứng dụng, nạp tiền điện thoại cho các mạng điện thoại Việt Nam: Mobifone, VinaPhone, Viettel, Vietnamobile, Gmobile.

Request yêu cầu gởi đến ứng dụng của chúng ta gồm 2 tham số: số thoại cần nạp tiền và số tiền.

Thường trong bài viết này, chúng ta sẽ sử dụng một thiết bị modern GMS và sử dụng tập lệnh AT-Command xài lệnh USSD để nạp tiền vào tài khoản cho người dùng.

Nhưng có rắc rối ở đây là mỗi nhà mạng, đều có cấu trúc kiểm tra số dư tài khoản, hay cú pháp nạp tiền đều khác nhau.

Vậy làm sao khi gởi đến chúng ta sẽ điều hướng cho từng class nhà mạng.

Sơ đồ Design Pattern:

Hướng dẫn sử dụng Factory trong Design Pattern

Đầu tiên, mình sẽ tạo một InterFace INetwork.cs C#:

namespace FactoryPatternDemo
{
    public interface INetwork
    {
        string GetNameNetWork();
        string CheckAccountMoney();
        string GetCarrierNumber();

    }
}
C#

Trong này mình khai báo ba phương thức sẵn: lấy tên nhà mạng, kiểm tra số dư tài khoản, và lấy đầu số của mỗi nhà mạng.

Tiếp đến mình sẽ tạo 5 class cho mỗi nhà mạng: viettel.cs, mobifone.cs, vinaphone.cs, vietnamobile.cs, gmobile.cs

Mỗi class này mình đều implement đến interface INetwork

  1. Viettel.cs
class Viettel : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "086, 096, 097, 098, 032, 033, 034, 035, 036, 037, 038, 039";
    }

    public string GetNameNetWork()
    {
        return "VIETTEL";
    }
    
}
C#

2. Mobifone.cs

class Mobifone : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "090, 093, 0120, 0121, 0122, 0126, 0128, 089";
    }

    public string GetNameNetWork()
    {
        return "MOBIFONE";
    }
}
C#

3. Vinaphone.cs

public class Vinaphone : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "091, 094, 083, 084, 085, 081, 082";
    }

        public string GetNameNetWork()
    {
        return "VINAPHONE";
    }
}
C#

4. Vietnamobile.cs

public class Vietnamobile : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "092, 056, 058";
    }

    public string GetNameNetWork()
    {
        return "VIETNAMOBILE";
    }
}
C#

5. Gmobile.cs

public class Gmobile : INetwork
{
    public string CheckAccountMoney()
    {
        return "*101#";
    }

    public string GetCarrierNumber()
    {
        return "099, 059";
    }

    public string GetNameNetWork()
    {
        return "GMOBILE";
    }
}
C#

Tiếp đến mình sẽ tạo một Enum NetworkType.cs

public enum NetworkType
{
    VIETTEL,
    MOBIFONE,
    VINAPHONE,
    VIETNAMOBILE,
    GMOBILE,
}
C#

Tạo một class abstract NetworkFactory.cs:

public abstract class NetworkFactory
{
    public abstract INetwork Create(NetworkType type);
}
C#

Tiếp đến là một class ConcreteCreator.cs để điều hướng cho từng nhà mạng:

class ConcreteCreator : NetworkFactory
{
    public override INetwork Create(NetworkType type)
    {
        switch (type)
        {
            case NetworkType.VIETTEL:
                return new Viettel();
               
            case NetworkType.MOBIFONE:
                return new Mobifone();

            case NetworkType.VINAPHONE:
                return new Vinaphone();

            case NetworkType.VIETNAMOBILE:
                return new Vietnamobile();

            case NetworkType.GMOBILE:
                return new Gmobile();
            default: 
                throw new ArgumentException("Invalid type", "type");

        }
    }
}
C#

Và bây giờ chúng ta sẽ sử dụng hàm trong form program.cs

namespace FactoryPatternDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var factory = new ConcreteCreator();
            INetwork viettel = factory.Create(NetworkType.VIETTEL);
            Console.WriteLine(viettel.GetNameNetWork());
            Console.WriteLine(viettel.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork vinaphone = factory.Create(NetworkType.VINAPHONE);
            Console.WriteLine(vinaphone.GetNameNetWork());
            Console.WriteLine(vinaphone.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork mobiphone = factory.Create(NetworkType.MOBIFONE);
            Console.WriteLine(mobiphone.GetNameNetWork());
            Console.WriteLine(mobiphone.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork vietnamobile = factory.Create(NetworkType.VIETNAMOBILE);
            Console.WriteLine(vietnamobile.GetNameNetWork());
            Console.WriteLine(vietnamobile.GetCarrierNumber());
            Console.WriteLine("===========================================");

            INetwork gmobile = factory.Create(NetworkType.GMOBILE);
            Console.WriteLine(gmobile.GetNameNetWork());
            Console.WriteLine(gmobile.GetCarrierNumber());

            Console.ReadLine();
        }
    }
}
C#

Và dưới đây là kết quả khi chúng ta chạy ứng dụng:

Hướng dẫn sử dụng Factory trong Design Pattern

Bây giờ, các bạn muốn viết hàm gì chung xử lý cho từng nhà mạng điện thoại, các bạn chỉ cần khai báo tên hàm vào Interface INetwork.cs.

Và sau đó các bạn vào từng class nhà mạng Override lại phương thức để thực hiện theo mong muốn của mình.

Hy vọng bài viết sẽ giúp ích được cho các bạn.

Thanks for watching!

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

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

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

9+ cách để xóa một phần tử ra khỏi JavaScript Array

9+ cách để xóa một phần tử ra khỏi JavaScript Array

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

Mảng JavaScript cho phép bạn nhóm các giá trị và lặp lại chúng. Bạn có thể thêm và loại bỏ các phần tử mảng theo những cách khác nhau. Thật không may, không có một phương thức Array.remove đơn giản để loại bỏ phần tử nào đó ra khỏi mảng.

Vậy, làm thế nào để bạn xóa một phần tử khỏi mảng JavaScript?

Thay vì phương thức xóa, mảng JavaScript có nhiều cách bạn có thể xóa các giá trị mảng.

1. Xóa các phần tử ở cuối mảng Javascript

1.1 Dùng cách set lại độ dài của mảng

Các phần tử mảng JavaScript có thể được loại bỏ khỏi phần cuối của mảng bằng cách đặt thuộc tính độ dài thành giá trị nhỏ hơn giá trị hiện tại. Bất kỳ phần tử nào có chỉ số lớn hơn hoặc bằng độ dài mới sẽ bị xóa.

var ar = [1, 2, 3, 4, 5, 6];
ar.length = 4; // đặt độ dài để xóa bớt phần tử ở cuối
console.log( ar ); //  [1, 2, 3, 4]

1.2 Dùng pop()

Phương thức pop loại bỏ phần tử cuối cùng của mảng, trả về phần tử đó và cập nhật thuộc tính độ dài. Phương thức pop sửa đổi mảng mà nó được gọi, Điều này có nghĩa là nó không giống như cách trên mà phần tử cuối cùng được loại bỏ hoàn toàn và chiều dài mảng giảm đi.

var ar = [1, 2, 3, 4, 5, 6];
ar.pop(); // returns 6
console.log( ar ); // [1, 2, 3, 4, 5]

2. Xóa các phần tử ở đầu mảng Javascript

Làm thế nào để bạn loại bỏ phần tử đầu tiên của một mảng JavaScript?

Phương thức shift hoạt động giống như phương thức pop ngoại trừ việc loại bỏ phần tử đầu tiên của mảng JavaScript thay vì phần tử cuối cùng.

Không có tham số vì phương thức shift chỉ loại bỏ phần tử mảng đầu tiên. Khi phần tử được loại bỏ, các phần tử còn lại được chuyển xuống.

var ar = ['zero', 'one', 'two', 'three'];
ar.shift(); // returns "zero"
console.log( ar ); // ["one", "two", "three"]

Phương thức shift trả về phần tử đã bị xóa, cập nhật các chỉ mục của các phần tử còn lại và cập nhật thuộc tính độ dài. Nó sửa đổi mảng mà nó được gọi.

Nếu không có phần tử hoặc độ dài mảng bằng 0, phương thức trả về undefined.

Xem ngay các tin tuyển dụng Javascript mới nhất tại TopDev

3. Sử dụng Splice

Phương thức Splice có thể được sử dụng để thêm hoặc xóa các phần tử khỏi một mảng.

  1. Đối số đầu tiên chỉ định vị trí bắt đầu thêm hoặc xóa các phần tử.
  2. Đối số thứ hai chỉ định số lượng phần tử cần loại bỏ.
  3. Các đối số thứ ba và tiếp theo là tùy chọn; họ chỉ định các phần tử được thêm vào mảng.

3.1 Xóa một mảng phần tử

Ở đây, mình sử dụng phương thức Splice để loại bỏ hai phần tử, bắt đầu từ vị trí ba (chỉ số dựa trên zero):

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
var removed = array.splice(2,2);

/*
removed === [3, 4]
array === [1, 2, 5, 6, 7, 8, 9, 0]
*/

3.2 Xóa phần tử bằng giá trị của nó

Tham số thứ nhất chỉ định vị trí bắt đầu, trường hợp hay gặp nhất đó là xóa một phần tử bằng giá trị của phần tử đó

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];

for( var i = 0; i < array.length-1; i++){ 
   if ( array[i] === 5) {
     arr.splice(i, 1); 
   }
}

//=> [1, 2, 3, 4, 6, 7, 8, 9, 0]

Đây là một ví dụ đơn giản trong đó các phần tử là số nguyên. Nếu bạn có một mảng các đối tượng, bạn sẽ cần một skill nặng đô hơn.

Một cách khác, sử dụng indexOf

var ar = ['zero', 'one', 'two', 'three'];
ar.splice(ar.indexOf('one'), 1);
console.log( ar ); // ["zero", "two", "three"]
  Crawl dữ liệu bằng JavaScript ngay trên trình duyệt

4. Sử dụng Array.filter xóa phần tử bằng giá trị

Không giống như phương thức splice()filter() tạo ra một mảng mới. filter() không làm thay đổi mảng mà nó được gọi, nhưng trả về một mảng mới.

filter() có một tham số duy nhất, một phương thức gọi lại (callback function). Cuộc gọi lại được kích hoạt khi phương thức lọc lặp qua các phần tử mảng. Nó sẽ chuyển ba giá trị cho hàm gọi lại:

  1. giá trị hiện tại hoặc phần tử
  2. chỉ mục mảng hiện tại
  3. và mảng đầy đủ.

Phương thức gọi lại sẽ trả về đúng hoặc sai. Bạn có trách nhiệm kiểm tra giá trị (phần tử) để xem nó có đáp ứng tiêu chí của bạn không. Nếu nó bạn có thể trả lại true. Các phần tử trả về true được thêm vào mảng mới được lọc.

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];

var filtered = array.filter(function(value, index, arr){
    return value > 5;
});

//kết quả filtered => [6, 7, 8, 9]
//mảng array vẫn giữ nguyên => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

Bạn nên lưu ý một mảng mới chứa các giá trị khớp với filter được trả về. Mảng ban đầu thì không bị ảnh hưởng. Mình thấy điều này hữu ích vì mình thường muốn giữ lại dữ liệu gốc, nhưng truy xuất các tập hợp con để xử lý các nhu cầu logic khác nhau.

  JavaScript là gì? Làm thế nào để trở thành lập trình viên JavaScript?

5. Phương thức remove trong Lodash

Đôi khi các thư viện tiện ích là cách tốt nhất để giải quyết các vấn đề phức tạp hơn. Lodash cung cấp một tập hợp phong phú các phương thức thao tác mảng, trong đó có phương thức remove().

Phương thức remove() hoạt động giống như phương thức filter(), nhưng sắp xếp ngược lại. Nó không lưu các giá trị mảng ban đầu, nhưng loại bỏ các phần tử khớp với điều kiện. Và cuối cùng, nó trả về các phần tử phù hợp như là một mảng mới.

var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
  return n % 2 === 0;
});

console.log(array);
// => [1, 3]

console.log(evens);
// => [2, 4]

6. Tự tạo phương thức xóa

Như đã nói ở đầu bài viết, không có phương thức chuyển để xóa phần tử khỏi mảng kiểu như Array.remove(). Phương pháp Lodash giải quyết được vấn đề này, nhưng không phải lúc nào bạn cũng muốn sử dụng Lodash. Điều này không có nghĩa là bạn không thể tạo ra một phương thức tiện ích cho riêng mình.

function arrayRemove(arr, value) {
   return arr.filter(function(ele){
       return ele != value;
   });
}

var result = arrayRemove(array, 6);
// result = [1, 2, 3, 4, 5, 7, 8, 9, 0]

Ví dụ trên chỉ đơn giản, bạn có thể sửa đổi cho phù hợp với nhu cầu của bạn, nhưng có lẽ filter() vẫn là ổn nhất

  Giới thiệu Fetch API trong Javascript

7. Loại bỏ chính xác phần tử bằng toán tử delete

Bạn có thể xóa các thành phần mảng cụ thể bằng cách sử dụng toán tử delete:

var ar = [1, 2, 3, 4, 5, 6];
delete ar[4]; // xóa phần tử có chỉ số index là 4
console.log( ar ); // [1, 2, 3, 4, undefined, 6]
alert( ar ); // 1,2,3,4,,6

Sử dụng toán tử delete không ảnh hưởng đến thuộc tính độ dài. Nó cũng không ảnh hưởng đến các chỉ số của các element tiếp theo. Mảng trở nên thưa thớt, đó là một cách thú vị để nói rằng mục bị xóa không bị xóa mà trở nên không xác định. So sánh cách sử dụng delete với phương thức splice() được mô tả dưới đây.

Toán tử delete được thiết kế để xóa các thuộc tính khỏi các đối tượng JavaScript, mà các mảng là các đối tượng.

Lý do phần tử không thực sự bị xóa khỏi mảng là toán tử delete liên quan đến giải phóng bộ nhớ hơn là xóa một phần tử. Bộ nhớ được giải phóng khi không còn tham chiếu đến giá trị.

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

Xem thêm các vị trí tuyển dụng IT hấp dẫn tại TopDev

Cơ hội trải nghiệm môi trường làm việc tại Top 6 công ty công nghệ Hàn Quốc cho các lập trình viên Việt

Cơ hội trải nghiệm môi trường làm việc tại top 6 công ty công nghệ Hàn Quốc cho các lập trình viên Việt

Thị trường IT Việt Nam ngày càng phát triển và trở nên năng động hơn. Đó là một phần lý do để thu hút một lượng lớn doanh nghiệp công nghệ nước ngoài đầu tư vào Việt Nam, tiêu biểu trong số đó là các công ty của Hàn Quốc.

Bên cạnh đó, qua “cái bắt tay” chiến lược giữa Korea IT Cooperation Center tại TP. HCM (KICC HCMC) và Nền tảng tuyển dụng chuyên về IT hàng đầu Việt Nam – TopDev, các lập trình viên Việt càng có nhiều lựa chọn hơn khi tìm kiếm nơi làm việc phù hợp, đặc biệt nhất chính là cơ hội trải nghiệm môi trường làm việc “chuẩn” quốc tế cùng nhiều công nghệ tiên tiến đến từ Hàn Quốc.

Hãy cùng khám phá Top 6 công ty công nghệ đến từ Hàn Quốc xuất hiện trong kỳ này để bắt lấy cơ hội cho chính mình bạn nhé!

1. Total Software Bank VietNam

Ra đời vào năm 1998, Total Soft Bank Ltd (TSB) là công ty chuyên cung cấp các giải pháp maritime logistics thông qua việc áp dụng công nghệ tiên tiến hàng đầu cùng đội ngũ phát triển giàu kinh nghiệm chuyên môn. Một số giải pháp tiêu biểu của công ty như: tự động hóa tàu biển, các giải pháp cảng,…

⇒ Bạn vừa ra trường và muốn trải nghiệm làm việc tại công ty thuộc lĩnh vực logistics thì Total Soft Bank Vietnam chính là “đáp án” dành cho bạn!

⇒ Hãy sẵn sàng “bùng nổ” năng lực, cùng chinh phục những thử thách giúp nâng cao tay nghề từ Total Soft Bank Vietnam với vị trí Fresher Software Developer

2. LOTTE Data Communication

Được thành lập từ năm 2009, LOTTE Data Communication Việt Nam đóng vai trò cung cấp hầu hết các giải pháp và Dịch vụ IT cho các công ty con thuộc Tập đoàn LOTTE đang kinh doanh tại Việt Nam. Kế thừa tất cả tinh hoa từ Công ty mẹ, LOTTE Data Communication Việt Nam kết nối và phát triển mạng lưới khách hàng thuộc mọi lĩnh vực từ Bán lẻ, Sản xuất đến Tài chính, Dịch vụ Công… bằng những giải pháp bắt kịp xu hướng Công nghệ của thế giới như Triển khai hệ thống ra vào cho cao ốc, An Ninh nhận diện khuôn mặt, Smart Parking, Thu phí tự động,…

LOTTE Data Communication Việt Nam đem đến nhiều cơ hội phát triển sự nghiệp cho các Lập trình viên tài năng. Cùng khám phá những vị trí hấp dẫn mà bạn không nên bỏ lỡ:

3. Hanbisoft

Hanbisoft là công ty chuyên cung cấp các dịch vụ máy tính tùy chỉnh cho doanh nghiệp, giúp các hoạt động quản lý: nhân sự, kế toán, thuế, vận chuyển hàng hóa, mua bán,…trở nên dễ dàng hơn.

Tự hào với môi trường làm việc chuyên nghiệp, Hanbisoft sẽ là nơi các lập trình viên có thể bùng nổ năng lực qua các dự án phát triển ứng dụng di động và phần mềm chất lượng.

⇒ Bạn muốn tìm kiếm môi trường làm việc ổn định, lâu dài cùng cơ hội học hỏi các công nghệ mới nhất? Hãy thử khám phá vị trí React Native Developer tại Hanbisoft, biết đâu đây chính là “bến đỗ” phù hợp với tài năng của bạn!

4. VNIB Tech

Được thành lập từ năm 2016, VNIB Tech là công ty chuyên cung cấp các phần mềm trên nền tảng di động (iOS, Android) và web. Hoạt động với sứ mệnh mang thế giới đến gần nhau hơn bằng công nghệ, VNIB Tech không ngừng cải tiến chất lượng, đem đến cho khách hàng những sản phẩm và giải pháp tối ưu nhất. Đây cũng chính là cơ hội cho các tài năng công nghệ trải nghiệm môi trường làm việc chuyên nghiệp tại công ty đến từ Hàn Quốc và gặt hái thành công.

Bạn đã sẵn sàng chinh chiến cùng VNIB Tech trong những dự án đầy thách thức? Khám phá ngay loạt vị trí hứa hẹn cho bạn cơ hội bứt phá sự nghiệp:

5. Mintpot

Mintpot Việt Nam là thành viên của Minpot, có trụ sở chính tại Hàn Quốc, và là một trong những công ty sáng tạo thông minh, chuyên cung cấp các dịch vụ video VR có phụ đề Mint VR với ước mơ tạo ra một cuộc sống tốt hơn với VR.

Đến với Mintpot, ngoài mức lương cực hấp dẫn, bạn còn có nhiều cơ hội thăng tiến và phát triển không giới hạn. Nếu bạn đang tìm kiếm “bến đỗ” cho sự nghiệp và đã sẵn sàng tạo cú hích mới cho bản thân? Vậy Mintpot chính là câu trả lời tốt nhất cho bạn..

Đừng bỏ lỡ cơ hội! Gia nhập Mintpot ngay với 1 trong 3 vị trí hấp dẫn đang chờ bạn trực tiếp trải nghiệm:

6. Genuwin Solution

Genuwin là công ty thuộc top đầu trong ngành lập trình phần mềm quản lý nhân sự, kế toán, quản lý sản xuất, nhà hàng khách sạn, sân golf, trường học quốc tế, liên kết thanh toán với hệ thống ngân hàng Hàn Quốc Shinhan Bank với mạng lưới khách hàng trải dài khắp Việt Nam và các nước như Campuchia, Indonesia, Hàn Quốc…

Với đội ngũ nhân viên chuyên nghiệp, tận tâm và có năng lực, trách nhiệm cao, Genuwin ngày càng phát triển và từng bước trở thành một trong những nhà cung cấp và phát triển hệ thống quản lý (ERP) hàng đầu.

Và nếu bạn là ERP Developer đang tìm kiếm cơ hội phát triển sự nghiệp qua các dự án phát triển hệ thống ERP, đừng ngần ngại click apply để gia nhập Genuwin Solution ngay hôm nay. 

Đường đua công nghệ tại Việt Nam đang nóng hơn bao giờ hết! Với sự xuất hiện của Top 6 công ty công nghệ Hàn Quốc, hy vọng bạn sẽ lựa chọn được “bến đỗ” phù hợp và sẵn sàng cháy hết mình với đam mê lập trình!

⇒ Và đừng quên, KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!

________________________________

Dự án được hỗ trợ bởi Korea IT Cooperation Center tại TP. HCM (KICC HCMC) – thuộc Cơ quan Xúc tiến CNTT Hàn Quốc (NIPA), phối hợp cùng TopDev – Nền tảng tuyển dụng CNTT hàng đầu tại Việt Nam với mục đích thúc đẩy tuyển dụng việc làm CNTT cũng như quảng bá cho các công ty IT Hàn Quốc trong cộng đồng lập trình viên lớn nhất tại Việt Nam.

Liên hệ: Korea IT Cooperation Center tại TP. HCM (KICC HCMC)

☎️ Hotline: 84 28 35208135 (Vietnamese) | 84 28 35208136 (Korean)

E-mail: HCMC@nipa.kr

Address:135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Senior Developer là gì? Những điều thú vị về Senior Developer

Senior Developer
Senior Developer

Senior Developer là gì? Có gì khác so với Junior Senior hay Fresher? Tuyển dụng IT đã có những tên gọi riêng nhằm phân loại các vị trí khác nhau. Senior Developer là một trong số đó. Tuy nhiên, bạn đã có cách hiểu chính xác về thuật ngữ này chưa? Cùng TopDev tìm hiểu tất tần tật về Senior Developer qua bài viết sau! 

Senior Developer là gì? 

Nhiều định nghĩa đã được đưa ra về cách hiểu Senior Developer? Vậy Senior Developer thật sự là gì? Trước hết hãy cùng tìm hiểu sơ lược về thế nào là Senior?

Bạn biết gì về thuật ngữ Senior?

Senior là gì? Senior được biết đến là một thuật ngữ mô tả các cá nhân sở hữu nhiều kinh nghiệm (cả về kỹ năng chuyên môn và trải nghiệm thực tế). Theo quá trình, năng lực của họ được nâng cao hơn từ nền tảng cơ sở thông qua các giai đoạn tiền phát triển trước đó như Intern, Fresher, Junior,…

Senior là gì
Senior Developer là gì?

Senior chỉ những người có thâm niên trong nghề lâu hơn. Do vậy, không quá để gọi họ là những tiền bối hoặc cấp cao. Thời gian “thăng tiến” của một Junior lên Senior đòi hỏi sự tập trung vào sự nghiệp phát triển của mỗi cá nhân.

Không có một thước đo cụ thể về thời gian. Vì nó chỉ mang tính tương đối. Đặc biệt, tùy thuộc vào từng quy mô – loại hình doanh nghiệp, việc phân loại và đánh giá một Senior sẽ dựa trên nhiều yếu tố khác nhau. 

Senior Developer là gì?

Senior Developer là thuật ngữ được quy chiều đến đối tượng là các lập trình viên cấp cao. Một thực tế là họ dễ dàng nắm bắt và làm tốt mọi thứ trong bất kỳ một giai đoạn nào của công việc ngành IT. Nắm rõ quy trình thực hiện, các khâu có liên quan; tất tần tật đều được họ điều phối và vận hành một cách trơn tru, chuyên nghiệp nhất. Đặc biệt hơn, họ lại có khả năng kết nối, trao đổi để tìm ra các mong muốn của khách hàng. 

  Con đường trở thành một Senior developer đích thực

Điểm nổi trội của Senior nằm ở nền tảng tư duy, năng lực nhận biết về quá trình thực hiện, giải quyết các nhiệm vụ. Đồng thời, họ vẫn song song tự hoàn thiện và phát triển mình lên một mức cao hơn (có thể là Senior Manager). Chính điều này kích thích họ luôn thử sức, rèn luyện bản thân để có những trải nghiệm phong phú hơn. 

Một Senior “cừ khôi” sẽ phát huy tốt óc sáng tạo, năng lực thích ứng, các kỹ năng của mình một cách thuần thục. Các lập trình viên cấp cao phải có khả năng quản lý các project, lập kế hoạch, đặt ra định hướng; dẫn dắt, hướng dẫn, hỗ trợ team để đạt được các mục tiêu đề ra.

Tố chất để trở thành một Senior Developer

Không ngại thất bại!

Một Senior Developer chắc chắn sẽ phải trải qua nhiểu áp lực. Biết đâu những thời gian đầu, bạn đã gặp lại các thất bại. CV cho sinh viên IT mới ra trường (CV IT student)  hoặc CV IT Developer của bạn không tạo được ấn tượng với nhà tuyển dụng. Hoặc khi đi làm, bạn chịu sự áp lực từ sếp, từ đồng nghiệp,…Đôi khi nó nhiều đến mức khiến bạn bị stress.

CV cho sinh viên IT mới ra trường
Senior Developer có những tố chất đặc biệt.

Áp lực từ nhiều phía và rất nhiều sự mâu thuẫn sẽ nảy sinh. Đó cũng chính là lúc bạn rơi vào trạng thái phức tạp. Ai cũng thích sự đơn giản. Nếu đã là một Senior Developer, bạn phải sống trong áp lực tổn tại của ngành lập trình.

Đừng đánh giá thấp bất cứ ai!

Đây có lẽ nghiêng về phần giá trị của nhân cách nhiều hơn. Thế nhưng, bạn phải hiểu Senior Developer chỉ là một thuật ngữ mô tả các cá nhân với bề dày kinh nghiệm. Tuy vậy, ứng với từng vị trí được phân chia cụ thể, thì mỗi Senior Developer là một mảnh ghép trong doanh nghiệp. 

Đừng bao giờ đánh giá thấp bất kỳ ai vì mỗi người đều có điểm mạnh – điểm yếu riêng. Dù bạn có là một người hoàn hảo những chắc chắn, bạn vẫn có những nỗi sợ của riêng mình. Thay vào đó, hãy học hỏi lẫn nhau để nâng cao trình độ, kỹ năng; kết nối các khía cạnh chuyên sâu để phát triển một cách toàn diện hơn.

Điểm nhấn từ sự kết nối

Xây dựng phần mềm cần có sự kết nối giữa trình độ (tức vận dụng lý thuyết khoa học chuyên ngành, trải nghiệm thực tiễn) và nhu cầu, mong muốn của khách hàng. Bên cạnh đó, sự kết nối này sẽ trở nên chặt chẽ hơn nhờ vào sự ảm hiểu các công cụ; tinh thần đồng đội, sự quản lý vận hành của tổ chức. Do đó, mỗi Senior Developer cần tìm ra sự kết nối trong mọi quy trình làm việc. Có thể mỗi sản phẩm, mỗi dự án, mội thành quả sẽ mang lại những giá trị tương xứng.

Tố chất của người lãnh đạo

Đây được xem là tố chất quan trọng. Vì nó không những giúp hình thành nên một Senior Developer giỏi mà còn quyết định đến sự phát triển nghề nghiệp.

Một Senior Developer phát triển độc lập, họ có thể làm bất cứ điều gì. Thế nhưng, để phát triển họ cần cộng tác với team. Bản thân họ tự hiểu rằng để thực hiện các nhiệm vụ lớn, họ cần một team luôn hổ trợ nhau. Một Senior Developer cần có trách nhiệm dẫn dắt đồng đội; luôn phấn đấu để cải thiện trình độ – kỹ năng của chính bản thân mình. Họ sẽ biết cách tạo điều kiện để bản thân và team của mình có thể phát triển tốt nhất.

Đặc biệt hơn, Senior Developer sẽ hiểu rằng bản thân họ không tạo ra quyền lực để buộc người khác làm việc. Họ cần sở hữu tố chất lãnh đạo để trao quyền cho mọi người. Họ phải là một đàn anh, một người dẫn dắt, một người truyền đạt kinh nghiệm để giúp mỗi cá nhân trong team đều có thể phát triển.

Nếu một team có một Senior Developer với vai trò lãnh đạo tốt, team sẽ thành công. Điều này giúp team dễ dàng đạt được những kế hoạch; cùng nhau nâng cao chuyên môn nghề nghiệp. Và biết đâu, mỗi cá nhân Developer đều có những định hướng cụ thể hơn trong sự nghiệp lập trình IT của mình.

Một Senior Developer sẽ làm những gì?

Những công việc chính

+ Connect với khách hàng; lắng nghe cá feedback, các phát sinh từ vấn đề từ khách hàng

+ Phân tích, đánh giá và thảo luận với team để cùng tìm ra các giải pháp/cách thức phù hợp. Đồng thời, quy định mức thời gian dự kiến hoàn thành. Chủ động liên hệ khách hàng, đảm bảo sự kết nối và thông tin về sự cam kết giải quyết nhiệm vụ.

+ Phân chia nhỏ các công việc; hướng dẫn các thành viên còn “non” trong tay nghề. Hỗ trợ họ, giúp họ bắt nhịp chung với các cá nhân khác để đạt hiệu suất cao nhất.

+ Duyệt code và thực hiện chạy thử các phương án test. Theo dõi và đánh giá tiềm nang mỗi giải pháp.

+ Fix lại các chỗ bị lỗi và chưa hoàn thiện. Senior Developer cần đảm bảo chu trình chạy thử chương trình ổn định, không phát sinh lỗi và đạt những yêu cầu như mong muốn.

Có thể nói, Senior Developer là một người dẫn đầu với năng lực toàn diện được thể hiện ở tất cả các khía cạnh. Mọi quy trình đều được họ nắm bắt, điều tiết và quản lý một cách tốt nhất. Họ có sự cầu tiến, do vậy họ thật sự tỉ mỉ và chỉn chu trong việc tổ chức thực hiện các giai đoạn công việc.

Đối với Senior Developer, họ không quá khó để khai thác và kết nối chính xác với nhu cầu của khách hàng. Dựa trên những trải nghiệm, họ biết đâu là những cách thức phù hợp để tìm ra sự phụ ứng với mong muốn từ các khách hàng khó tính nhất.

  Hãy commit code có tâm như Senior Developer

Lộ trình thăng tiến của một Senior Developer có gì thú vị?

Một điều đáng lưu tâm

Mỗi người sẽ có một thời điểm phù hợp để phát triển sự nghiệp của mình. Đỉnh cao sự nghiệp là do mỗi cá nhân tự thỏa mãn. Và việc so sánh hoặc áp đặt lộ trình thăng tiến là điều hạn chế. Vì đơn giản mọi thứ đều có tính chất tương đối. 

Do vậy, sự hướng dẫn dưới đây không thể phù hợp với tất cả dân lập trình. Với một số người, vai trò quản lý có thể tốt hơn. Hoặc đơn giản bạn chỉ dừng lại ở việc thích viết code.

Đồng thời, các yếu tố khác có thể chi phối nhiều hơn. Điều này quyết định sự thành công của bạn. Hãy hiểu bản thân trước tiên, bạn thật sự mong muốn điều gì? Từ đó lập kế hoạch phát triển lộ trình thăng tiến cho riêng mình. 

Fresher

Fresher chỉ những sinh viên mới ra trường. Sự va chạm chưa nhiều và có thể nói, họ đều là những “lính mới” của giới lập trình viên. Lợi thế của họ là sự chuẩn bị gần như là kỹ lưỡng về hành trang do quá trình dài rèn luyện tại giảng đường.

Nếu bạn đang apply vị trí Mobile App Developer tại một doanh nghiệp thì chiếc CV IT Developer chuẩn có thể giúp các newbie nâng cao khả năng ghi điểm của mình. Tuy nhiên, để thành công và nhanh chóng hòa nhập môi trường lập trình chuyên nghiệp, họ cần phải nỗ lực rất nhiều.

Junior Developer

Với số năm kinh nghiệm ít ỏi, cái họ nó là nền tảng trải nghiệm; những bước đi đầu trong việc tiếp cận thế giới lập trình. Họ sẽ bắt đầu đi sâu hơn vào việc phân tích lập trình ứng dụng dựa vào thực tế nhiều hơn. Hiểu biết về cơ sở dữ liệu, lưu trữ và xuất dữ liệu, nắm bắt các chức năng là những họ cần phải phát huy.

Senior Developer

Bạn có thể tự hào đôi chút khi bản thân được công nhận là một Senior Developer chính hiệu. Bạn hoàn toàn có thể xử lý các vấn đề; chịu trách nhiệm đảm nhận các dự án lớn; quản lý, áp dụng, thực hiện và giải quyết nhiệm vụ phức tạp nhất. Một điểm nhấn quan trọng của Senior Developer chính là mức độ am hiểu sâu sắc về cơ sở dữ liệu và các dịch vụ ứng dụng,…

Xem thêm việc làm Senior developer trên TopDev

Tech lead

Để đạt được level này, tất nhiên sẽ phụ thuộc vào sự cố gắng của bạn. Bạn dường như đào sâu hơn trong chính chuyên môn của mình. Bạn là người đưa ra các quyết định quan trọng về cách thức thực hiện của một hoặc nhiều dự án. Vì đơn giản, bạn hiểu rõ về cơ chế hoạt động, sự liên kết giữa các công cụ công nghệ,… Bạn dần trở thành một chuyên gia quản trị con người, quản lý một quy trình phát triển phần mềm hơn là một người đội trưởng hướng dẫn đồng đội.

Quản lý cấp trung

Hai chức danh quan trọng thường sẽ là Product Manager hoặc Project Manager. Ở giai đoạn này, bạn sẽ có vai trò lớn trong việc quy định về chuẩn chất lượng/đầu ra mà một sản phẩm nào đó thông qua nghiên cứu, phân tích.

Quản lý cấp cao

Bạn từng nghe về CTO hoặc CEO chưa? Vâng, chính xác là nó. Bạn không chỉ đơn thuần là một chuyên gia về lập trình, một người hiểu sâu rộng về công nghệ, mà bạn còn là người truyền cảm hứng; tạo động lực, vạch ra các chiến lược phát triển và dẫn dắt các leader theo một sứ mệnh, tầm nhìn nào đó. Điều này có nghĩa, bạn đang là nhân tố quyết định đến số phẫn thành hay bại của một tổ chức.

Đâu là những kỹ năng quan trọng của một Senior Developer?

Nhiều kỹ năng quan trọng có thể chi phối đến quá trình phát triển của một Senior Developer. TopDev sẽ chỉ ra một số kỹ năng ảnh hưởng trực tiếp đến sự thăng tiến của một Senior Developer.

CV IT Developer
Những kỹ năng nào quan trọng đối với một Senior Developer?

Chuyên sâu về công nghệ

Khác với Junior, Senior Developer phải là người có nhiều kinh nghiệm. Những kinh nghiệm đó được phát triển hơn thông qua quá trình dài làm việc với công nghệ/ngôn ngữ lập trình. Càng nhiều dự án với các đặc thù tính chất, môi trường làm việc khác nhau, bạn sẽ có cơ hội nâng cao năng lực của mình. Nhận ra thế mạnh về chuyên môn, đặc biệt là về khía cạnh công nghệ – kỹ thuật. Đồng thời lại biết được đâu là những hạn chế cần khắc phục. 

Không chỉ có kỹ năng đánh giá năng lực bản thân, là một Senior, bạn còn phải biết cách đánh giá mức độ hiệu quả của các công cụ công nghệ. Dự án nào dùng công cụ nào để xử lý. Mọi thứ cần được diễn tiến một cách khoa học.

Kỹ năng “múa” code

Chuyên nghiệp trong việc viết code đôi khi khó thể hiện toàn diện năng lực của một Dev. Thế nhưng, nếu xét trên khía cạnh kỹ năng, Junior chỉ cần viết code cho chạy là được. Còn nếu là Senior, bạn không chỉ đơn thuần viết đúng hạn deadline, mà việc viết code phải tinh gọn, nhanh chóng. Yếu tố quyết định chính là khả năng bảo trì code. Đó cũng là điều mọi Senior Developer cần nhớ.

Tính đa nhiệm

Khi là một Senior Developer, bạn cần phải tiếp cận với các task lớn hơn. Điều đó đồng nghĩa, bạn phải am hiểu nhiều công cụ hơn. Senior Developer sẽ chia nhỏ thành từng task khác nhau. Đồng thời, phải quan tâm đến vấn đề đánh giá, phân tích mức độ khả thi, tính hiệu quả của các giải pháp. Điều này cho thấy họ phải là người hiểu rõ về cơ chế hoạt động của doanh nghiệp. Đó là cơ sở quan trọng để Senior tìm ra các mấu chốt, cách thức giải quyết phù hợp – khả thi nhất cho mọi vấn đề.

Thái độ cầu tiến

Nếu bạn đã giỏi, hãy làm cách nào đó để mình trở nên giỏi hơn. Senior Developer có thể tự học thêm vì mọi kiến thức đều có thể được cập nhật mới hơn mỗi ngày. Là một Senior, bạn cần phải hỗ trở nhiều đàn em khi họ có những vấn đề chưa giải quyết được; trực tiếp góp ý kiến, đưa ra các phán đoán trước những quyết định. Thái độ cầu thị và giúp đỡ; tính trách nhiệm với mỗi thứ mình làm đều góp phần tạo ra chân dung của một Senior Developer chuyên nghiệp.

Thu nhập của một Senior Developer như thế nào?

Mức lương phụ thuộc rất nhiều vào trình độ và số năm kinh nghiệm mà mỗi cá nhân sở hữu. Và tùy vào từng công ty, mức độ chênh lêch về lương có thể rơi vào các mức sau đây:

+ Dưới 1 năm kinh nghiệm: 5 – 10M 

+ Từ 1-3 năm kinh nghiệm: 12 – 24M

+ Từ 3- 5 kinh nghiệm: 20 – 35M (Senior Developer)

+ Trên 5 kinh nghiệm: 30M – 100M (tuỳ thuộc trình độ chuyên môn)

Trên thực tế mức lương có thể sẽ thay đổi dựa trên những nỗ lực cá nhân của bạn. Vì vậy, bạn hãy chứng tỏ bản thân là một Senior Developer thực thụ để có những phúc lợi xứng đáng.

Lời kết

Senior Developer là những cá nhân thuộc nhóm ngành đang phát triển bật nhất. Họ được quan tâm và có cơ hội được tào đạo bài bản hơn. Tuy vậy, bản thân chính họ cũng tự rèn luyện để bản thân được hoàn thiện hơn. Thông qua bài viết này, TopDev hi vọng bạn sẽ biết được thế nào là Senior Developer. Đồng thời, đây là những thông tin cơ sở để bạn tự nhìn nhận, đánh giá lại bản thân. Từ đó, điểm lại những thiếu sót trong kinh nghiệm, kỹ năng để lập kế hoạch bồi dưỡng cho bản thân. Chúc cho con đường phát triển ngành lập trình của các bạn sẽ thật sự may mắn!

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

Xem thêm việc làm IT trên TopDev

Sự phát triển của các ngôn ngữ lập trình

Sự phát triển của các ngôn ngữ lập trình

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

Ngôn ngữ lập trình bản thân chúng không phải là 1 thành phần trong kiến trúc nhưng sẽ là thiếu sót nếu chúng ta không đề cập đến chúng trong loạt bài viết này.

Cùng điểm sơ qua lịch sử phát triển của các ngôn ngữ lập trình cùng các mô hình lập trình (programming paradigm) qua thời gian và các vấn đề mà chúng giải quyết.

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  10 ngôn ngữ phát triển nhanh nhất theo GitHub thống kê năm 2024

1950S – NON-STRUCTURED PROGRAMMING (LẬP TRÌNH PHI CẤU TRÚC)

Assembly ~1951
Vào thời điểm sơ khai của lĩnh vực phát triển phần mềm, Assembly là ngôn ngữ hot nhất thời điểm bấy giờ. Nó sử dụng các lời gọi hàm bậc thấp như add, sub, goto và thao tác trực tiếp trên thanh nhớ. Mất khá nhiều thời gian chỉ để build 1 ứng dụng đơn giản. Để thực hiện một lệnh IF, ta cần đến vài dòng code, và sẽ là vài chục dòng code cho vòng loop… Lúc này, khả năng tái sử dụng và cấu trúc các thành phần hầu như là rất khó vì độ phức tạp của ngôn ngữ, các dòng lệnh chủ yếu được thực thi một cách tuần tự, nếu muốn sử dụng logic này ở chỗ khác thì chỉ có cách copy-paste.

1960S – STRUCTURED PROGRAMMING (LẬP TRÌNH CẤU TRÚC)

Algol ~1958
Lập trình cấu trúc là bước tiến hóa tiếp theo sau đó. Nó mang đến khả năng cấu trúc các dòng lệnh theo block, cung cấp các giao diện (key word) để sử dụng các lệnh if, else, loop, case, … và các sub-routines (giống như global method để reuse). Từ đây chúng ta có thể tập trung vào việc lập trình các flow của chương trình (thay vì phải đau đầu với các “mật mã” assembly). Ý tưởng về re-useable code cũng khởi nguồn ở giai đoạn này.

1970S – PROCEDURAL & FUNCTIONAL PROGRAMMING (LẬP TRÌNH THỦ TỤC & CHỨC NĂNG)

Pascal ~1970, C ~1972
Lập trình thủ tục và lập trình chức năng được giới thiệu vào những năm đầu của thập niên 70, với các đặc điểm như:
Procedures: Tập các dòng lệnh để thực hiện một công việc gì đó và không trả về dữ liệu
Functions: Tập các dòng lệnh dùng để tính toán trả về dữ liệu
Data structures: dùng để diễn đạt thông tin của một sự vật, sự việc, hoặc để nhóm các thông tin có cùng một mục đích vào trong đó. (Lưu ý lúc này vẫn chưa có OOP nên mình tránh dùng từ đối tượng ở đây)
Modules: Các file code hoặc tập tin đã được biên dịch có thể dùng cho những chỗ khác.

Trong giai đoạn này, ý tưởng về Event Oriented Programming cũng đã xuất hiện trong một báo cáo về MVC (sử dụng các event) của Trygve Reenskaug.

Như vậy, trong giai đoạn này, các ngôn ngữ lập trình đã làm tăng tính tái sử dụng các module, cũng như cho phép tạo ra các cấu trúc để gom nhóm data cũng như việc sử dụng event để phân tách các thành phần với nhau. (Key work cần nhớ: decoupling and modularity)

1980S – OBJECT ORIENTED PROGRAMMING

C++ ~1980, Erlang ~1986, Perl ~1987,
Phyton ~1991, Ruby ~1993, Delphi, Java, Javascript, PHP ~1995
Một trong những mô hình lập trình linh hoạt và theo tôi là tốt nhất cho đến thời điểm hiện tại đó là OOP. Lập trình hướng đối tượng cho phép chúng ta phân tích các bài toán thành các thực thể được gọi là các đối tượng và xây dựng các dữ liệu, các hàm xung quanh các đối tượng này. Dữ liệu được liên kết với các hàm thành các vùng riêng mà chỉ có các hàm đó tác động lên, các hàm bên ngoài không được truy cập vào. Các đối tượng có thể tác động và trao đổi thông tin với nhau thông qua các thông điệp.

MỘT SỐ KHÁI NIỆM TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

ĐỐI TƯỢNG

Đối tượng là sự kết hợp giữa dữ liệu và thủ tục (còn gọi là phương thức) thao tác trên dữ liệu đó. Ta có công thức:
Đối tượng = Dữ liệu + Phương thức

LỚP

Lớp là một tập các đối tượng cùng loại (có cấu trúc dữ liệu và phương thức giống nhau). Một đối tượng sẽ thể hiện cụ thể từng lớp. Trong lập trình mỗi lớp được xem là một kiểu, còn các đối tượng sẽ là các biến có kiểu lớp khác.

ĐÓNG GÓI DỮ LIỆU

Trong lập trình cấu trúc các hàm được sử dụng mà không cần biết cụ thể nội dung. Người dùng chỉ cần biết chức năng của hàm cũng như các tham số để chạy hàm, không cần quan tâm đến những lệnh cụ thể bên trong. Người ta gọi chức năng đó là đóng gói dữ liệu.

Trong lập trình hướng đối tượng, cả chức năng và dữ liệu đều phải được đóng gói, mỗi đối tượng sẽ không thể truy cập trực tiếp vào các thành phần dữ liệu mà phải thông qua các thành phần chức năng để làm việc đó. Như vậy, đóng gói cho phép dữ liệu của đối tượng sẽ bị che đi một phần khi nhìn từ bên ngoài.

KẾ THỪA

Kế thừa là khả năng cho phép xây dựng một lớp mới dựa trên các cơ sở (định nghĩa) của một lớp có sẵn và có bổ sung phương thức hay thành phần dữ liệu. Khả năng sử dụng kế thừa các module chương trình rất dễ dàng mà không cần thay đổi module khác.

ĐA HÌNH

Tính đa hình sẽ xuất hiện khi có khái niệm kế thừa và có khả năng cho phép gửi cùng một thông điệp đến những đối tượng khác nhau mà không cần biết đối tượng nhận thuộc lớp dữ liệu nào, chỉ cần tập hợp các đối tượng nhận có chung hoặc gắn liền với một tính chất nào đó.

1990S – SUBJECT & ASPECT ORIENTED PROGRAMMING

Subject Oriented Programming gọi cho các biểu diễn khác nhau của các đối tượng, theo người đang “nhìn” vào nó. Ví dụ, trong khi con người có thể nhìn thấy gỗ khi nhìn vào cái cây, một con chim có thể thấy một lượng thức ăn và nơi trú ẩn. Để mô hình hóa việc đó trong lập trình, nó có nghĩa là thuộc tính và hành vi của đối tượng có thể khác nhau, tuỳ thuộc vào ai gửi thông điệp đến đối tượng.

Aspect Oriented Programming (AOP) – lập trình hướng khía cạnh: là một kỹ thuật lập trình (kiểu như lập trình hướng đối tượng) nhằm phân tách chương trình thành cách moudule riêng rẽ, phân biệt, không phụ thuộc nhau.
Khi hoạt động, chương trình sẽ kết hợp các module lại để thực hiện các chức năng nhưng khi sửa đổi 1 chức năng thì chỉ cần sửa 1 module.
AOP không phải dùng để thay thế OOP mà để bổ sung cho OOP.

SAU OOP

Sau OOP thì hầu như không có mô hình lập trình mới nào đáng chú ý. Tất cả đổ dồn vào việc tùy biến các ngôn ngữ lập trình hiện tại để tối ưu cho các mục đích cụ thể nhất định, các framework, ngôn ngữ dành riêng cho phát triển web, mobile hoặc 1 nền tảng nào đó như Go cho Google, Hack của Facebook, …

KẾT LUẬN

Chúng ta đã điểm qua sơ bộ về một số mô hình lập trình chính, tất nhiên là tôi không quá chú trọng về nội dung chi tiết, vì chúng đã được nhắc đến rất nhiều trên mạng internet. Phần tôi muốn nhấn mạnh ở đây chính là chiều hướng phát triển của các mô hình lập trình, chúng tiến hóa theo chiều hướng của Modularity (low coupling – liên kết lỏng lẽo) và Encapsulation (high cohesion – độ gắn kết cao). Trong những bài viết tiếp theo, chúng ta sẽ tiếp tục thấy sự phát triển của các mô hình kiến trúc cũng theo chiều hướng nhằm đạt được tối đa 2 tính chất quan trọng NHẤT vừa đề cập.

Nếu bạn muốn hiểu rõ hơn về low coupling và high cohension, tôi khuyến nghị nên đọc thêm về nó ở đây trước khi bắt đầu vào loạt bài tiếp theo.

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết được tham khảo từ:

Programming Language evolution

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

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

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

Sự khác nhau giữa Method và Function trong Python

Sự khác nhau giữa Method và Function trong Python

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Sự khác nhau giữa Method và Function trong Python.

(Xem lại: Function trong Python là gì?)

Khái niệm method thường dùng trong lập trình hướng đối tượng như java, c#… Còn khái function thường dùng trong lập trình hàm như javascript, c…

Method trong Python

  • Method là một phần của Object (method chính là hành động của object). Hay nói cách khác, method nằm bên trong class.
  • Method có thể trả về hoặc không trả về dữ liệu
  • Method có thể xử lý dữ liệu được chứa bên trong class.

Cấu trúc method trong Python:

class class_name 
def method_name () : 
 ...... 
# method body 
 ...... 

Ví dụ:

class Person:
def __init__(self, name):
 self.name = name

def show_name(self):
print("My name is " + self.name)

def say_hello(self):
print("hello")

person = Person("kai")
person.show_name()
person.say_hello()

Kết quả:

My name is kai
hello
  Top 10 thư viện Python tốt nhất cho Data Scientist nửa đầu năm 2024

Function trong python

  • Function là một khối code gồm nhiều câu lệnh liên quan cùng thực hiện một công việc gì đó.
  • Function có thể trả về hoặc không trả về giá trị
  • Function không liên quan tới Class (Không nằm trong class, không truy cập dữ liệu trực tiếp của class)

Cấu trúc function:

def function_name ( arg1, arg2, ...) : 
 ...... 
# function body 
 ...... 

Ví dụ:

def subtract(a, b):
return (a-b)

def say_hello():
print("Hello World")

say_hello()
print("10 - 5 = %d" % subtract(10, 5)) # prints -2

Kết quả:

Hello World
10 - 5 = 5
  Tạo kho lưu cho các gói thư viện Python

Sự khác nhau giữa Method và Function trong Python

  • Cả Method và Function đều khá giống nhau trong cách hoạt động.
  • Điểm khác nhau chính giữa Method và Function chính là khái niệm Class và Object.
  • Function có thể được bởi tên trong khi method phải gọi thông qua class hoặc đối tượng.
  • Method được định nghĩa bên trong một class và phụ thuộc vào class đó.

Okay, Done!

References: https://docs.python.org/2.0/ref/function.html

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

Xem thêm các việc làm python lương cao hấp dẫn tại TopDev

KISS PRINCIPLE (Nguyên tắc KISS Trong JAVA)

Nguyên tắc KISS trong Java

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Nguyên tắc KISS trong Java.

KISS là gì?

KISS ở đây là: Keep ISimple, Stupid! không phải “hun nhau” đâu nhé.

Hiểu nôm na thì KISS cõ nghĩa là giữ cho code của bạn thật đơn giản, càng đơn giản, ngắn gọn càng tốt.Bạn viết code, người khác vừa đọc đã hiểu bạn đang viết cái gì, code của bạn thực hiện cái gì thì bạn đang áp dụng thành công rồi đấy.

Tuyển lập trình Java lương cao mới ra trường

Ví dụ 1:

mình có 1 method:

public int addTwoNumber(int a, int b) {
return a + b;
}

Khi bạn đọc nó bạn có thể hiểu luôn method đó làm cái gì. Với những method có logic phức tạp hơn, dài dòng hơn thì bạn cần phải biết đặt tên biến, tên hàm, comment thế nào để cho code của bạn dễ hiểu. (Có thời gian thì bạn hãy đọc cuốn ‘clean code’ của Robert C. Martin, bạn sẽ pro ngay mấy cái này =)) )

Ví dụ 2:

mình có 2 method đều thực hiện trả về true nếu số truyền vào là số chẵn:

// method 1
public static boolean isEven(int input) {
return (input & 1) == 0;
}


// method 2
public static boolean isEven(int input) {
return (input % 2) == 0;
}

Rõ ràng, method 1 nhanh hơn method 2 vì nó thực hiện trực tiếp với bit. Nhưng method 2 lại dễ hiểu hơn, người đọc không cần nhớ lại toán tử ‘&’ thực hiện như nào.

Ở đây mình chọn method 2 vì nó dễ hiểu, rõ ràng. Còn method 1 có nhanh hơn nhưng tính tổng thể thì nó không nhanh hơn quá nhiều chỉ  tính bằng mini giây (chỉ khi nào bạn thực hiện lập trình nhúng, big data… thì có lẽ lúc đó người ta sẽ xem xét lại.)

Ví dụ 3:

bạn có biết  hàm tìm kiếm string cài đặt sẵn trong java được viết theo thuật toán ‘Naive Search’, trong khi bạn chỉ cần lên google là có hàng tá thuật toán cùng chức năng với ‘Naive Search’ mà có tốc độ cao hơn nhiều nhưng người ta vẫn dùng ‘Naive Search’ vì nó dễ hiểu, dễ cài đặt. Còn nếu bạn muốn nhanh hơn thì tất nhiên phải viết lại method mới phù hợp cho mục đích của mình rồi.

Với cấp độ cao hơn, khi mà người ta áp dụng các pattern, framework… bản chất code đã trở nên phức tạp hơn nhiều nên tùy theo nhu cầu (khả năng mở rộng, chịu tải, nâng cấp version…), thực sự cần thì người ta mới áp dụng. Chứ mấy cái app con con bạn cũng áp dụng vào vào thì nó sẽ khiến bạn tốn thời gian viết code, thời gian debug…
Nếu bạn đọc code của đứa nào đó thấy khó hiểu thì đừng vội cho đó là cao siêu, hãy hỏi nó sao code mày khó hiểu thế =))

  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Áp dụng KISS vào code của bạn.

  • Đặt tên hàm, biến, method, class, package, comment rõ nghĩa.
  • Không lạm dụng framework, pattern.
  • Chia vấn task của bạn thành các task nhỏ hơn để code 1 cách rõ ràng.
  • Giới hạn mỗi method chỉ nên từ 30-50 lines, và mỗi method chỉ nên thực hiện 1 chức năng.
  • Hiểu rõ các vấn đề trước khi code.
  • Không nên sử dụng nhiều câu lệnh If trong 1 method, hãy tách nó ra thành các method khác nhau.

Khi áp dụng được nguyên tắc KISS rồi bạn sẽ thấy nó có rất nhiều lợi ích:

  • Các vấn đề được giải quyết nhanh hơn, tránh được các issue phức tạp
  • Code dễ sử dụng, dễ test
  • Bản thân code đã chính là tài liệu, comment cho chính nó
  • Và dễ dàng bảo trì, sửa lại code khi cần

Bạn có thể xem thêm một số nguyên tắc lập trình khác tại đây

Source: https://people.apache.org/~fhanik/kiss.html

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

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

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

Tự viết Messenger Desktop cho Linux với Nativefier

Tự viết Messenger Desktop cho Linux với Nativefier

Bài viết được sự cho phép của tác giả Trần Khôi Nguyên Hoàng

Nguyên nhân

Mình không dùng Facebook nhiều mà chỉ dùng mỗi Messenger để nhắn tin chat chit cho công việc và bạn bè – Mặc dù mình thích thằng Telegram hơn, ngon hơn thằng Messenger của anh Mark 3000 lần. Thằng Messenger thì hiện tại hình như bên Windows thì đã có Official rồi thì phải, còn bên Linux như con ghẻ, chả có gì, toàn phải dùng bản Web App. Mỗi lần sử dụng toàn phải tìm lại trong đống tab của mình. Nên mình tim hiểu tự làm một cái thử xem. Sau một lhời gian tìm hiểu thì thấy có một package làm giúp cho mình việc này, tất nhiên nó không phải là native app, mà làm wrapper của Electron.

  Discord đã lưu trữ hàng tỉ messages mỗi ngày như thế nào?
  Messaging App sẽ định hình lại E-commerce

Nativefier

Nativefier là một wrapper của Electron dùng để tạo Desktop Application cho Linux và các platform khác. Tuy nhiên mình chỉ dùng cái này trên Linux thôi nên không test được ở platform khác nha. Ngoài ra, có thể vọc vạch thêm một chút cho application này, ví dụ như inject javascript hay css.

Tự viết Messenger Desktop cho Linux với Nativefier

Cài đặt và cách sử dụng

Cài đặt package này, rồi gắn global flag rồi để sau này có gì sử dụng cho nó tiện cũng được. Nếu không thì bỏ cái global flag ra cũng ok.

sudo npm i nativefier -g
Bash

Sử dụng thì đơn giản cực kỳ. Sử dụng nativefier để convert web app messenger.com cho platform linux.

nativefier https://www.messenger.com -p linux
Bash

Sau khi chạy command này xong thì nativefier sẽ generate ra một folder là Messenger-linux-x64

Tự viết Messenger Desktop cho Linux với Nativefier
Cấu trúc folder khi generate ra

Tới lúc này thì start lên với câu lệnh

./Messenger.com
Bash

Thế là xong, có một Desktop Application rồi.

Mở rộng

Tất nhiên là nếu như vậy không thôi thì cũng không tận dụng hết được tính năng của Nativefier. Ở đây thì mình sẽ mở rộng thêm một chút, mình sẽ làm Dark Mode cho con ứng dụng ghẻ của mình. Electron là một framework dùng để build desktop application bằng html, css, javascript. Thì thằng nativefier này được build dựa trên thằng electron. Như vậy thì muốn thay đổi giao diện của ứng dụng thì chỉ việc add thêm dark mode css là xong. Để inject được css trong natifier thì dùng flag —inject. Vì thế mình sửa code lại một tí.

nativefier https://www.messenger.com -p linux --inject dark.css
Bash

Sau đó vào trong Messenger-linux-x64/resources/app/inject ****để sửa file dark.css như sau. Mình bợ của anh nào đấy trên github

Thế là có một Messenger Dark Mode Desktop Application rồi.

Các bạn có thể xem thêm các API hay ho khác của Nativefier ở đây nhé. Còn nhiều thứ hay ho có thể dùng lắm.

Đến đây thì có vẻ như chưa đủ, mình còn phải tạo shortcut cho nó để bấm là chạy nữa chứ. Lúc này thì phải dùng một số câu lệnh SHELL của Linux.

Đầu tiên là tạo shortcut cho nó tên là shortcut.sh

#!/bin/sh
set -e
WORKING_DIR=`pwd`
THIS_PATH=`readlink -f $0`
cd `dirname ${THIS_PATH}`
FULL_PATH=`pwd`/Lotion
cd ${WORKING_DIR}
cat <<EOS > Messenger.desktop
[Desktop Entry]
Name=Messenger
Name[en_US]=Messenger
Comment=Unofficial Facebook Messenger application for Linux
Exec="${FULL_PATH}/Messenger"
Terminal=false
Categories=Social
Type=Application
Icon=${WORKING_DIR}/icon.png
StartupWMClass=Messenger
EOS
chmod +x Messenger.desktop
## This can be updated if this path is not valid. 
cp -p Messenger.desktop ~/.local/share/applications
Bash

Tiếp theo là tạo file install.sh

#!/bin/bash
PD=`pwd`
INSTALL_DIR=$PD"/Messenger"
echo $INSTALL_DIR
mkdir -p $INSTALL_DIR
tar xvf $PD/Messenger-linux-x64.tar.xz -C $INSTALL_DIR --strip 1
/bin/bash $PD/shortcut.sh
Bash

Rồi làm nốt file remove.sh cho nó đủ bộ

#!/bin/bash
PD=`pwd`
INSTALL_DIR=$PD"/Messenger"
rm -r $INSTALL_DIR
rm ~/.local/share/applications/Messenger.desktop
Bash

Kết luận

Trên đây đơn giản chỉ là một package giúp mình convert một Web App ra Desktop App. Tuy nhiên, nếu Custom tốt thì cũng không đến nổi nào. Ngoài ra thì mình có thể xài thằng này để làm một số App cho mình, ví dụ như thằng Zalo, hay Whatsapp. Cũng là một ứng dụng, vì có app vẫn thích hơn là dùng browser.

Các bạn có thể xem repo tại GIthub của mình nhé.

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

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

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

Tuổi 25 – Bạn có suy ngẫm gì về hành trình ấy?

CV IT Manager
CV IT Manager

CV IT Manager thiếu kinh nghiệm? Chưa năm bắt về những cơ hội? Đâu là những suy ngẫm về giá trị của tuổi 25? 

Con số 25 nói lên được nhiều điều. Chắc chắn bạn đã trải qua nhiều vấp ngã đầu đời và các áp lực từ cuộc sống. Có khi nào bạn đã từng ngẫm lại những gì đã trôi qua hay chưa? Hay chỉ đơn thuần là mãi bị cuốn vào guồng quay của công việc. Nếu chưa thì có lẽ, bài viết này là dành các bạn đấy!                                               

Nhìn nhận tổng quan: Điều gì đến rồi cũng sẽ đến, mọi chuyện rồi sẽ ổn thôi

Mọi chuyện khó khăn, như cơn gió thoảng – những gì trắc trở, tệ hại nhất rồi sẽ chóng qua thôi.

CV IT Manager
Tuổi 25 đều có những điều đáng suy ngẫm. Vậy điều gì khiến bạn phải lắng lại để cảm nhận?

Ví dụ như thuở mới vào nghề, bạn gặp nhiều áp lực khi quyết định theo đuổi ngành IT. Bạn chưa biết cách viết một CV IT Manager chuyên nghiệp. Chưa kể nếu bạn apply thử sức ở nhiều vị trí khác nhau như Mobile App Developer, bạn cần phải viết CV IT tiếng Anh (CV IT English), liệu bạn có tự tin về khả năng của mình? Khi quyết tâm và dành sự tập trung cho nó, bạn nhận thấy nó rất mệt mỏi.

Đồng thời các vấn đề khác về lương, phúc lợi; mối quan hệ giữa bạn và sếp, đồng nghiệp; sự thăng tiến đều là những điều khiến bạn phải suy ngẫm rất nhiều. 

Đừng để bản thân rời vào tuyệt vọng!

Đôi khi, bạn đừng để bản thân lạc lõng với những áp lực. Vì điều đó sẽ khiến bạn đánh mất đi nhiều cơ hội đang hiện hữu chung quanh mình. Tất nhiên, cũng đừng để những cơ hội xấu kéo bạn đi quá xa. Việc nhận ra được những cảm xúc, mong muốn của bản thân rất quan trọng. Chính vì vậy, đừng bao giờ cho phép bản thân đánh mất chính mình. Hãy cố gắng phát huy hết những khả năng nếu được trao cơ hội.

25 tuổi, mọi mùi vị của thanh xuân có cái nào chưa từng trải nghiệm đâu. Quan trọng là hãy học cách trân trọng những mối quan hệ. Nhận thức đúng, sống tích cực để không bị chi phối quá nhiều bởi những tác động từ môi trường xung quanh.

Đánh giá hiện tại – Chưa muộn để xác định tầm nhìn dài hạn

Có thể nói, tuổi 25 là tuổi chạm độ chín của việc phát triển sự nghiệp. Tuy nhiên, điều này không phải là mặc định cho mỗi người. Việc xây dựng và phát triển sự nghiệp đều khác nhau.                     CV IT Manager

cv it tiếng anh
Tầm nhìn dài hạn rất quan trọng, liệu bạn đã thật sự đầu tư cho nó chưa?

Đây cũng là điều TopDev muốn chia sẻ. Bạn không nên so sánh bản thân với sự thành công của người khác để rồi quá tự ti. Một người bạn dev của mình với mức lương được tăng lên 20; thậm chí 30 củ do họ nhận được sự tín nhiệm. Điều này đồng nghĩa họ cũng phải nhận những trách nhiệm lớn hơn. Việc họ thành công có thể gói trọn trong 3 từ “đúng thời điểm”. Đừng quá áp đặt để rồi trở nên chán nản! Vì mỗi người đều sẽ có những thời điểm phù hợp cho riêng mình để tỏa sáng. 

Điều bạn cần làm là đảm bảo sẵn sàng lên một kế hoạch dài hạn cho sự nghiệp. Đồng thời linh hoạt xử lý kế hoạch đầu tư cho nó. 25 chưa phải là thời điểm quá muộn để bạn tạo dựng sự nghiệp.

Phấn đầu từ junior lên senior hoặc leader trong lĩnh vực IT, từ nhân viên thành người quản lý/nhà lãnh đạo nhân sự trẻ là điều khả thi nếu bạn có đủ sự cố gắng và niềm tin vào chính mình. 

Những hành động cụ thể

Chủ động đầu tư cho bản thân! 

Dù bạn đang ở giai đoạn nào, bạn vẫn phải chủ động tìm kiếm sự phát triển. Việc học tập, đầu tư cho bản thân rất cần thiết. Ví dụ khi đi xin việc vị trí Programmer, ngoài các kỹ năng thì IT Programmer CV, CV IT Manager,… được xem là một “tấm vé quyền năng” giúp bạn ghi điểm với nhà tuyển dụng.                                  cv it manager

CV cho sinh viên IT mới ra trường
Hãy quan tâm đến việc đầu tư cho bản thân

Nhiều cá nhân họ cho rằng việc đào tạo và phát triển năng lực chuyên môn thuộc về trách nhiệm của chính tổ chức/doanh nghiệp. Đó là một sai lầm lớn. Không phải công ty nào cũng có những nhà quản trị nhân sự đủ tầm nhìn để vạch ra những đường hướng, chiến lược; hoạch định ra lộ trình thăng tiến phù hợp cho mỗi nhân viên. Đừng suy nghĩ ỷ lại vào công ty! Vì có thể bạn sẽ gặp những cú twist đầy bất ngờ đó.  

Một điều đặc biệt quan trọng là bạn phải tự đầu tư cho bản thân. Kiến thức của bạn tự tìm tòi thì mới đáng giá. Vì chúng theo bạn, được cập nhật và phát triển hơn mỗi ngày. 

Lợi thế tiếp cận từ mạng lưới quan hệ xã hội 

Năng lực, sự may mắn, xây dựng, tạo cầu nối liên kết giữa các mối quan hệ đều là những yếu tố giúp gia tăng cơ hội thành công. Tuy nhiên, nhiều người cho rằng việc thiết lập quan hệ để thăng tiến là điều không mấy tự hào.                 CV IT Developer

Tuy nhiên, nếu đủ tư duy của một người thành công, bạn cần nhiều mối quan hệ. Và tất nhiên, chúng được tạo lập dựa trên uy tín, sự phù hợp khả năng chuyên môn. Như việc khi bạn đang là một newbie về công nghệ, việc nắm bắt một CV cho sinh viên IT mới ra trường (CV IT student) dường như còn hạn chế. Hãy tin rằng bạn thật sự có năng lực để tạo ra sự kết nối các mối quan hệ. Sức mạnh từ mạng lưới xã hội được xem như một “vũ khí” lợi hại để gia tăng lợi thế cạnh tranh cho một cá nhân.

Lưu ý, bạn không thể thành công nếu chỉ cố gắng tạo sự kết nối đơn thuần. Việc xây dựng một mạng lưới tốt đòi hỏi bạn phải có đủ khả năng giao tiếp, đàm phán, tư duy phản biện. Điều này giúp họ nhận thấy mục đích nghề nghiệp và những mong muốn phát triển của bạn. Từ đó, mới có đủ cơ sở để tạo dựng mối quan hệ cho đôi bên cùng có lợi. Nhiều khi bạn thực hiện những điều thú vị sẽ khiến chúng ta tạo ra sự thay đổi tích cực hơn trong công việc. 

Lời kết

Không bao giờ là quá trễ cho những ai nỗ lực, phấn đấu. Những cơ hội mới sẽ luôn mở ra và điều quan trọng là bạn có kiên nhẫn chờ đợi và chớp lấy thời cơ. Những điều suy ngẫm ở tuổi 25 sẽ trở thành động lực hay là khủng hoảng, tất cả phụ thuộc vào nhận thức và sự cố gắng cá nhân của bạn.

MMA Impact Vietnam 2020 – Nơi các chuyên gia Mobile Marketing hàng đầu chia sẻ những bài học đắt giá 

MMA IMPACT
MMA IMPACT

MMA Impact 2020 – sự kiện lớn nhất về tiếp thị di động trong năm sẽ có sự góp mặt của những chuyên gia hàng đầu từ lĩnh vực tiếp thị, quảng cáo và truyền thông. Hãy cùng đặt mua vé ngay hôm nay để không bỏ lỡ cơ hội tham gia diễn đàn đặc biệt sẽ diễn ra vào ngày 19 tháng 11 sắp tới!

Dàn diễn giả uy tín của MMA Impact Việt Nam 2020 – Khi “anh tài” hội tụ

MMA Impact Việt Nam 2020 vinh dự chào đón sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề. Tất cả sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành. 

MMA IMPACT
Sự kiện MMA Impact 2020 với sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành.

Sự kiện MMA Impact 2020 với sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành.

Đến với Impact 2020, người tham gia sẽ được luận bàn về một xu hướng nổi bật trong năm 2020: Purposeful Marketing (Tiếp thị Ý nghĩa) và vai trò cốt lõi của phương châm này trong ngành tiếp thị hiện đại. Trong năm 2020 với đại dịch COVID-19 diễn biến phức tạp, ngành truyền thông và công nghệ đã chứng kiến tốc độ phát triển kỷ lục để đáp ứng được nhu cầu mua sắm trực tuyến của người tiêu dùng. Vì thế, các doanh nghiệp cần phải tìm được “purpose” (mục đích) cho thương hiệu của mình, từ đó có thể tạo dựng được những chiến dịch quảng bá hiệu quả, có sức ảnh hưởng lan toả và lâu dài. Người tham dự sẽ được chia sẻ về tầm quan trọng của Purposeful Marketing cũng như cách nắm bắt sức mạnh của nó để vượt qua đại dịch lần này.

Danh sách diễn giả sẽ góp mặt tại MMA Impact Việt Nam bao gồm ông Sundar Bharadwaj – Giáo sư Marketing của Trường Đại học Georgia và Trường Terry College of Business, bà Trâm Nguyễn – Country Director của Google Việt Nam/Lào/Campuchia, ông Rohit Dadwal – Managing Director của MMA APAC, ông Tom Simpson – Senior Vice President của AdColony APAC, bà Bessie Lee – Co-founder và CEO của Withinlink, và nhiều chuyên gia đầu ngành khác. 

Xem thêm: Tuyển dụng Mobile hấp dẫn nhiều ngành nghề

Cơ hội lắng nghe những bài học đáng giá sau một năm 2020 đầy biến động

Xoay quanh chủ đề “Kiến tạo tương lai của Tiếp thị hiện đại”, MMA Impact 2020 được thiết kế để nâng cao và xây dựng tiềm năng “modern marketing” của các nhà tiếp thị. Không chỉ mang tới cho người tham dự một kho tài liệu lớn thông qua các báo cáo do MMA Global tổng hợp, hơn hết đây là dịp để các chuyên gia, đối tác của MMA bàn bạc về những vấn đề “nóng” nhất của ngành tiếp thị.

MMA IMPACT
MMA IMPACT
MMA IMPACT
Các chuyên gia tiếp thị chia sẻ về tình hình tiếp thị di động tại Việt Nam ở sự kiện của MMA

Trong panel với chủ đề “Sự trỗi dậy của nền kinh tế Internet Việt Nam”, đại diện từ Google sẽ chia sẻ thứ hạng của Việt Nam trên trường quốc tế dựa trên mức độ tăng trưởng và doanh thu của nền kinh tế Internet. Phiên đối thoại sẽ đào sâu vào xu hướng mới của người tiêu dùng hiện nay, khi họ bắt đầu chuyển qua tiêu dùng trên Internet ở nhiều lĩnh vực đa dạng như bán lẻ, giáo dục, và tài chính. Người tham dự cũng sẽ được lắng nghe các thương hiệu hàng đầu chia sẻ cách mà họ đang thúc đẩy tăng trưởng cho doanh nghiệp trong nền kinh tế Internet hiện nay. 

Tiếp theo, làm thế nào để thiết kế một chiến dịch marketing thành công trong thời dịch? Anh Cường Nguyễn từ Biti’s sẽ chia sẻ cách mà thương hiệu quốc gia này đã đối mặt với COVID-19 một cách khác biệt và truyền cảm hứng, tạo nên một chiến dịch quảng bá ý nghĩa và thành công nhất của Biti’s nửa đầu năm 2020. 

Một trong những chủ đề thú vị khác tại MMA Impact 2020 chính là “Live Streaming trong Thương mại điện tử 4.0”. Bà Bessie Lee từ Withinlink sẽ bàn về một trong những xu hướng đang gây sốt tại Trung Quốc: live streaming. Với việc 5G sắp được phổ biến, live streaming là một kênh bán hàng tiềm năng và đầy sáng tạo giúp doanh nghiệp có thể kết nối nhanh hơn với khách hàng. Bà Bessie Lee cũng sẽ đề cập đến những thách thức mà doanh nghiệp sẽ phải đối mặt khi tích hợp live streaming vào chiến dịch kinh doanh của mình.  

Ngoài ra, một số chủ đề tiêu biểu khác sẽ được thảo luận và chia sẻ tại MMA Impact bao gồm: “Số liệu về người tiêu dùng nông thôn tại Việt Nam” từ Cốc Cốc, “Tiếp thị bằng Influencer” từ Samsung, bàn tròn “Mở khóa những cơ hội tiềm ẩn xung quanh ngành Trò chơi điện tử” với sự tham gia của AdColony và Oppo. Qua những chia sẻ cực kỳ giá trị này, người tham dự có thể trau dồi, cập nhật những xu hướng và thách thức sắp tới của ngành để chuẩn bị cho kế hoạch 2021 của doanh nghiệp mình.

MMA Impact Việt Nam 2020 sẽ được tổ chức vào lúc 8:00 – 12:00 ngày 19/11/2020 tại TP.HCM Tất cả các CEO và CMO từ các doanh nghiệp, nhãn hàng, agency, tập đoàn công nghệ, viễn thông,… đều được chào đón tại sự kiện. 

Đặc biệt, hãy nhanh tay đăng ký ngay hôm nay tại https://www.mmaglobal.com/impactvietnam2020#register hoặc liên hệ theo số hotline: 0834.269.997 (Ms. Xuân)/ 0978.757.275 (Ms. Hân).

Và đừng quên tham dự Đêm trao giải Smarties để cùng theo dõi danh sách các chiến dịch tiếp thị di động xuất sắc nhất sẽ được vinh danh vào cùng ngày – 19/11/2020 sắp tới. 

Giới thiệu về Hiệp hội Tiếp thị Di động (MMA) 

MMA là hiệp hội tiếp thị di động thương mại phi lợi nhuận hàng đầu thế giới bao gồm hơn 800 công ty thành viên, đến từ gần 50 quốc gia trên thế giới. Các thành viên của chúng tôi đến từ mọi mảng trong hệ sinh thái tiếp thị di động, bao gồm brands marketer, agency, nền tảng công nghệ, công ty truyền thông,… Sứ mệnh của MMA là đẩy nhanh quá trình chuyển giao và đổi mới của marketing thông qua thiết bị di động, thúc đẩy tăng trưởng kinh doanh với sự tương tác mạnh mẽ hơn của người tiêu dùng. Dẫn dắt sứ mệnh của MMA là bốn trụ cột cốt lõi: Nuôi dưỡng cảm hứng bằng cách thúc đẩy sự đổi mới cho các CMO; Xây dựng tiềm năng tiếp thị di động cho các tổ chức tiếp thị thông qua việc cung cấp kiến thức và sự tự tin; Nâng cao hiệu quả và tác động của thiết bị di động thông qua nghiên cứu ROI hữu hình; và ủng hộ các nhà tiếp thị di động. Ngoài ra, các Committee của MMA còn hợp tác để phát triển và hỗ trợ các phương pháp tốt nhất và tiên phong trong những phát triển đúng tiêu chuẩn.  

Các thành viên của MMA tại Việt Nam bao gồm Facebook, Google, CocCoc, Adtima, GroupM, Coca-Cola, Unilever,… và rất nhiều tên tuổi lớn khác. Trụ sở toàn cầu của MMA được đặt tại New York với các hoạt động khu vực ở Châu Âu / Trung Đông / Châu Phi (EMEA), Châu Mỹ Latinh (LATAM) và Châu Á Thái Bình Dương (APAC). Để biết thêm thông tin về MMA, vui lòng truy cập www.mmaglobal.com.