Home Blog Page 116

Module trong Python

Module trong Python

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

Module được sử dụng để phân loại code thành các phần nhỏ hơn liên quan với nhau. Hay nói cách khác, Module giúp bạn tổ chức Python code một cách logic để giúp bạn dễ dàng hiểu và sử dụng code đó hơn. Trong Python, Module là một đối tượng với các thuộc tính mà bạn có thể đặt tên tùy ý và bạn có thể gắn kết và tham chiếu.

Việc làm python hấp dẫn cho bạn

Về cơ bản, một Module là một file, trong đó các lớp, hàm và biến được định nghĩa. Tất nhiên, một Module cũng có thể bao gồm code có thể chạy.

Bạn theo dõi qua ví dụ sau: Nếu nội dung của một quyển sách không được lập chỉ mục hoặc phân loại thành các chương riêng, thì quyển sách này có thể trở nên nhàm chán và gây khó khăn cho độc giả khi đọc và hiểu nó. Tương tự, Module trong Python là các file mà có các code tương tự nhau, hay có liên quan với nhau. Chúng có lợi thế sau:

Khả năng tái sử dụng: Module có thể được sử dụng ở trong phần Python code khác, do đó làm tăng tính tái sử dụng code.

Khả năng phân loại: Các kiểu thuộc tính tương tự nhau có thể được đặt trong một Module.

Để import một Module, bạn có thể sử dụng một trong ba cách dưới đây:

Sử dụng lệnh import trong Python

Bạn có thể sử dụng bất cứ source file nào dưới dạng như một Module bằng việc thực thi một lệnh import trong source file khác. Cú pháp của lệnh import là:

import module1[, module2[,... moduleN]

Giả sử mình có đoạn code sau:

def add(a,b):
    c=a+b
    print c
    return

Lưu file dưới tên là addition.py. Lệnh import được sử dụng như sau với file này:

import addition
addition.add(10,20)
addition.add(30,40)

Ở đây, trong addition.add() thì addition là tên file và add() là phương thức đã được định nghĩa trong addion.py. Do đó, bạn có thể sử dụng phương thức đã được định nghĩa trong Module bằng cách là ten_file.phuong_thuc(). Code trên sẽ cho kết quả:

>>> 
30
70
>>>

Ghi chú: Bạn có thể truy cập bất cứ hàm nào bên trong một Module theo phương thức như trên.

Để import nhiều Module, bạn sử dụng cách như trong ví dụ sau:

1, msg.py

def msg_method():
    print "Hom nay troi mua"
    return

2, display.py

def display_method():
    print "Thoi tiet kha am uot"
    return

3, multiimport.py

import msg,display
msg.msg_method()
display.display_method()

Kết quả là:

>>> 
Hom nay troi mua
Thoi tiet kha am uot
>>>    
  Python cơ bản cho ứng dụng trong công việc

Sử dụng lệnh from…import trong Python

Lệnh from…import được sử dụng để import thuộc tính cụ thể từ một Module. Trong trường hợp mà bạn không muốn import toàn bộ Module nào đó thì bạn có thể sử dụng lệnh này. Cú pháp của lệnh from…import là:

from modname import name1[, name2[, ... nameN]]

Dưới đây là ví dụ:

1, area.py

def circle(r):
    print 3.14*r*r
    return

def square(l):
    print l*l
    return

def rectangle(l,b):
    print l*b
    return

def triangle(b,h):
    print 0.5*b*h
    return

2, area1.py

from area import square,rectangle
square(10)
rectangle(2,5)

Kết quả là:

>>> 
100
10
>>> 

Sử dụng lệnh from…import* trong Python

Sử dụng lệnh này, bạn có thể import toàn bộ Module. Do đó bạn có thể truy cập các thuộc tính trong Module này. Cú pháp của lệnh là:

from modname import *

Ví dụ dưới đây chúng ta sẽ import area.py ở trên:

2, area1.py

from area import *
square(10)
rectangle(2,5)
circle(5)
triangle(10,20)

Kết quả là:

>>> 
100
10
78.5
100.0
>>>
  Làm app giao diện đồ hoạ với Python

Built-in Module trong Python

Phần trên, bạn đã tìm hiểu cách tạo ra Module cho riêng mình và cách import chúng. Phần này sẽ giới thiệu các Module đã được xây dựng sẵn trong Python. Đó là math, random, threading, collections, os, mailbox, string, time, … Mỗi Module này đã định nghĩa sẵn rất nhiều hàm để bạn có thể sử dụng để thực hiện các tính năng khác nhau. Bạn theo dõi một số ví dụ với hai Module là math và random mà có các hàm đã được giới thiệu trong các chương trước.

Ví dụ sử dụng math Module:

import math
a=4.6
print math.ceil(a)
print math.floor(a)
b=9
print math.sqrt(b)
print math.exp(3.0)
print math.log(2.0)
print math.pow(2.0,3.0)
print math.sin(0)
print math.cos(0)
print math.tan(45)

Ví dụ sử dụng random Module:

import random

print random.random()
print random.randint(2,8)

Package trong Python

Về cơ bản, một Package là một tập hợp các Module, sub-package, … tương tự nhau. Đó là một cấu trúc có thứ bậc của thư mục và file.

Dưới đây là các bước để tạo và import một Package:

Bước 1: Tạo một thư mục, có tên là vietjack chẳng hạn.

Bước 2: Đặt các module khác nhau bên trong thư mục vietjack này. Chúng ta đặt ba Module là msg1.py, msg2.py, và msg3.py và đặt tương ứng code trên vào các Module tương ứng. Bạn đặt hàm msg1() trong msg1.py, hàm msg2() trong msg2.py và hàm msg3() trong msg3.py.

Bước 3: Tạo một init.py file để xác định các thuộc tính trong mỗi Module.

Bước 4: Cuối cùng bạn import package này và sử dụng các thuộc tính đó bởi sử dụng package.

Bạn theo dõi ví dụ sau:

1, Tạo thư mục

import os
os.mkdir("Info")

2, Đặt các module khác nhau trong package:
msg1.py

def msg1():
    print "Day la msg1"

msg2.py

def msg2():
    print "Day la msg2"

msg3.py

def msg3():
    print "Day la msg3"

3, Tạo một init.py file.

from msg1 import msg1
from msg2 import msg2
from msg3 import msg3

4, Import package này và sử dụng các thuộc tính.

import Info
Info.msg1()
Info.msg2()
Info.msg3()

Kết quả là:

>>> 
Day la msg1
Day la msg2
Day la msg3
>>>

Câu hỏi: init.py file là gì?

Nó đơn giản là một file được sử dụng để xem xét các thư mục trên disk dưới dạng package của Python. Về cơ bản, file này được sử dụng để khởi tạo các Package trong Python.

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

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

Xem thêm tuyển it job hấp dẫn trên TopDev

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

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

Chào các bạn, hiện nay có rất nhiều công cụ hỗ trợ việc lập trình rất tốt. Tiêu biểu trong số đó phải kể đến các sản phẩm của JetBrains với những tính năng ưu việt. Nhưng không vì thế mà các công cụ miễn phí mất đi vị trí của nó.

Việc kết nối đến cơ sở dữ liệu trong IntelliJ Idea (một sản phẩm của JetBrains) như trong bài viết trước mình đã hướng dẫn là tính năng chỉ có ở phiên bản trả phí (phiên bản Ultimate).

Chính vì vậy mà trong bài viết này, mình sẽ hướng dẫn với các bạn cách kết nối đến database MySQL trong Eclipse – một công cụ hoàn toàn miễn phí để có thể làm việc tương tự mà các bạn không phải trả phí như với IntelliJ.

Xem thêm Việc làm database, việc làm mysql hấp dẫn trên TopDev

Làm thế nào để kết nối đến Database MySQL trong Eclipse?

+ Bước 1: Đầu tiên các bạn hãy mở Eclipse lên, ở đây mình dùng phiên bản Eclipse 2019 JavaEE nha. Sau đó chúng ta sẽ phải mở Database Development Perspective lên như sau:

Window => chọn Perspective => chọn Open Perspective => chọn Other (tương ứng với các bước 1 -> 2 -> 3 -> 4) như hình bên dưới. Hoặc bấm vào biểu tượng ở vị trí số 5 như trong hình.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 2: Sau khi mở Perspective các bạn chọn Database Development như hình bên dưới. Sau đó bấm Open để tiếp tục.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 3: Đây chính là khung làm việc của Database Development trong Eclipse.

  • (1) Data Source Exploer: Hiển thị các thông tin liên quan đến việc kết nối đến database (Tạo kết nối mới, xem thông tin database sau kết nối…)
  • (2) Biểu tượng cho thấy chúng ta đang ở Database Development Perspective.
  • (3) Khu vực chúng ta có thể viết câu query hoặc xem kết quả của các câu query và các thông tin liên quan.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 4: Bây giờ chúng ta sẽ tạo một kết nối mới đến một cơ sở dữ liệu có sẵn với hệ quản trị cơ sở dữ liệu MySQL Server.

Các bạn chuột phải vào Database Connection ở tab Data Source Explorer => và chọn New như hình bên dưới.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 5: Một hộp thoại Connection Profile sẽ mở lên như sau:

  • (1) Các bạn chọn hệ quản trị cơ sở dữ liệu tương ứng, ở đây mình chọn MySQL
  • (2) Các bạn điền thông tin tên kết nối (bắt buộc) và mô tả (không bắt buộc)
  • (3) Bấm Next để tiếp tục.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 5: Ở bước này chúng ta sẽ đi vào chi tiết các thông tin cho việc kết nối hệ quản trị cơ sở dữ liệu.

Các bạn bấm vào biểu tượng dấu (+) như hình bên dưới để thêm driver (là một thư viện hỗ trợ việc kết nối đến database)

Note: Ở đây mình dùng Java và MySQL Server phiên bản 8.0.15 nên mình phải download phiên bản phù hợp. Các bạn có thể download phiên bản phù hợp của thư viện với MySQL Server tại đây:

https://mvnrepository.com/artifact/mysql/mysql-connector-java

+ Bước 6: Sau khi download file thư viện về, ở bước này các bạn vào tab JAR list => Add Jar/zip vào trỏ đến file vừa download về.

=> Sau đó bấm OK để hoàn tất việc thêm MySQL Driver.

  "Làm PM, theo anh không cần biết về code, nhưng phải hiểu về SQL, database, những khái niệm cơ bản của code"
  Các công cụ hữu ích hỗ trợ bạn trong việc tạo testdata

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

  • (1) Ở bước này các bạn bấm vào mũi tên xuống để chọn MySQL JDBC Driver vừa cài đặt ở bước trước.
  • (2) Là các thông tin về cơ sở dữ liệu mà bạn muốn kết nối.
    • (2.1) Tên Database
    • (2.2) URL để kết nối đến database theo format: jdbc:mysql://<hostname>:<port>/<database name>
    • (2.3) Username khi bạn cài MySQL Server
    • (2.4) Password tương ứng với username bên trên.

Các bạn có thể bấm vào lưu mật khẩu để lần sau không phải nhập mật khẩu.

  • (3) Bấm vào Test Connection để kiểm tra kết nối đến database.
  • (4) Nếu thông báo là Ping Succeeded! là kết nối thành công.
  • (5) Bấm Finish để hoàn tất việc kết nối.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

+ Bước 7: Ở đây sau khi kết nối giả sử mình muốn xem dữ liệu của bảng tbl_user mình có thể chuột phải vào bảng: Data => Edit.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

Và đây chính là dữ liệu trong bảng tbl_user. Các bạn có thể tìm hiểu thêm các thao tác với bảng, cơ sở dữ liệu nhé.

Hướng dẫn cách kết nối đến Database MySQL trong Eclipse

Lời Kết

Trên đây là các bước giúp bạn kết nối đến Database MySQL trong Eclipse, cũng khá đơn giản phải không nào!

Vậy là trong bài viết này mình đã hướng dẫn với các bạn cách kết nối đến hệ quản trị cơ sở dữ liệu MySQL Server để chúng ta có thể thao tác với dữ liệu trực tiếp trên IDE thay vì sử dụng thêm công cụ MySQL Workbench rồi ha.

Thực tế việc thao tác với cơ sở trực tiếp trên các IDE như thế này sẽ có một số hạn chế so với các công cụ chuyên dụng. Song, nó sẽ giúp chúng ta thuận tiện hơn trong nhiều trường hợp. Cảm ơn và hẹn gặp lại các bạn trong bài viết tiếp theo nha.!

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

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

Một chút vui vẻ với Go

Một chút vui vẻ với Go

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

Hế nhô các bạn, sau một thời gian làm việc với NodeJS thì mình biết đến go một cách tình cờ qua một lần đi phỏng vấn. Và bây giờ mình đã đến với Go bằng tất cả tâm tư, cũng như những kinh nghiệm khi mình đã làm việc với NodeJS

  10 Add-on Google Sheets phải có dành cho các Recruiters

  10 Công cụ Go-To Tech dành riêng cho các Software Developer

Ngày Đầu học Go, đọc đâu cũng thấy Go Channel is awesome, Go is concurrency, the modern programming language…, thật là thú vị, google vài vòng mình cx nhanh chóng nhận ra một điểm mà Go làm tốt hơn NodeJS là create Worker process, channel và goroutine là nguyên nhân khiến việc kiểm soát Worker dễ hơn NodeJS rất nhiều, ví dụ để giới hạn n Worker cùng nhau chạy đồng thời chúng ta chỉ cần tạo cho nó một buffered channel sau đó chạy n Worker trong n goroutine.

// create a buffered channel
var UploadPool chan WorkerMessage

// worker subcribe to channel and do something with it Sleep for example
func Worker(UploadPool chan WorkerMessage){
  for {
	workerMessage := <- UploadPool
   	time.Sleep(time.Second)		
  }
}
// init function to run n worker in goroutine
func InitWorker(numWorker int, UploadPool chan WorkerMessage){
	for i:=1;i<=numWorker;i++{
		go Worker(UploadPool)
	}
}

Và tiếp theo đây, nhân dịp mình đang dùng NodeJS để xử lí upload ảnh, và resize ảnh nên mình sẽ làm điều tương tự với GoLang để xem chúng nó có gì hay.

Follow Chart

Một chút vui vẻ với Go

Nào cùng bắt đầu với Follow 1: Lắng nghe form-data request từ front end và save file to local. Mình sẽ sử dụng Gin Framework, một web framework nhiều sao nhất trên github.

func HandleUploadForm(c *gin.Context) {
	form,_ := c.MultipartForm()
	files := form.File["files"]
	var fileNames []string
	for _, file := range files {
		fileName :=fmt.Sprintf("%v",uuid.New()) + file.Filename
		fileNames = append(fileNames,fileName)
		c.SaveUploadedFile(file, "storage/image/"+fileName)
	}
	c.JSON(200, utils.ApiResponse{
		Ok:      true,
		Message: "Uploaded successfully.....",
		Data:    fileNames,
	})
	for _,fileName := range fileNames{
    // loop and push WorkerMessage to UploadPool for Worker.
		UploadPool <- WorkerMessage{FileName: fileName,Resize:true}
	}
}

Như trong đoạn code đầu chúng ta đã có n Worker chạy concurrency và đang trong trang thái chờ nhận file để upload lên GCloud. Thêm cho nó 1 function để nó có thể upload lên GCloud nào. Thêm channel finished cho mỗi goroutine để có thể hứng được kết quả của mỗi task upload, tuỳ vào kết quả và theo logic của mỗi người mà chúng ta sẽ xử lí tiếp.

func uploadToGCloudStorage(fileName string, finished chan bool) {
	f, err := os.Open("storage/image/" + fileName)
	if err != nil {
		utils.Logger("error", err)
		return
	}
	defer f.Close()
	object := Bucket.Object(fileName)
	wc := object.NewWriter(context.Background())
	if _, err = io.Copy(wc, f); err != nil {
		utils.Logger("error", err)
		return
	}
	if err := wc.Close(); err != nil {
		utils.Logger("error", err)
		return
	}
	fmt.Println(utils.ApplyStyle("bold", "yellow", "Upload to Cloud successfully...."))
	object.ACL().Set(context.Background(),storage.AllUsers,storage.RoleReader)
	objectAddress := ObjectAddress{
		ID:primitive.NewObjectID(),
		FileName: fileName,
	}
	_,err = database.Models.Object.InsertOne(context.Background(),objectAddress)
	if err != nil {
		utils.Logger("error",err)
	}
	finished <- true
}


func UploadImageTaskConsumer(UploadPool chan WorkerMessage){
	for {
		workerMessage := <- UploadPool
		finished := make(chan bool)
		if workerMessage.Resize == true {
			go ImageAnalysis(ObjectAddress{
				FileName: workerMessage.FileName,
			})
		}
		go uploadToGCloudStorage(workerMessage.FileName,finished)
		<- finished
	}
}

Vậy là xong vụ upload file, so sánh với NodeJS thì thay vì phải quản lí Worker rất vất vả nodejs thì giờ đây, chúng ta có thể làm điều đó dễ dàng với Go Channel.

Các bạn có thể xem responstory của mình tại đây, mình mong được các bạn góp ý để cải thiện bản thân, trở nên tốt hơn.

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

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

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

Kết nối Database động với PHP, Dynamic Database Connection!

database connection

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Hôm nay mình cùng trở lai với PHP nhé. Chắc hẳn chúng ta đều đã biết hầu hết các hệ thống/ứng dụng đều sử dụng ít nhất 1 hệ quản trị Cơ sở dữ liệu để lưu trữ dữ liệu cho ứng dụng của mình. Thông thường các hệ thống đó có thể sử dụng một hoặc nhiều Database. Tuy nhiên phần lớn chúng đều được khai báo cố định trước trong các file config. Một ngày đẹp trời, chúng ta cần xây dựng một hệ thống mà cần quản lý, kết nối tới nhiều Database khác nhau nhưng lại không được khai báo và xác đinh trước. Vậy chúng ta sẽ xử lý ra sao? Bài viết hôm nay mình sẽ chia sẻ phương án giải quyết cho việc kết nối động tới Database (dynamic database connection). Cụ thể mình sẽ minh họa đối với PHP CodeIgniter.

Kết nối Database động với PHP, Dynamic Database Connection!
Dynamic Database Connection

Giải pháp

Các bước thực hiện như sau:

  • Tạo helper xử lý việc trả về cấu hình chuẩn để kết nối Database
  • Load dữ liệu thông tin Database trước khi cần kết nối
  • Sử dụng helper để render dữ liệu config với Database trên
  • Load model với config Database mới

Việc làm database lương cao

Tạo Helper

Tạo 1 file helper, đặt tên là db_dinamic_helper.php trong folder application/helpers

Kết nối Database động với PHP, Dynamic Database Connection!
Code Helper demo

Sau khi tạo helper chúng ta cùng thêm function để render cấu trúc config PHP. Trên hình là code mình sử dụng với CodeIgniter. Một điệu đặc biệt quan trọng là thêm helper trên vào Autoload.

Xem thêm Việc làm php hấp dẫn

Load thông tin kết nối Database

Ở bước này, các bạn load thông tin kết nối của Database bạn đang muốn kết nối tới. Dữ liệu này có thể nhập liệu từ trên hệ thống, hoặc đi theo thông tin của khách hàng, hoặc đến từ bất kỳ nguồn nào. Miễn sao đảm bảo đủ các thông tin bắt buộc sau:

  • Host: IP Database server / localhost
  • Username+Password: Tài khoản có quyền truy cập Database
  • Database Name: Tên của Database
  • DB Driver: Phương thức kết nối tới Database (mysqli, sqlsrv….)
  "Làm PM, theo anh không cần biết về code, nhưng phải hiểu về SQL, database, những khái niệm cơ bản của code"
  Chạy database migration khi deploy, nên hay không?

Kết nối model với Database mới

Sau khi đã có thông tin config để kết nối với Database mới, việc tiếp theo cần làm là sử dụng helper để render ra dữ liệu config chuẩn của DB sau đó load model với config đó.

Dưới đây là ví dụ: trabajador.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Trabajador extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
        $this->load->driver('cache');
        $this->load->helper(array('form', 'url','otros_helper','fechas_helper','imagen_helper','config_helper','permisos_helper'));
        $this->abbost_hotel = @$this->session->userdata('sess_abbost_hotel_'.substr(base_url(),-8,7));
        if(!@$this->abbost_hotel->usuario_id) redirect ('acceso');

            $nombre_bd = $this->abbost_hotel->nombre_bd;
            $config_app = switch_db_dinamico($nombre_bd);
            $this->load->model(array('model_producto','model_trabajadores','model_habitacion','model_tareas','model_notif'));
            $this->model_trabajadores->app_db = $this->load->database($config_app,TRUE);
            $this->model_habitacion->app_db = $this->load->database($config_app,TRUE);
            $this->model_producto->app_db = $this->load->database($config_app,TRUE);
            $this->model_tareas->app_db = $this->load->database($config_app,TRUE);
            $this->model_notif->app_db = $this->load->database($config_app,TRUE);
         date_default_timezone_set("America/Lima");
        //if(!@$this->user) redirect ('inicio/login');
        //$permisos = cargar_permisos_del_usuario($this->user->idusuario);
    }
    public function index()
    {
        //...
    }

Và ở model cần chỉnh sửa như sau: Chúng ta cần khai báo $app_db và tất cả các hoạt động truy vấn dữ liệu tới Database đều sử dụng qua biến này.

<?php
class Model_tareas extends CI_Model {
    public $app_db;
    public function __construct()
    {
        parent::__construct();
    }
    public function m_cargar_tareas_activas()
    {
        $estado = 1;
        $this->app_db->select("tarea_id, prioridad");
        $this->app_db->from('tarea');
        $query = $this->app_db->get();
        return $query->result_array();
    }
}

Như vậy ở controller, sau khi load được config của Database cần kết nối, chúng ta sẽ load model theo config đó và thao tác dữ liệu với Database mới đó. Hệ thống lúc này có thể kết nối linh động tới nhiều Database mà không cần khai báo trước. Mọi người có góp ý thì cùng trao đổi dưới comment nhé.

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

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

Lợi ích của việc học lập trình

Lợi ích của việc học lập trình

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

Kỹ năng coding không chỉ sẽ mở ra cánh cửa cho một nghề nghiệp vô cùng tuyệt vời và linh hoạt trong công nghệ, mà còn dẫn dắt bạn tạo ra những thay đổi mạnh mẽ đến thế giới. Và đây là những lợi ích bạn sẽ nhận được từ việc học lập trình.

  "Ngành IT này học rất dễ, tài liệu ko bao giờ thiếu. Quan trọng là phải có đam mê và chịu cày"
  2 nhận định sai lầm về việc bắt đầu học lập trình

1. Công nghệ ở mọi nơi

Những ngày này, ngành công nghệ cao không còn chỉ đơn thuần là ngành công nghiệp công nghệ. Máy tính và code có ở khắp mọi nơi. Trường học, bệnh viện, văn phòng chính phủ — tất cả đều dựa vào cơ sở hạ tầng kỹ thuật số — và điều đó có nghĩa là cơ hội việc làm cho các lập trình viên sẽ ngày càng tăng cao.

Tech là một lĩnh vực cực kì đa dạng và linh hoạt, vì vậy, bạn sẽ không bao giờ biết nó có thể đưa mình đến đâu. Tuy vậy, bạn sẽ cần có công cụ trong chuyến hành trình đó và việc học coding chính là chiếc chìa khóa mà bạn đang tìm kiếm.

2. Tính linh hoạt

Trong thế giới công nghệ ngày nay, càng nhiều kỹ năng thì bạn càng có giá trị. Giả sử nếu bạn là một chuyên gia về Photoshop và Illustrator, nhưng bạn cũng quen thuộc với WordPress và PHP (Hoặc HTML và CSS).

Mỗi kỹ năng này sẽ khiến bạn trở nên hấp dẫn hơn trong mắt khách hàng và người tuyển dụng. Bạn càng có nhiều kỹ năng, càng hiểu rõ về code thì bạn càng có nhiều cơ hội thăng tiến trong sự nghiệp.

3. Không lo thất nghiệp

Theo burning-glass.com, các công việc lập trình đang tăng nhanh hơn 50% so với thị trường việc làm nói chung và nhanh hơn 12% so với mức trung bình của thị trường. Do đó, nếu được trang bị những kỹ năng này, bạn sẽ không lo việc bị thất nghiệp.

Mặt khác, bạn cũng sẽ có được các đặc quyền như khả năng làm việc từ xa, lịch công việc linh hoạt và mức lương cao hơn hẳn nhiều người.

4. Kiếm thêm tiền

Tiền không phải là tất cả. Nhưng ai cũng muốn kiếm nhiều tiền hơn, đúng không? Với một nghiên cứu trong năm 2014 đã cho thấy các vị trí bắt đầu trong IT tại một số công ty dao động từ 88.500 đô la ~ đến 128.000 đô la.

Nói cách khác, cuộc sống của bạn sẽ được cải thiện đáng kể khi mức chi tiêu trở nên thoải mái hơn cũng như việc bớt phải bận tâm về gánh nặng tiền bạc.

5. Bạn có thể làm gần như mọi thứ!

Kỹ năng mã hóa cho phép xây dựng các trang web và ứng dụng bạn cần để hoàn thành công việc mà không cần phải dựa vào những người khác. Trong một thế giới kinh doanh nơi các trang web và ứng dụng là cực kì quan trọng thì khả năng để làm những việc này cho chính bạn sẽ giúp tăng năng suất và hiệu quả trong công việc.

Bạn có thể tự tạo nội dung của riêng mình trong HTML để mọi thứ đều theo đúng như ý muốn. Và bạn cũng sẽ không phải chờ hỗ trợ kỹ thuật để giúp điều hành blog hoặc trang web hay email. Mọi thứ sẽ được tạo từ bởi chính bạn.

6. Tư duy sáng tạo

Tư duy sáng tạo là một kỹ năng quan trọng đối với bất kỳ nghề nào, đặc biệt là trong lĩnh vực công nghệ. Code chính là ngôn ngữ của sự sáng tạo của chính bạn. Vì vậy, việc học cách viết code sẽ không chỉ mang lại những lợi ích liên quan trực tiếp đến kỹ năng lập trình mà nó còn giúp bạn trau dồi tư duy logic và đưa bạn đến một cấp độ giải quyết vấn đề hoàn toàn mới.

7. Làm chủ robot

Khi automation tiếp tục phát triển và thay thế dần cho lực lượng lao động, nhiều công việc cũng sẽ bắt đầu… tuyển robot vào làm. Một điều chắc chắn là con người vẫn sẽ cần thiết để lập trình và giám sát các hệ thống tự động.

Nói cách khác, vị trí của bạn sẽ được cải thiện và nhảy vọt từ những người làm công thành những nhà quản lí cấp cao.

Vậy thì còn chần chừ gì nữa, hãy học lập trình ngay hôm nay!

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

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

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

Rate Limiting with Go and Redis

Rate Limiting with Go and Redis

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

Hế nhô các bạn, hôm nay mình xin được trình bày một giải pháp đơn giản để hạn chế spam connection tới server khiến server mất tài nguyên để xử lí.

Mình sẽ dùng Redis để cache số request mà client đã thực hiện đến server, và dựa vào IP để xác minh client. Xác minh theo IP thì sẽ dẫn dến 1 hậu quả là sẽ vô tình từ chối connection đến từ các client khác sử dụng chung một network với client đó.
Việc chọn thứ gì để phân biệt client thì đó là do các bạn lựa chọn nhưng trong bài này mình sẽ dựa vào IP để phân biệt người dùng 😀

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

  Áp dụng Rate Limiting vào hệ thống như thế nào?

Trước hết Redis là một loại dữ diệu được lưu trữ có cấu trúc được lưu trong ram, nó được lưu trong Ram nên các thao tác đọc/ghi sẽ rất nhanh, ngoài ra nó có hỗ trợ back up xuống/ restore từ ổ cứng.

Để chạy Redis thì mình sẽ chạy Redis trong docker container vì việc này rất đơn giản chỉ với hai command bạn đã có server redis. Rất nhanh để test.

  • RUN docker pull redis
  • RUN sudo docker run --name my-redis -p 6379:6379 -d redis

Vậy là chúng ta đã có 1 server Redis đang lắng nghe trên cổng : 6379

Mình thường dùng Gin Framework để viết Web App trong Go, lí do thì vì mình thấy hỗ trợ khá tốt những thứ mình cần như, BindQuery, Parse Form Data hỗ trợ MiddleWare và cú pháp rất thân thiện

Rate Limiting with Go and Redis

Hình trên mình có 1 middleware tên là “useRateLimit” nhận vào 2 tham số là “rateLimit” và “second” ở đây mình muốn trong “second” seconds thì giới nhận chỉ nhận “rateLimit” request và nếu số request vượt sẽ bị từ chối xử lí.

Với Redis mình sử dụng package này “github.com/go-redis/redis” được khá nhiều sao và hỗ trợ gần như đầy đủ.

Ở phần khởi tạo redisClient mình set giá trị cho field “PoolTimeOut” = 60s là để giới hạn khoảng thời gian từ lúc redisClient khởi chạy lệnh tới redis-server nếu trong 60s đó nếu lệnh chưa thực hiện được thì sẽ được huỷ. Các bạn có thể set sao cho phù hợp.

Xem MiddleWare có gì nào ^-^

Rate Limiting with Go and Redis

Ở đây useRateLimit sẽ trả một một “gin.HandlerFunc” ở function handler chúng ta sẽ lấy địa chỉ IP của client và tiến hành thực hiện function “incRequestCount” để ghi nhận request của client.

Chúng ta sẽ làm như Follow chart dưới đây.

Rate Limiting with Go and Redis

Rate limiting Follow Chart

Mình sử dụng Lệnh “SetNX” , “Incr” và dùng trong một Transaction để bảo đảm tính sẽ chỉ có duy nhất một bộ thao tác thay đổi gía trị với một key tại một thời điểm và mọi bộ thao tác với giá trị của key sẽ được thực thi sau thời điểm đó.

Rate Limiting with Go and Redis

Function sẽ bắt dầu một Transaction bằng cách theo giõi biến Key nếu không có bất cứ thao tác nào khác với biến thì nó sẽ lock tạm thời không cho các Transaction khác thao tác với biến cho đến khi function thực hiện xong.

Lệnh “SetNX” , set một giá trị cho một biến đó nếu nó chưa có sẵn trong database, và sẽ hết hạn trong EX second (không bắt buộc)

Lệnh “Incr” sẽ tăng giá trị biến đó lên 1 đơn vị

Áp dụng cả hai thì chúng ta sẽ đếm được số request liên tục và tăng giá trị cho tới khi nào gía trị đó hết hạn và được khởi tạo lại.

Sau khi tăng số lần client request nếu giá trị đó vượt qua “rateLimit” đã được quy ước thì fucntion sẽ trả về một lỗi vượt quá giới hạn request nếu không thì sẽ không trả về lỗi.

Ở function “useRateLimit” chúng ta nhận được kết qủa mà quá trình tăng số request trả về, và giá trị là lỗi thì chúng ta sẽ từ chối kết nối bằng Status 403 và nếu không thì ta sẽ cho server tiếp tục xử lí Request.

Vậy là xong rồi chỉ với vài dòng code đơn giản ta đã có thể chặn được số lượng lớn spam request. Để cải tiến thì sẽ cần phải làm nhiều, ví dụ như là BLock luôn IP trong khoảng bao lâu đó, hay để không block oan uổng ngừời cùng chung network thì sẽ phải tìm thêm cách để phân biệt client, nhưng trong khuổn khổ bài viết mình sẽ dừng lại ở đây.

Source code các ban có thể có thể xem và góp ý giúp mình tại đây

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

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

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

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Bài viết được sự cho phép của tác giả Tô Thị Vân Anh

Bạn có thể gặp Authentication popup này khi thực hiện truy cập vào một trang ứng dụng hay địa chỉ nào đó, ở đây bạn cần phải nhập tên đăng nhập và mật khẩu đúng để có thể thực hiện tiếp các thao tác, tác vụ tiếp theo trên trang đó. Loại popup này không phải là popup thông thường được sinh ra từ java-script của ứng dụng đó, mà là một loại hộp thoại của trình duyệt, do đó mà Selenium không thể thực hiện với cách mà chúng ta vẫn làm là sử dụng sendKey() được.

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Để giải quyết vấn đề này, chúng ta có hai cách như dưới đây là những cách mà mình tổng hợp được, các bạn có thể tham khảo và nếu có thêm cách nào khác thì vui lòng chia sẻ cho mình và các bạn khác nữa nhé! 😀

  JavaScript Executor trong Selenium Webdriver
  Selenium là gì? Giới thiệu chi tiết về Selenium Automation Testing

1. Sử dụng Selenium webdriver

Cách đơn giản nhất là truyền trực tiếp username và password cùng với đường dẫn trang web yêu cầu theo cú pháp:

http://Username:Password@SiteURL

Mình có ví dụ:

http://msanh:12121221@www.thichanbanhcuon.com.vn

Trong đó:

msanh là username của mình

12121221 là mật khẩu

Và trang web đăng nhập của mình ở đây là http://www.thichanbanhcuon.com.vn

Code thì sẽ như thế này:

String URL = "http://" + msanh + ":" + 12121221 + "@" + www.thichanbanhcuon.com.vn;
driver.get(URL);
Alert alert = driver.switchTo().alert();
alert.accept();

2. Sử dụng AutoIT

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Bằng cách sử dụng AutoIT ta cũng có thể xử lý được với trường hợp popup này như sau.

Nếu bạn chưa cài đặt AutoIT thì tham khảo qua các bước mình đã đề cập ở bài viết này nhé!

Nếu đã sẵn sàng rồi, thì chúng ta bắt đầu tạo một AutoIT script có nội dung cú pháp như dưới đây:

; To pass user name and password
WinWaitActive("Windows Security")
Send("admin")
Send("{TAB}")
Send("admin")
Send("{ENTER}")

Hoặc có thể viết gộp như này cũng được:

WinWaitActivate("Authentication Required","")
Send("rajkumar{TAB}myPassword{ENTER}")

Lưu lại và sau đó compile AutoIT script file này thành 1 file exe, lấy đường dẫn của file exe này rồi đưa vào code thôi:

public static void login(String email, String password) throws Exception{
driver.get(URL);

//Passing the AutoIt Script here
Runtime.getRuntime().exec("D:\\Selenium\\AutoItFiles\\ExecutableFiles\\HandleAuth.exe");
driver.findElement
loginpage.setEmail(email);
loginpage.setPassword(password);
loginpage.clickOnLogin();
}

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

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

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

Ý nghĩa đằng sau công cụ Insights Tool của Ahamove

dữ liệu khách hàng
Dữ liệu khách hàng phục vụ như thế nào cho việc tăng doanh thu của merchants?

Tổng hợp dữ liệu khách hàng và phát triển một Insights Tool có vai trò quan trọng như thế nào đối với khách hàng (merchants) và đối với doanh nghiệp B2B như Ahamove? Cùng tìm hiểu về ý nghĩa của công cụ / công nghệ này đối với mục tiêu kinh doanh qua topic “How We Get Powerful Insights From Aggregating Consumer Data”, trình bày bởi anh Phó Hoàng Hướng – Head of Business Intelligence @Ahamove.

dữ liệu khách hàng
Consumer data và các insights tools

Về Ahamove

Ahamove là công ty hoạt động trong lĩnh vực giao hàng, một on-demand platform on logistics service. Một user có nhu cầu giao hàng sẽ truy cập vào app Ahamove để tạo giao dịch. Từ đây sẽ phát sinh một demand, tài xế đóng vai trò là supply sẽ đến vị trí user lấy hàng và giao đến người nhận cuối cùng.

Câu hỏi đặt ra là customer của mình hiện tại là ai và họ đang có nhu cầu gì? Để từ đó, công ty có những hướng sử dụng data phù hợp hơn trong việc phục vụ họ.

  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết
  5 nguyên nhân chính vì sao các nhà khoa học dữ liệu rời bỏ công việc của mình

Khách hàng của Ahamove là ai?

Có 80% khách hàng của Ahamove hiện tại là các merchants – những hộ kinh doanh vừa và nhỏ. Do đó, các mặt hàng kinh doanh của họ thường là thức ăn nhanh, mỹ phẩm, quần áo,… Vậy nên, vấn đề cần giải quyết của Ahamove là bên cạnh việc tìm kiếm một đối tác giao hàng còn phải làm sao để đáp ứng được mong muốn của các merchants.

Để làm được điều đó, chúng tôi sẽ tiến hành các dự án, nghiên cứu, research để mang đến cho các merchants những thông tin bổ ích và phù hợp nhất mà họ có thể tham khảo và sử dụng.

Vậy merchant cần những gì? Mình sẽ phải tìm ra xem người tiêu thụ của họ đang ở đâu? Nhìn chung, các merchant sẽ mong muốn tìm kiếm người tiêu dùng ở khắp mọi nơi vậy nên họ sẵn sàng chi rất nhiều tiền để tìm được các khách hàng thực thụ của mình. Điển hình là ở lĩnh vực Digital Marketing, họ sẵn sàng đầu tư tiền bạc để quảng cáo trên Facebook, Google, Youtube. Hoặc trong ngành F&B, merchants sẵn sàng lấy số tiền lời của mình để cho các app giao hàng nhằm có được nhiều đơn hàng hơn từ các nguồn này.

Làm thế nào để tổng hợp những data hiện tại và đưa ra các insights tool?

Ahamove sẽ kết hợp với các data public để đưa ra các insights cho merchant của mình, giúp giải quyết nhu cầu về việc muốn tìm hiểu xem, khách hàng của merchant đang ở đâu. Để làm được điều này, chúng tôi thường chia thành 2 hướng chính:

  1. Thứ nhất là tập trung vào mặt hàng họ đang kinh doanh.
  2. Thứ hai là tập trung vào vị trí khách hàng của merchant và những gì mà họ đang tiêu thụ.
dữ liệu khách hàng
Tập trung vào sản phẩm và mục đích tiêu thụ giúp giải quyết được vấn đề

Trending

Thông qua trending, chúng ta có thể thấy được xu hướng cũng như sự thay đổi của các mặt hàng: xem nó đang tăng, giảm hay giữ ở mức trung bình, thông qua các ngày, tuần, tháng như thế nào. Khi phân tích, mình có thể nhận ra một số insights khá bổ ích như trong khoảng thời gian từ tháng 8 đến tháng 9, những mặt hàng về đồng hồ, thời trang, giày dép,… có xu hướng tăng, khác hoàn toàn so với những năm trước.

Khi phân tích cụ thể vấn đề, mình nhận ra là do nó chịu ảnh hưởng từ nghị định 98 của chính phủ, quy định sẽ phạt những hộ kinh doanh kinh doanh các mặt hàng không chính ngạch. Lúc này các merchant nhập hàng thông qua đường tiểu ngạch bắt đầu xả kho, bán nhiều hơn vô tình tạo ra nhu cầu cao hơn vì giá rẻ.

Category Analyst

Khi chọn một mặt hàng, chúng ta sẽ xem được các heat map của consumer đang tập trung ở đâu. Một merchant có thể bán cross-sale nhiều mặt hàng khác nhau, họ có thể quan sát một cách tổng quan hơn xem khách hàng đang ở đâu.

Một điểm nữa là nếu chúng ta chọn quá nhiều mặt hàng overlap với nhau thì kết quả sẽ cho ra một thị trường khá phân tán, không thể cho thấy một kết quả mang tính tổng hợp, phản ánh được bản chất vấn đề.

Khi nghiên cứu, mình phát hiện ra một vấn đề, đó là chúng ta hay mặc định một merchant sẽ chỉ bán một ngành hàng, chẳng hạn như F&B thì chỉ bán thiên về các sản phẩm thuộc ngành F&B nhưng hoàn toàn không phải vậy.

Các merchant thường khá nhạy cảm với thị trường và luôn biết cách nắm bắt các trends. Họ có thể bán rất nhiều các mặt hàng không liên quan đến nhau miễn là nó đáp ứng được nhu cầu thị trường. Nhờ việc tận dụng tính năng category analyst này, họ có thể tối ưu hóa lợi nhuận và tận dụng nguồn dữ liệu khách hàng của họ để kinh doanh tốt hơn.

Xem thêm Big Data là gì? Tất tần tật về Big Data

Location Analyst

Khi chọn một vị trí, insights tool sẽ đưa ra thông tin ngành hàng nào đang chiếm ưu thế hơn so với ngành hàng khác ở cùng vị trí đó. Qua đó các merchant có thể tìm được những địa điểm kinh doanh thích hợp hơn. Họ có thể tối ưu hóa lợi nhuận bằng cách chuyển đến những vị trí gần hơn chẳng hạn.

Một điểm khá hay nữa là chúng ta có thể phân tích được sự khác nhau giữa hai địa điểm, phân tích xem ở khu vực nào người tiêu dùng sẽ mua nhiều mặt hàng gì.

Từ những thông tin và dữ liệu khách hàng đang có, chúng ta có thể tổng hợp và đưa ra các insights khá quan trọng, để từ đó phân tích xem đâu là vấn đề mà người dùng của merchant đang cần và họ nên làm gì để tối ưu hóa lợi nhuận của mình.

Bài viết được trích dẫn từ phần trình bày của anh Phó Hoàng Hướng tại sự kiện Vietnam Web Summit 2020 LIVE do TopDev tổ chức


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

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

DNS là gì? Tại sao chúng ta lại bị nhà mạng chặn khi vào web không lành mạnh?

DNS là gì ? tại sao chúng ta lại bị nhà mạng chặn khi vào web không lành mạnh.

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

Hế nhô các bạn, hôm nay mình vừa tìm hiểu về DNS và muốn chia sẻ với các bạn những điều mình vừa mới biết.

Chắc hẳn các bạn ai cũng đã từng sử dụng trình duyệt, nhập địa chỉ trên thanh địa chỉ, cuối cùng nhấn enter rồi cả một thế giới mới hiện trước mắt chúng ta. Rồi chắc các bạn đã nhìn thấy ai đó gõ một cụm 4 số cách nhau bởi dấu “.” xong enter cái bụp rồi cũng hiện ta những gì bạn đã làm với những con chữ kia chứ 😀

  System Design Cơ Bản: Domain Name System (DNS)

  3 cách xóa phần tử bị duplicate trong mảng

Khi bạn vào một trang Web thì thực chất bạn đang nhờ trình tuyệt tìm địa chỉ của website đó, cái mà có 4 số cách nhau bởi dấu “.” ý. Trình duyệt sẽ làm những việc gì đó để tìm ra cái địa chỉ 4 số đó. Và cái 4 chữ số đó người ta gọi là IP còn cụm chữ kia người ta gọi là Tên Miền (Domain trong tiếng anh)

IP và Domain luôn song hành với nhau, việc nhớ Domain sẽ rất dễ so với việc nhớ mấy con số kia, từ IP bạn sẽ truy cập vào được tài nguyên của máy chủ nhưng khi bạn có trong tay Domain thì chưa chắc bạn có thể tìm được máy chủ nhà người ta.

Mỗi Domain được một cấp bởi một tổ chức quản lí Domain và tổ chức đó có sẵn công cụ để giúp ta tìm được địa chỉ IP máy chủ ứng với tên miền đó. Cái đó được gọi là DNS viết đầy đủ là Domain Name System dịch ra tiếng việt là Hệ thống phân giải tên miền.

Khi bạn truy cập vào một Domain, việc đầu tiên trình duyệt sẽ làm là nhờ các DNS server tìm kiếm địa chỉ IP ứng với tên miền đó. Mặc định nếu bạn không chỉ định DSN server thì bạn sẽ dùng DSN server của Nhà cung cấp dịch vụ mạng cho bạn, cái tổ chức mà hàng tháng cứ đến cuối tháng là thu tiền mạng, hay phải goị điện thoại chửi mỗi khi nó bóp băng thông khiến mạng như rùa ý haha.

Chính vì việc bạn sử dụng DNS server của nhà mạng nên họ sẽ ngăn chặn việc bạn truy cập vào các trang Web không lành mạnh. Họ đơn giản chỉ cần không trả về cái địa chỉ IP đó.

Vậy để muốn truy cập các trang web đó bạn cần phải sử dụng DNS server khác, của Google chẳng hạn, google sẽ không chặn bạn đâu.

Và để sử dụng DNS server của ai đó các bạn hãy xem qua bài viết này .

Vậy nếu có nhiều DNS server và nhiều nhà cung cấp Domain thì làm sao để biết Domain nào là của tổ chức nào là làm sao để các tổ chức có thể trao đổi thông tin cho nhau.

Để giải quyết vấn đề này sẽ có một tổ chức đứng chịu trách nhiệm điều hành, tổ chức đó có tên là “Internet Corporation for Assigned Names and Numbers”

Họ sẽ điều hành hệ thống “Root Domain”, chia tên miền thành các kiểu có dạng “.com, .vn, .net, .org”. Cái đó gọi hệ thống “Top Domain” và cứ như vậy sẽ dựa từ phân cấp ra thành nhiều bậc thấp hơn.

Vậy khi bạn mua một tên mình của một nhà cung cấp nào đó. Nếu bạn cung cấp địa chỉ IP ứng với tên miền đó, nhà cung cấp sẽ đồng bộ nó lên hệ thống Root Domain và vì thế các DSN server khác sẽ dễ dàng tìm được địa chỉ IP đó.

Đến đây là hết rồi, để tìm hiểu sâu hơn các bạn có thể vào đây để tham khảo.

Bye bye. ^_^

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

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

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

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

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

Chào các bạn, chúng ta đều biết rằng việc học lập trình vốn không phải là dễ dàng và không phải ai cũng có đủ kiên trì để học và học tốt được.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?

Với các bạn sinh viên học lập trình nói riêng và những người học lập trình nói chung thì chắc hẳn đều đã nghe đến khái niệm “Cấu trúc dữ liệu và giải thuật”.

Và chúng ta cũng được khuyên là nên học, nên tìm hiểu về những kiến thức này. Vậy tại sao lập trình viên lại nên học cấu trúc dữ liệu và giải thuật thì mình sẽ cùng các bạn điểm qua một vài lý do trong bài viết này.

  Seminar môn Cấu trúc dữ liệu và giải thuật

  12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2024

#1. Đó là kiến thức nền

Chắc hẳn các bạn ở đây từng được nhiều người khuyên là học gì thì học, nhưng phải nắm chắc kiến thức nền, kiến thức cơ bản rồi phải không ạ !

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Cấu trúc dữ liệu và giải thuật là kiến thức nền rất quan trọng

Vậy như thế nào là kiến thức nền, kiến thức cơ bản? Và tại sao chúng lại quan trọng đến vậy?

Thứ nhất, đối với việc học lập trình nói chung thì kiến thức cơ bản là các kiến thức liên quan đến kiểu dữ liệu, câu lệnh điều khiển, câu lệnh điều kiện… Những kiến thức này không của riêng ngôn ngữ lập trình nào cả.

Cấu trúc dữ liệu và giải thuật cũng vậy. Đó là các kiến thức liên quan đến cách tổ chức giữa dữ liệu và các giải thuật trên từng tổ chức dữ liệu đó. Nó là chung cho các ngôn ngữ lập trình.

Vậy còn câu hỏi tại sao nó lại quan trọng thì sao? Vâng, các bạn biết đó, một chương trình máy tính muốn chạy được phải có dữ liệu và các thuật toán.

Việc đảm bảo được dữ liệu tổ chức theo cấu trúc phù hợp và được thực thi với một thuật toán hợp lý sẽ tăng hiệu suất lên rất nhiều.

#2. Giúp rèn luyện khả năng tư duy

Như mình đã từng đề cập nhiều lần trong các bài viết trước về khái niệm tư duy trong học lập trình – đó là tư duy giải quyết vấn đề.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Cấu trúc dữ liệu và giải thuật là công cụ hữu hiệu trong việc rèn tư duy

Các vấn đề càng mới, càng khó thì càng mang tính rèn luyện cao. Với môn học cấu trúc dữ liệu và giải thuật, chúng ta sẽ vận dụng những kiến thức về cấu trúc dữ liệu (mảng, ngăn xếp, hàng đợi…) và các thuật toán (quy nạp, quay lui, tìm kiếm, sắp xếp, quy hoạch động…) để giải quyết các vấn đề đó sao cho tối ưu nhất.

Không chỉ tối ưu về mặt thời gian mà khi chương trình viết ra phải tối ưu cả về bộ nhớ và không gian lưu trữ. Đó chính là cái khó của môn học này.

Đôi khi cùng một vấn đề nhưng lại có nhiều cách giải quyết khác nhau, bạn buộc phải tìm xem đâu là cách giải quyết tối ưu nhất.

#3. Là một công cụ đánh giá hiệu quả

Theo như mình biết thì đây là một trong những môn học mà số lượng sinh viên có tỷ lệ bị trượt nhiều nhất.

Hồi học môn này, mình may mắn không bị trượt nhưng điểm số cũng không quá cao mặc dù mình đã rất chăm chỉ.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Các sinh viên nhận giải trong kỳ thi lập trình giải thuật

Vậy tại sao nó lại là một công cụ đánh giá hiệu quả? Đơn giản vì nó khó, không phải bạn cứ chăm chỉ là được, cũng không phải cứ may mắn là được, lại càng không phải lười học cũng qua.

Nhiều trường đại học chọn môn này là một trong những môn học mũi nhọn trong chương trình đào tạo. Với phương châm đào tạo ra các kỹ sư giỏi có khả năng giải quyết vấn đề tốt và nhanh thì đây chính là một công cụ rất hữu ích.

Chắc hẳn bạn từng nghe về các kỳ thi lập trình như ACM, ICPC… và thấy được các bạn có giải cao thường được các tập đoàn lớn trao học bổng hoặc tuyển thẳng vào làm.

Có thể nói kiến thức về cấu trúc dữ liệu và giải thuật là một trong những kiến thức nền, nó mang tính đánh giá khá cao.

#4. Có nhiều ứng dụng trong thực tế

Hồi mới học môn này mình thấy nó khó quá, lại nghe mấy ông anh review là học ra cũng chẳng dùng đến nên cũng không quá đào sâu.

Tại sao lập trình viên nên học cấu trúc dữ liệu và giải thuật?
Nhiều thuật toán tìm kiếm ứng dụng trong việc tìm đường đi mê cung

Sau một thời gian đi làm thì mấy thấy họ nói đúng nhưng chưa đủ. Đúng là ở chỗ các kiến thức này ít khi được áp dụng một cách trực tiếp, nhưng chưa đúng ở chỗ là họ bảo chẳng bao giờ áp dụng.

Mình lấy ví dụ hơi chuyên môn một chút đó là: Hồi mới đi làm mình hay code 2 vòng for lồng nhau dẫn đến nhiều trường hợp số lượng bản ghi lớn => chương trình sẽ bị chậm.

Sau này mình biết đến việc dùng Map (một cấu trúc dữ liệu dạng key-value) thay cho vòng for bên trong sẽ giảm mức độ phức tạp và tiết kiệm thời gian hơn rất nhiều, hơn nữa nó cũng làm tăng hiệu năng của ứng dụng nữa.

Ngoài ra, khi bạn làm thực tế nhiều khi bạn chỉ việc gọi hàm (API) và truyền tham số mà không để ý bên trong hàm đó hoạt động như thế nào.

Ví dụ về hàm binarySearch() trong Java chẳng hạn, nếu bạn không học về thuật toán tìm kiếm nhị phân thì bạn làm sao mà hiểu được ý nghĩa bên trong hàm này. Có đúng không ạ!

Đôi khi bạn không nhận ra ứng dụng của môn học cấu trúc dữ liệu này, nhưng thực ra là bạn vẫn đang làm việc với chúng hàng ngày đó.

#5. Kết luận

Vậy là trong bài viết này mình đã cùng với các bạn điểm qua một vài lý do để các bạn lập trình viên “nên” học môn cấu trúc dữ liệu và giải thuật để phục vụ cho công việc của các bạn sau này.

Đây thực sự là một môn học nền tảng giúp bạn rèn luyện tư duy, có thể không cần phải quá giỏi nhưng mình khuyên các bạn đã, đang và sắp học lập trình thì nên học môn này nhé. Đặc biệt là các bạn “tay ngang” có ý định chuyển qua học lập trình.

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

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

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

Các chức năng cần tìm hiểu khi lựa chọn công cụ tự động cho kiểm thử di động

Các chức năng cần tìm hiểu khi lựa chọn công cụ tự động cho kiểm thử di động

Bài viết được sự cho phép của vntesters.com

Hiện nay, với sự phát triển chóng mặt của công nghệ di động, kéo theo sự phát triển mạnh mẽ của ngành kiểm thử di động. Từ đó, trên thị trường xuất hiện ngày càng nhiều công cụ hỗ trợ cho kỹ sư kiểm thử trong lĩnh vực kiểm thử tự động. Lựa chọn chính xác công cụ hỗ trợ tốt nhất cho kiểm thử ứng dụng sẽ giúp chúng ta tiết kiệm được nhiều thời gian, công sức và cả tiền bạc. Dưới đây là vài chức năng mà mình, theo kinh nghiệm cá nhân, nghĩ là cần được xem xét khi lựa chọn công cụ tự động cho kiểm thử di động.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  7 lãng phí trong kiểm thử phần mềm

Hệ điều hành: Hiện tại, có khá nhiều hệ điều hành trong nền công nghiệp di động, từ iOS đến Android, rồi Windows Phone hay BlackBerry/Firefox… Vậy nên, nếu ứng dụng cần kiểm thử của chúng ta được chạy trên nhiều hệ điều hành, hay trong tương lai sẽ hỗ trợ nhiều hệ điều hành khác nhau thì việc lựa chọn một công cụ kiểm thử tự động có khả năng hoạt động trên nhiều nền tảng sẽ giúp tiết kiệm nhiều công sức và tiền bạc.

Loại chương trình: Về lý thuyết, ứng dụng di động được chia làm ba loại – Native, Web và Hybrid. Đôi khi, công cụ kiểm thử không hỗ trợ thực thi kiểm thử trên ứng dụng Native. Do đó, chúng ta cần xác định rõ ứng dụng của chúng ta là dạng nào để có thể lựa chọn công cụ kiểm thử một cách chính xác.

Ngôn ngữ lập trình: Nếu nhóm chúng ta chuyên về Java thì không thể lựa chọn một công cụ chỉ hỗ trợ C#, phải không 🙂

Yêu cầu mã nguồn của chương trình: Một số công cụ kiểm thử yêu cầu được quyền truy cập mã nguồn của ứng dụng để xác định được các đối tượng UI. Một số khác thì không cần. Khi làm outsource, khả năng tiếp cận mã nguồn của đội ngũ kiểm thử sẽ bị hạn chế, vậy nên đây cũng là một chức năng mà chúng ta cần phải quan tâm khi lựa chọn.

Khả năng Record/Playback: Mặc dù sử dụng Record/Playback sẽ cho chúng ta một đoạn mã không tốt như tự viết code. Nhưng, trong trường hợp mới làm quen với công cụ hoặc chúng ta cần nhiều đoạn mã kiểm thử một cách nhanh chóng thì Record/Playback là một chức năng rất mạnh mà công cụ kiềm thử tự động mang đến.

Thiết bị thật hay giả lập: Nếu công cụ chỉ cho phép thực thi kiểm thử trên thiết bị thật thì sẽ làm tăng chi phí kiểm thử lên rất nhiều. Nhưng nếu công cụ chỉ cho phép chạy trên môi trường giả lập, chúng ta không thể mô phỏng một số trường hợp đặc biệt mà chỉ có thể làm với thiết bị thật.

Thiết bị thật trên Cloud: Hiện nay, vì chi phí để có thiết bị thật khá cao, nên thị trường xuất hiện một dạng cho thuê thiết bị thật và chúng ta có thể truy cập thông qua hệ thống mạng Internet. Sử dụng phương pháp này, chúng ta có thể giảm bớt chi phí để có thể kiểm thử ứng dụng di động trên thiết bị thật.

Đa chạm và dấu hiệu: Khác với các ứng dụng Windows, trên di động, hệ thống đa chạm và dấu hiệu (gesture) là một chức năng không thể thiếu. Do đó, yêu cầu công cụ kiểm thử có khả năng giả lập được hành động này của người dùng là một yêu cầu không có gì quá đáng.

Xác nhận đối tượng: Trong kiểm thử tự động, khả năng xác nhận các đối tượng UI là một thành phần quan trọng bậc nhất. Nếu có thể xác định các đối tượng UI một cách chính xác thông qua các thuộc tính duy nhất và ổn định thì chúng ta sẽ giảm bớt thời gian chỉnh sửa các đoạn mã giữa những lần thay đổi/nâng cấp ứng dụng.

Tương tác với bên thứ ba: Trong quá trình kiểm thử, tự động không phải là tất cả. Chúng ta còn cần phải quan tâm đến việc lưu trữ mã nguồn, kết quả thực thi, hệ thống kịch bản kiểm thử và cả hệ thống quản lý bug nữa. Và hầu hết các vấn đề này đều được cung cấp từ một hệ thống thứ ba. Sẽ thật tuyệt nếu công cụ kiểm thử mà chúng ta lựa chọn có thể tương tác với các hệ thống như vậy.

Báo cáo và nhật ký: Thông thường, chúng ta quá chú ý vào việc viết mã nguồn cho các kịch bản kiểm thử, thực thi các đoạn mã nhưng lại không quan tâm đầy đủ đến một bước cực kỳ quan trọng trong kiểm thử tự động, phân tích kết quả thực thi. Một công cụ mà bản báo cáo/nhật ký thực thi quá phức tạp hoặc thiếu chi tiết để có thể phân tích kết quả thực thi thì không phải là một công cụ kiểm thử tự động tốt.

Mã nguồn mở hay bản thương mại: Cuối cùng, quan trọng nhất – Tiền bạc 🙂 Vấn đề này mình xin phép không bàn sâu nha!

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

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

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

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

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

Hôm nay mình thấy một team nói với nhau về Progressive web app mà không phân biệt nó khác Single page app đến mức nào? Và công nghệ chạy background ra sao! Chỉ biết là nó dùng ajax, javascript thư viện của thằng này thằng kia nên nó là Progressive web app đó, chứ hỏng có hiểu là cơ chế hoạt động nó ra sao hết thấy tội mà thôi cũng kệ… luôn chứ sao 😀

  3 bước tối ưu hiệu năng React App bằng các API mới của React
  5 app dù bị đánh giá thấp nhưng không nên bỏ qua

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Như hình mô tả bên trên của mình thì chắc cũng hiểu sơ sơ tốc độ load của từng loại khái niệm về web app, single page app, progressive web app!

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Web app

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Cái này chắc mọi người ai cũng từng nghe web động (dynamic web app) cơ chế hoạt động của web app từ thời sơ khai cho đến nay cũng không thay đổi nhiều với phương thức truyền dữ liệu là Post form hoặc reload trang để Get param từ url.

  • Browser (Client site):
    • Yêu cầu hỗ trợ technique không cần nhiều!
    • Hoạt động: mỗi lần gửi request thì browser phải đợi response, load lại rất nhiều thông tin từ server site như gói dữ liệu html, hình ảnh, css, js,…
  • Web server (Server site): 
    • Mỗi lần nhận response thì Server phải xử lý rất nhiều từ data, bussiness logic và cuối cùng tạo ra view và gửi string html rất nặng về client site.

Bất lợi khá nhiều:

  1. Tổng lại là thời gian load để xử lý từ 2 phía client và server rất nhiều!
  2. Server site xử lý khá nhiều vì phải generate view cho client.
  3. Việc develop tốn nhiều công sức đồi hỏi client site và server site phải có sự liên kết!

Single Page App (SPA)

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Vì sự bất lợi của Web app, Single page app ra đời để cải thiện các điểm bất lợi còn tồn động và single page app xử lý dựa trên nền các library, framework java script và phương thức truyền dữ liệu chính là dùng ajax. Ai dùng Angular (Framework) hay React (Library) sẽ hiểu về nó 😛

  • Browser (Client site):
    • Yêu cầu technique: phải hỗ trợ java script, các library java script dùng ajax là chính.
    • Hoạt động: mỗi lần load page lần đầu khá lâu, vì load master page và khởi tạo các Object model (lưu trữ data vào object java script). Nhưng sẽ không tốn thời gian load lại khi chuyển sang các page khác vì mọi thứ đều được các library hoặc framework sẽ render thành view, còn data sẽ được truyền thông qua ajax và được lưu vào các object!
  • Web server (Server site): 
    • Mỗi lần nhận response thì Server chỉ xử lý data, bussiness logic và gửi data theo kiểu json object dữ liệu rất nhẹ về client site.

Thuận lợi:

  1. Tổng lại là thời gian load để xử lý từ 2 phía client và server giảm rất nhiều!
  2. Server site xử lý và trả về gói dự liệu nhẹ hơn nhiều.
  3. Việc develop client site và server site có thể tách rời riêng biệt rõ ràng hơn!
  4. Việc chuyển trang trên single page và không reload page nên thấy rất nhanh.

Bất lợi:

  1. Developer phải có kiến thức về java script và các library java script render (React, Angular,…) thật kỹ để phát triển front end.
  2. Browser phải hỗ trợ các version java script mới để các library hay framework java script vận hành tốt.
  3. Khi reload page thời gian khởi tạo từ phía client vẫn tốn nhiều thời gian.

Progressive Web App (PWA)

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

Để tối ưu hơn tốc độ load từ Single page app, Progressive web app ra đời để tận dụng các technique từ Browser đã hỗ trợ Java script, Cache, DB local và phương thức truyền dữ liệu chính là Service Worker (Plugin của browser, device dùng thông qua java script và là trái tim của PWA).

  • Browser (Client site):
    • Yêu cầu technique: phải hỗ trợ Java script, Cache, DB local và Service Worker là phương thức chính để nhận data, lưu trữ vào cache hoặc DB.
    • Hoạt động: Mỗi lần đầu load page thời gian load master page và khởi tạo Service Worker không nhiều như SPA. Theo SPA mất 10 giây thì PWA chỉ mất 1 giây. Những lân load page lại thì SPA vẫn tốn 5-10 giây để load thì Service Worker chỉ tốn chưa đến 1 giây.
  • Web server (Server site): 
    • Mỗi lần nhận response thì Server chỉ xử lý data, bussiness logic và gửi data theo kiểu json object object, dữ liệu rất nhẹ.

Thuận lợi:

  1. Tổng lại là thời gian load để xử lý từ 2 phía client và server giảm rất nhiều!
  2. Server site xử lý và trả về gói dự liệu nhẹ hơn nhiều.
  3. Việc develop client site và server site có thể tách rời riêng biệt rõ ràng hơn!
  4. Việc reload trang không còn là vấn đề như SPA.
  5. Trang đã load lần đầu thì các lần sau có thể chạy offline vì mọi thứ đều store dưới local của browser.

Bất lợi:

  1. Developer phải có kiến thức về java script và các library java script render (React, Vue,…) thật kỹ để phát triển front end.
  2. Browser phải dùng version mới để hỗ trợ các version java script để các library hay framework java script sử dụng service worker.
  3. Domain phải dùng HTTPS để bảo mật khi truyền dữ liệu.

Trong tương lai mình thấy được Accelerated Mobile Pages (AMP) sẽ kết hợp với PWA để tạo ra đột phá về trải nghiệm người dùng tốt hơn về thời gian load có thể là tốn zero giây cho first load 😀

So sánh Single Page App (SPA) vs Progressive Web App (PWA)

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

Sự kiện trực tuyến: “Tuần lễ Số” Digital Weeks Southeast Asia sẽ có mặt tại Việt Nam trong tháng 2/2021

Sự kiện online miễn phí dành cho tín đồ đam mê cloud và IT/ công nghệ Digital Week Southeast Asia 2021!

[English below]

W.Media đang tập hợp những người sáng giá nhất và nổi bật thuộc cộng đồng ASEAN trong một Hội nghị trực tuyến (Virtual Conference) kéo dài 4 ngày, bao gồm mọi thứ từ triển khai trung tâm dữ liệu đến ngân hàng kỹ thuật số. Từ ngày 23-26/2, mạng lưới với hơn 3.000 nhà lãnh đạo cấp cao về IT trên khắp các khu vực Philippines, Malaysia, Indonesia, Singapore, Việt Nam và Thái Lan sẽ được kết nối tại Digital Week Southeast Asia.

Digital week digital transformation

Tuần lễ kỹ thuật số (Digital Week) là điểm dừng chân đáng cân nhắc nhất của bạn để có cơ hội lắng nghe các chuyên gia chia sẻ từ khía cạnh Datacenter Deployment to Digital Banking. Các sessions đặc biệt nhất tại Việt Nam diễn ra vào ngày 26/2/2021 sẽ có sự góp mặt của các diễn giả tên tuổi đến từ Viettel, Đại học Quốc gia Hà Nội, Infinity Blockchain, Fortinet…

  Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

digital week: speakers and agenda

Nền tảng trực tuyến của W.Media là một trung tâm cộng đồng rộng lớn để bạn truy cập nhiều nội dung, kết nối và tương tác hiệu quả hơn bao giờ hết:

  • Phòng trò chuyện tương tác trong ngành
  • Trực tuyến – Live các phiên hỏi đáp diễn giả
  • Gọi video 1:1 giữa người tham dự
  • Giải thưởng và cuộc thi toàn hội nghị

Nhanh tay đăng ký ngay hôm nay: https://topdev.vn/s/XXsOSg3b.

digital week agenda day 4
Agenda sự kiện day 4 Vietnam

Calling all Cloud & IT enthusiasts!

Data is transforming Southeast Asia. With the rise of mobile technologies, increasing cloud migration and storage demands at an all-time high, it’s essential to stay up to date on the market’s latest developments and technologies.

W.Media is gathering ASEAN’s best and brightest for a 4-day virtual conference to cover everything from datacenter deployment to digital banking. From 23-26 February, network with 3000+ Senior IT Leaders across the Philippines, Malaysia, Indonesia, Singapore, Vietnam, and Thailand markets.

Digital Week is your one-stop shop to hear experts speak on everything from datacenter deployment to digital banking. Our special Vietnam session on 26th February 2021 will feature international keynote speakers from Viettel, Hanoi National University, Infinity Blockchain, Fortinet, and many more!

For a full list of our 50+ speakers, keep your slot here: https://topdev.vn/s/XXsOSg3b
Our virtual platform is a community hub for you to access more content and engagement than ever:

  • Interactive industry chat rooms
  • Live speaker Q&A sessions
  • 1-on-1 video calls between attendees
  • Conference-wide prizes and competitions

Giới thiệu một số extension trên Chrome cho web developer

Giới thiệu một số extension trên Chrome cho web developer

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

Khi develop website chắc hẳng chúng ta cần sự hỗ trợ của một số plugin để tăng tốc develop cũng như kiểm thử lại chất lượng sản phẩm! Sau đây mình sẽ giới thiệu một số extension trên Chrome cho web developer mình hay sử dụng và thấy chúng khá hiệu quả trong việc hỗ trợ công việc của mình.

  1. Page Analytics (by Google)

    Tool analytics được cung cấp bởi Google cho phép bạn dễ dàng xem việc phân tích tracffic website mà bạn đang quản lý.
    Download

  2. PageSpeed Insights Checker for Mobile

    Tool check speed load trên các thiết bị mobile. Bạn sẽ dễ dàng check tốc độ load của các trang web hiện tại với 1 cú click.
    Download

  3. User-Agent Switcher for Chrome

    Tool này sẽ giúp bạn dễ dàng chuyển user-agent bạn muốn trên website để dễ check giao diện, xử lý,…
    Download

  4. Performance-Analyser

    Sau khi cài tool, tool sẽ tự động đo performance khi bạn load website nên khi nào cần xem chỉ cần click để xem không phải load lại trang và nó không ảnh hưởng tốc độ tải website.
    Download

  5. HTTP/2 and SPDY indicator

    Nếu bạn cần test protocol thì không thể thiếu tool này nó sẽ phân tích cho bạn về http1.1, http2,…
    Download

  6. Lighthouse

    Nếu bạn cần 1 bản report chi tiết về hiệu suất về website thì không thể thiếu tool này. Nó được cung cấp bởi Google, thường dùng để check Progressive Web App,….
    Download

  7. Page load time

    Tool này sẽ cung cấp tóm gọn thời gian load của website để bạn biết nên cải thiện những phần nào!
    Download

  8. Image Analyzer

    Tool này sẽ giúp bạn xem thông tin về size, dung lượng, exif… của từng tấm hình hoặc tất cả hình trên website.
    Download

  9.  Full Page Screen Capture

    Tool này sẽ chụp hình toàn bộ website từ đầu đến đích trong 10 giây.
    Download

  10. SimilarWeb – Traffic Rank

    Tool này sẽ cho bạn biết thông tin về traffic rank hiện tại của website, nguồn truy cập,…
    Download

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

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

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

Phương pháp và kỹ thuật Ngăn ngừa lỗi

Phương pháp và kỹ thuật Ngăn ngừa lỗi

Bài viết được sự cho phép của vntesters.com

Theo softwaretestinghelp

Cách tiếp cận ngăn ngừa lỗi hiệu quả và một cái nhìn cẩn trọng

Bảo hiểm chất lượng (Quality Assurance) là một từ được dùng khá nhiều ngày nay, để chỉ đến nhóm kiểm thử trong dự án IT.

  10 lời khuyên để giảm thiểu mối đe doạ an ninh nội bộ
  4 lỗi mọi người thường mắc phải khi viết CV

Về mặt kỹ thuật, hoạt động QA không chỉ tập trung vào việc xác định lỗi (defect identification – tìm thấy sau khi lỗi xảy ra – đơn giản là kiểm thử – Testing hay quản lý chất lượng Quality Control – QA), mà còn bao gồm cả việc ngăn ngừa lỗi (đảm bảo lỗi không thể xảy ra ngay từ đầu hoặc lỗi được phát hiện và chỉnh sửa trước khi xảy ra trên sản phẩm phần mềm).

Một phương trình tương đương có thể viết như sau:

QA = QC (xác định lỗi) + Ngăn ngừa lỗi

Mặc dù có vẻ đơn giản, nhưng khó để xác định được bằng cách nào hay các công việc cần tiến hành để ngăn ngửa lỗi chính xác là gì.
Và một sự thật là, tìm thấy lỗi trong khi thực thi kiểm thử hay sau khi đưa sản phẩm ra thị trường thì tốn kém hơn tìm và chỉnh sửa trước đó; thêm vào là khả năng mất lòng tin của khách hàng. Do đó, ngăn ngửa lỗi càng sớm sẽ càng tốt. Bên cạnh đó, ngăn ngừa lỗi cũng giúp cho công ty được chứng nhận CMMI với thứ hạng cao.

Ngăn ngừa lỗi

Ngăn ngừa lỗi là một bước hay một hoạt động quan trọng trong quá trình phát triển phần mềm, và có thể được chỉ rõ ở lượt đồ dưới đây, chiếm một phần trong các nhiệm vụ kiểm thử của nhóm kiểm thử.

Về cơ bản, việc ngăn ngừa lỗi cho những kỹ sư kiểm thử trong từng giai đoạn sẽ là:

Đánh giá các yêu cầu chức năng – Requirement Specification Review:

Sau khi hiểu rõ các yêu cầu của khách hàng, kỹ sư kiểm thử cần liệt kê một bản ý chính của yêu cầu cho bản thân.

Một bản đánh giá chung là quan trọng ở bước này – đầu tiên, đánh giá nên được làm chung với cả nhóm, sau đó là đánh giá chung với bên ngoài nhóm (bởi nhóm phát triển – dev hay nhóm phân tích chức năng – BA hay khách hàng) để đảm bảo toàn bộ quan điểm, ý kiến, mối quan ngại đều được thống nhất.

Đánh giá thiết kế

Giai đoạn Thiết kế có thể xem như là một giai đoạn phân loại chiến lược và kiểm tra đầu-cuối sẽ đảm bảo nhóm QA hiểu rõ ưu khuyết điểm của từng chiến lược.

Cách đánh giá này sẽ giúp tìm ra bất kỳ vấn đề tương ứng với từng chiến lược và chỉnh sửa, thay đổi nó trước khi tiến đến giai đoạn kế tiếp. Nó có thể được xem như việc nghiên cứu tính khả thi của chiến lược.

Đánh giá mã nguồn

Không có nhiều việc cho kỹ sư kiểm thử ở giai đoạn này, nhưng việc đánh giá cũng nên có ở đây. Kỹ sư phát triển kiểm tra các mã, kiểm tra đầu-cuối và đánh giá trước khi tiến hành kiểm thử đơn vị, kiểm thử tích hợp ứng dụng.

Phương pháp và kỹ thuật ngăn ngửa lỗi

Một vài phương pháp truyền thống và phổ thông được dùng từ lâu cho việc ngăn ngừa lỗi được liệt kê:

Đánh giá và kiểm tra: Phương pháp này bao gồm việc đánh giá bởi từng thành viên trong nhóm (tự-đánh-giá), đánh giá nhóm và kiểm tra trên toàn bộ tài liệu, sản phẩm.

Kiểm tra đầu-cuối (Walkthrough): Phương pháp này có thể gần giống với Đánh giá, nhưng nó thiên về việc so sánh hệ thống từ khi là nguyên mẫu (prototype), khi mà ý tưởng mới hình thành, so với mức độ chính xác của hệ thống.

Tài liệu hóa lỗi: Phương pháp này cung cấp những thông tin quan trọng và các thông số mà có thể dùng để hỗ trợ việc phân tích lỗi.

Phân tích nguyên nhân (Root cause analysis): Phân tích nguyên nhân bao gồm hai cách tiếp cận chính:

Phân tích Pareto – Nguyên lý 20/80

Phân tích Pareto là một kỹ thuật chuẩn và đơn giản giúp đánh giá mức độ của các giải pháp với các tác động tối ưu. Nó cho rằng 80% vấn đề đến từ 20% nguyên nhân.

Do đó, một khi vấn để được xác định và phân loại theo tần suất và một phân tích dựa vào thống kê chi tiết sẽ chỉ ra 20% lượng nguyên nhân gây ra 80% vấn đề. Bằng cách đơn giản là tập trung và loại bỏ vào 20% nguyên nhân, kết quả sẽ được đảm bảo trong khi tối ưu số lượng công việc.

Phân tích xương cá

Hay cũng được gọi là phân tích Ishikawa, là một kỹ thuật phân tích nguyên nhân một cách trực quan. Không dùng đến kỹ thuật thống kê tham gia vào quá trình phân tích mà dựa vào phân tích (brainstorming) của cả nhóm. Lược đồ dưới đây mô tả chi tiết kỹ thuật này:

Vấn đề sẽ được viết ở ngoài cùng bên phải, và một đường thẳng nối từ đó ra, liệt kê từng nguyên nhân gây ra vấn đề.  Nhánh nào có nhiều nhánh con/nguyên nhân là vấn đề nghiêm trọng nhất và sẽ được tập trung để loại bỏ. Kỹ thuật này đôi khi còn được coi là kỹ thuật phân tích nguyên nhân và kết quả.

Thứ hạng TMM và kiểm soát lỗi bởi tổ chức kiểm thử

TTM (Testing Maturity Model -Mô hình phát triển kiểm thử) được phát triển từ CMM (Capability Maturity Model – mô hình phát triển khả năng)

Ngăn ngửa lỗi cần đến sự tham gia và đóng góp của nhiều thành viên ở từng giai đoạn khác nhau, đó cũng là lý do để nó là một yếu tố nổi bật trong đánh giá TMM thứ hạng 5; Nếu một lỗi xuất hiện thường xuyên trong bất kỳ một bài kiểm thử hay chức năng, tổ chức kiểm thử có thể lập môt nhóm thành viên để phân tích lỗi và phát triển một kế hoạch với các hành động để giải quyết vấn đề/lỗi đó.

Vài lợi ích của việc ngăn ngửa lỗi:
  • Thành viên trong nhóm sẽ có động lực và tỉnh táo để làm việc
  • Sự hài lòng của khách hàng
  • Tăng độ tin cậy, khả năng quản lý và tính dự báo
  • Tăng cường khả năng cải tiến quá trình

Trách nhiệm và vai trò nhóm trong ngăn ngừa lỗi

Có ba nhóm chính tham gia vào quá trình ngăn ngửa lỗi

Quản lý

  • Để đảm bảo cho sự thành công của viện ngăn ngừa lỗi không thể thiếu sự hỗ trợ mạnh mẽ từ ban quản lý
  • Sự hỗ trợ có thể la nhân sự, tài nguyên, đào tạo và công cụ dành cho việc tiến hành kế hoạch một cách thuận lợi
  • Có chính sách thích hợp và thay đổi văn hóa nếu cần thiết
  • Thúc đẩy các cuộc thảo luận, phân bổ các danh sách lỗi và những thay đổi trong quá trình làm việc

Kỷ sư kiểm thử

  • Bảo trì cơ sở sữ liệu về lỗi, đảm bảo tính chính xác của dữ liệu
  • Thông tin và dữ liệu về lỗi phải được cập nhật liên tục theo thời gian thực
  • Lên kế hoạch triển khai những thay đổi nếu có từ ban quản lý

Khách hàng

  • Vai trò của khách hàng khá nhỏ và hạn chế nhưng sự quan tâm đối với chất lượng của họ là rất quan trọng

Kết luận

Ngăn ngừa lỗi đóng một vai trò chủ yếu và quan trọng trong chu trình phát triển phần mềm. Nó giúp việc quản lý chất lượng của sản phẩm phần mềm với cách thức “sớm nhất và rẻ nhất” với các phương pháp và kỹ thuật được bàn ở trên.

Nó đảm bảo các vấn đề sẽ được giải quyết sớm mà không để xảy ra trên ứng dụng. Nó đánh giá việc tìm ra nguyên nhân chính là việc căn bản nhất trong quá trình xác định và giải quyết vấn đề.

Duy trì chất lượng của phần mềm là nhiệm vụ của nhóm quản lý và toàn bộ nhóm kiểm thử, bao gồm cả trưởng nhóm, khách hàng và từng thành viên trong nhóm.

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

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

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

Làm việc với table trong Selenium Webdriver

Làm việc với table trong Selenium Webdriver

Bài viết được sự cho phép của tác giả Tô Thị Vân Anh

Lại một tuần nữa trôi qua mà không đăng thêm bài viết mới nào mặc dù các ý tưởng thì nhiều, chỉ có lười ngồi viết thôi, mà cũng trăn trở làm sao mà câu từ nó phải thật chau chuốt hấp dẫn cho các bạn đọc. 😀 Mấy ngày liền quyết tâm đi sớm để tranh thủ gõ gõ tí mà lên đến nơi nhìn thấy quyển sách lại ngồi đọc chút đã, một chút mà nhoáng cái đã nghe thấy chuông bắt đầu giờ làm việc. Thế là lại bỏ dở cái ý định gõ gõ…

  Làm việc với table trong Selenium Webdriver
Hiểu khái niệm Immutable như thế nào cho đúng?”]

  JavaScript Executor trong Selenium Webdriver

Không lan man liên thiên nữa, như tiêu đề bài viết, hôm nay chúng ta sẽ cùng nhau đi tìm lời giải cho bài toán liên quan đến table trong HTML – nôm na là làm việc với bảng HTML với Selenium. Làm việc với bảng HTML quả thực không phải là hiếm, chúng ta có thể đọc dữ liệu, thông tin từ bảng hay thao tác trên bảng đó. Vậy với Selenium ta sẽ làm như thế nào? Hôm nay mình sẽ giúp các bạn (cũng là tự giúp mình) làm rõ vấn đề này =)) [[[Cứ như phóng viên điều tra của vtv đến nơi :v ]]]

Đề bài sẽ là đọc dữ liệu trong bảng HTML có kiểu như hình phía dưới:

Làm việc với table trong Selenium Webdriver

Thì dạng HTML của bảng nó sẽ kiểu như này:

Bang_2

Bây giờ để đọc giá trị của một ô bất kỳ trong bảng này thì ta chỉ có cách duy nhất đó là dựa vào x-path tuyệt đối của đối tượng muốn lấy. Ví dụ muốn lấy ra ô có country là Canada thì đường dẫn x-path thì sẽ là#customers > tbody > tr:nth-child(6) > td:nth-child(3) như này:

//*[@id=”customers”]/tbody/tr[6]/td[3]

Ngoài x-path ta có thể lấy theo CSS Selector tuyệt đối của đối tượng đó như thế này:

#customers tbody tr:nth-child(6) td:nth-child(3)

Bằng cách nào thì cũng phải sử dụng đến đường dẫn tuyệt đối của đối tượng muốn lấy. Ở ví dụ trên của mình ví dụ thì là trường hợp khá là đơn giản, chứ ở ứng dụng nào đó nó có nhiều bảng, nhiều vùng, trong bảng lại nhiều dòng thì đúng là đoạn x-path không bao giờ có chuyện đẹp như trên kia đâu.

Nhưng nếu chỉ có thế thì cũng là đơn giản thôi mà đúng không chỉ cần Chuột phải vào HTML của đối tượng muốn lấy, chọn Copy X-path, nếu muốn lấy CSS Selector thì chọn theo CSS Selector là xong:

Làm việc với table trong Selenium Webdriver

Chúng ta sẽ nghĩ đến trường hợp phức tạp hơn một chút, đó là chúng ta cũng vẫn muốn lấy ô có giá trị là Canada thế nhưng vị trí của ô có Canada này thì nó không cố định, tức là tại thời điểm này thì ô Canada nó ở dòng thứ 6 của bảng, thế nhưng ở thời điểm khác thì nó lại bị đẩy xuống dòng thứ 8, thứ 9 hay thứ 10… thì ta sẽ không thể sử dụng cách trên kia được. Đây chính là trường hợp dữ liệu trong bảng không cố định, vậy thì ta sẽ phải làm thế nào để lấy được chính xác ô Canada đây?

Ơ quá đơn giản luôn, đi tìm trong bảng, ô nào có giá trị là Canada thì lấy ra. :)))). Mình đã gặp một bài toán tương tự như thế này. Mình mô tả qua đại khái như sau, mình có một bảng dữ liệu là một danh sách các items bao gồm tên item, mô tả, người sửa, và ngày thêm, ngày sửa. Mình cần tìm ra item nào có ngày sửa là ngày hiện tại thì lấy ra tên của item đó. Bài toán này chính là mục đích của bài viết hôm nay của mình. 😀

Cũng giống như ví dụ trên lấy ra được ô Canada thì ta sẽ suy tìm ra được thông tin hai cột bên cạnh liên quan đến Canada đó là Company: Laughing Bacchus Winecellars và Contact: Yoshi Tannamuri. Trong bảng cũng có thể có thêm dữ liệu trùng, khi này ta sẽ có 1 danh sách thôi :)) Cơ bản là tùy theo mục đích để làm gì thì ta sẽ có được thông tin tương ứng nếu như nắm được những cách, ý tưởng làm việc với bảng.

Để cho đơn giản dễ hiểu thì chúng ta sẽ đổi đề bài một chút là bây giờ sẽ lấy ra giá trị của các ô của mỗi dòng trong bảng nhé.

Ví dụ bảng trong trang này: https://www.w3schools.com/html/html_tables.asp

Đầu tiên ta cần xác định vị trí của bảng, với ví dụ trên thì quá đơn giản rồi bảng có id:

Xpath: //*[@id=”customers”]/tbody

WebElement table = driver.findElement(By.xpath("//*[@id="customers"]/tbody"));

Sau đó là xác định xem bảng này có bao nhiêu dòng, vì số dòng có thể tăng lên sau mỗi lần thêm dữ liệu cho nó, nên ta sẽ tập trung vào đoạn này. Số dòng thì ta sẽ dựa vào số lượng cặp thẻ <tr> trong bảng table:

List < WebElement > rows_table = table.findElements(By.tagName("tr"));
int rows_count = rows_table.size();

Có được số dòng rồi thì bây giờ chỉ cần sử dụng vòng for cho số dòng đó, để lại lấy ra vị trí số cột của dòng đó, rồi lấy ra giá trị của ô tương ứng với dòng và cột đó. Bây giờ phải đếm được số cột trong dòng đã – đoạn này phải nằm trong vòng for của dòng rồi nhé:

for (int row = 0; row < rows_count; row++) {
    List < WebElement > Columns_row = rows_table.get(row).
                                        findElements(By.tagName("td"));
    int columns_count = Columns_row.size();

OKE, vậy là ổn rồi đó, có thông tin dòng, thông tin cột rồi thì việc lấy ra được giá trị của nó ở các ô thì đơn giản hơn rồi, tiếp theo trong vòng for của dòng thì sẽ cần phải dùng vòng for cho cột nhé, vì chúng ta có nhiều cột trong 1 dòng mà:

for (int column = 0; column < columns_count; column++) {
    String cell_text = Columns_row.get(column).getText(); 
    System.out.println(" Giá trị của dòng " + row + " Cột " + column + " là " + cell_text);

Ghép trọng vẹn đoạn sử dụng vòng for này thì sẽ là như này:

for (int row = 0; row < rows_count; row++) {
    List < WebElement > Columns_row = rows_table.get(row).
                                           findElements(By.tagName("td"));
    int columns_count = Columns_row.size();
    for (int column = 0; column < columns_count; column++) {
        String cell_text = Columns_row.get(column).getText(); 
         System.out.println(" Giá trị của dòng " + row + " Cột " + column + " là " + cell_text);
    }
}

Vậy là xong rồi. Cơ bản các bước chỉ có như vậy thôi, tùy theo yêu cầu bài toán cụ thể mà chúng ta có thể tùy biến để lấy dữ liệu hay có những xử lý phù hợp hơn. Định giải thích cách làm của mình đối với bài toán thực tế trên kia mình đã làm cơ nhưng mà thôi chắc là để bài sau! 😀

Bài này hơi dài mà không biết các bạn có nắm được ý tưởng của nó hay không =)) nhưng mà chắc là ok thôi. Có vấn đề gì các bạn có thể thoải mái chia sẻ bằng cách để lại phía dưới hoặc email cho mình nhé!

Các bạn có thể tham khảo thêm bài viết về cách xử lý bảng với selenium theo các đường dẫn phía dưới này nha:

https://www.guru99.com/handling-dynamic-selenium-webdriver.html

http://toolsqa.com/selenium-webdriver/handle-dynamic-webtables-in-selenium-webdriver/

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

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

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

Component trong React và cách quản lý chúng

Component trong React và cách quản lý chúng

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

Trong bài trước chúng ta đã biết cách để cài đặt một ứng dụng đầu tiên với Reactjs. Tiếp tục bài hôm nay, mình sẽ hướng dẫn về Component trong react và cách quản lý chúng.

  3 tools giúp bạn tăng hiệu năng của React App một cách bất ngờ
  5 dự án React buộc phải có trong porfolio của bạn

Component

Component là block xây dựng nên mọi ứng dụng React. Component có thể được sử dụng riêng hoặc kết hợp với các component khác để có một component lớn hơn.

Điều quan trọng là các component này là động: chúng cung cấp một template, sẽ được điền vào bằng dữ liệu biến. Mục đích chính của một component React là tạo ra một số JSX từ template này, sẽ biên dịch sang HTML và hiển thị trên DOM.

STATELESS EXAMPLE

Chúng ta tiếp tục sử dụng lại App.js, thêm vào 2 components đó là Header và Content, App sẽ chứa 2 component mới thêm vào.

class Header extends React.Component {
  render() {
     return (
        <div>
           <h1>Header</h1>
        </div>
     );
  }
}
class Content extends React.Component {
  render() {
     return (
        <div>
           <h2>Content</h2>
           <p>The content text!!!</p>
        </div>
     );
  }
} 
function App(){
  return (
    <div>
      <Header/>
      <Content/>
    </div>
  );
}

Kết quả sẽ được như sau:

Component trong React và cách quản lý chúng

Chúng ta sẽ thử với một ví dụ khó hơn, ở đây sẽ có một khái niệm là “state”, có thể các bạn chưa biết nhưng để đó đã mình sẽ học ở bài sau, bây giờ hiểu về component đã nhé.

State sẽ là 1 mảng object, chúng ta thay content trong Content Component bằng ListStudent Component.

import React from 'react';
import logo from './logo.svg';
import './App.css';
 
function App(){
  return (
    <div>
      <Header/>
      <Content/>
    </div>
  );
}
 
class Header extends React.Component {
  render() {
     return (
        <div>
           <h1>Header</h1>
        </div>
     );
  }
}
class Content extends React.Component {
  constructor() {
    super();
    this.state = {
       data: 
       [
          {
             "id":1,
             "name":"NGUYEN VAN A",
             "class":"JAVA"
          },
          {
             "id":2,
             "name":"NGUYEN VAN B",
             "class":"PHP"
          },
          {
             "id":3,
             "name":"NGUYEN VAN C",
             "class":"JAVA"
          }
       ]
    }
  }
  render() {
     return (
        <div>
            <table>
               <tbody>
                  {this.state.data.map((person, i) => <ListStudent key = {i} 
                     data = {person} />)}
               </tbody>
            </table>
        </div>
     );
  }
}
 
class ListStudent extends React.Component {
   render(){
     return(
      <tr>
        <td>{this.props.data.id}</td>
        <td>{this.props.data.name}</td>
        <td>{this.props.data.class}</td>
      </tr>
     );
   }
}
 
export default App;

Thêm tý css ở file App.css nhé:

table, th, td {
  border: 1px solid black;
}

Kết quả nhận được:

Component trong React và cách quản lý chúng

Lưu ý chút ít:

Hàm map giống như for-loop js, nếu viết bằng for thì sẽ như thế này:

for (let i = 0; i < this.state.data.length; i++) {
     <ListStudent key = {i}
                     data = {this.state.data[i]} />
}

key={i} giúp React update lại element 1 cách chính xác với key đó thay vì render lại toàn bộ list, khi ta thay đổi 1 thành phần nào đó trong state, việc này rất hiệu quả nếu chúng ta có viết các ứng dụng lớn nhiều elements sau này.

Hôm nay đến đây nhé, các bạn nhớ luyện tập và chờ đợi bài sau nha!

Author: Nguyễn Trung Kiên

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

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

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

Dân IT muốn được “săn đón” cần kỹ năng gì ?

kỹ năng cần có của dân lập trình

Bài viết được sự cho phép của tác giả Trần Thị Thu Hà

Dân IT muốn được các công ty lớn săn đón cần phải có những kỹ năng nhất định. Sau đây, chúng tôi sẽ chỉ ra 10 kỹ năng cần có ở một người IT.

  Giới thiệu 15 website học và luyện hack hợp pháp
  7 game miễn phí giúp bạn nâng cao kỹ năng lập trình

1. Phát triển thuật toán

Kỹ năng đầu tiên mà dân IT cần phải có đó chính là phát triển thuật toán. Với việc bộ lọc thư rác, các ứng dụng teamwork và phát hiện lừa đảo ngày càng trở nên phức tạp, tinh vi, các doanh nghiệp ngày càng cấn đến những nhân viên IT có thể thiết kế và phát triển thuật toán hoặc kỹ xảo để nâng cao hiệu suất cho máy tính.
Những kỹ năng như đào xới, tìm kiếm dữ liệu, lập mô hình số liệu thống kê… ngày càng được coi trọng. Bạn có thể học kỹ năng này thông qua kinh nghiệm làm việc thực tế hoặc ở trường lớp. Chỉ cần bạn nắm vững kỹ năng này trong tay, các doanh nghiệp sẽ “giật” bạn về nhanh như chưa bao giờ được nhanh vậy.

Lý do bạn nên phát triển thuật toán là bởi vì: “Ngày càng có nhiều ứng dụng với quy mô dữ liệu khổng lồ. Cách thức tổ chức, sắp xếp và trình bày dữ liệu có một vai trò cực kỳ quan trọng“.

2. Mạng không dây

Các công nghệ mạng không dây như Wi-Fi, WiMax và Bluetooth ngày càng trở nên phổ biến. Hệ quả là doanh nghiệp nào cũng muốn lôi về một “bậc thầy” không dây, chính là nhân viên IT – người am hiểu sâu sắc từng công nghệ một, những nguy cơ bảo mật tiềm ẩn, cách phối hợp các công nghệ với nhau sao cho tối ưu nhất…

Tất nhiên, chưa có ai được tuyển về chỉ vì anh ta là một kỹ thuật viên không dây. Tuy nhiên, trước hết anh ta phải là một nhà quản trị mạng tốt, trước khi có kiến thức chuyên sâu về mạng không dây mà thôi.

3. Giao diện người dùng

Một lĩnh vực khác cũng đang thu hút nhu cầu rất cao là thiết kế giao diện người dùng. “Nhà kỹ sư phần mềm không thể ném vào mặt người dùng một đống những thứ lem nhem, lổn nhổn được“, ông Ebner nói.

Nhờ vào những hãng như Apple, người dùng ngày càng được tiếp cận với những sản phẩm được thiết kế rất hợp lý và thân thiện. Vì thế, doanh nghiệp có quyền đòi hỏi tất cả những phần mềm mà họ sử dụng đều phải có một giao diện rõ ràng và dễ dùng.

4. Di động hóa các ứng dụng

Cuộc đua cung cấp nội dung cho thiết bị di động đang bước vào hồi nước sôi lửa bỏng, thậm chí “hoang dại và điên cuồng” giống như cơn sốt Internet hồi những năm 90 vậy, ông Sean Ebner, Phó chủ tịch hãng Tuyển dụng Spherion Pacific cho biết.

Thêm vào đó, những thiết bị như BlackBerry, Treo đã trở thành công cụ làm việc quan trọng, không thiểu thiếu của nhiều người. Hơn bao giờ hết, các doanh nghiệp cần có một nhân viên kỹ thuật với kiến thức chuyên sâu về di động hóa. “Họ cần có người đưa các ứng dụng lên trên thiết bị di động“, Ebner dự đoán.

5. Quản lý dự án

Trong các chiến dịch săn đầu người của doanh nghiệp, trưởng nhóm dự án bao giờ cũng là vị trí được lùng sục nhiều nhất. “Nhà tuyển dụng muốn có một người thật sư am hiểu về vòng đời của dự án, thật sự điều hành và vận hành được dự án, có thể dẫn dắt tất cả những thành viên còn lại“, ông Grant Gorden, Giám đốc quản lý của Overland Park nhận định.

Một năm trước, ứng cử vào vị trí Trưởng nhóm dự án rất dễ. Nhưng giờ đây, những cuộc phỏng vấn trở nên xương xẩu hơn rất nhiều. Các ứng viên thích hợp ngày càng ít, nhưng một khi đã đủ tiêu chuẩn, họ có thể thoải mái lựa chọn mức lương và chế độ làm việc của mình.

6. Lập trình nguồn mở

Số lượng doanh nghiệp có hứng thú với các tài năng nguồn mở ngày một nhiều, cả trên phương diện hệ điều hành lẫn ứng dụng. Những người có kinh nghiệm lập trình với Linux, Apache, MySQL và PHP sẽ thấy mình được các hãng săn đón đến thế nào.

7. Bảo mật nhúng

Ngày nay, dễ dàng nhận thấy bất cứ vị trí tuyển dụng nào, trong phần mô tả công việc, cũng nhắc đến hai từ bảo mật.

Doanh nghiệp muốn tìm một người có khả năng thiết lập nên những môi trường đảm bảo an ninh, dù cho đó là máy chủ email hay phát triển phần mềm. Bảo mật đã trở thành một phần không thể tách rời của công việc.

Rõ ràng là tư duy của doanh nghiệp đã thay đổi. Bảo mật không còn là chuyện của riêng một ai đó, mà nó đã được tích hợp vào hoạt động thường ngày của hãng. Tất nhiên, sẽ vẫn cần có chuyên gia riêng về bảo mật, nhưng một nhân viên IT bây giờ cũng phải nắm được các quy chuẩn tối thiểu về bảo mật thông tin.

8. Kỹ năng chung về mạng

Dù là bạn làm việc trong lĩnh vực nào của IT đi chăng nữa, bạn cũng không thể thoát khỏi mạng. Các kỹ sư phần mềm cũng phải có khái niệm cơ bản về mạng thì mới viết được những phần mềm tương thích tốt với Internet hay mạng nội bộ, Ethernet, sợi quang và TCP/IP.

Họ cần hiểu rõ ứng dụng của mình sẽ hoạt động trong môi trường mạng như thế nào. Họ cần tận dụng được ưu thế của mạng trong thiết kế của mình“.

9. Mạng hội tụ

Cùng với việc VoIP ngày càng được nhiều doanh nghiệp ứng dụng, nhà quản trị mạng cần nắm được tất cả các loại mạng khác nhau như LAN, WAN, điện thoại, Internet… cũng như cách chúng hội tụ với nhau.

Khi xảy ra sự cố, không ông sếp nào lại muốn nhà quản trị mạng đổ lỗi cho đường dây điện thoại, trong khi nhân viên điện thoại lại hất hàm “Đi mà hỏi ông mạng ấy“. Nói tóm lại, doanh nghiệp cần có một người làm trong lĩnh vực điện thoại nhưng am hiểu về mạng IT hoặc ngược lại, quản trị mạng nhưng am hiểu về mạng điện thoại.

10. Tích hợp công nghệ ngôi nhà số

“Mái ấm” của mỗi người đang dần biến thành thiên đường của công nghệ cao. Thị trường nghe – nhìn gia đình được dự đoán sẽ tăng trưởng chóng mặt trong thời gian tới, cùng với bảo mật gia đình và hệ thống chiếu sáng tự động hóa. Vấn đề là ai sẽ lắp đặt những hệ thống này đây, và ai sẽ sửa chúng khi có trục trặc xảy ra.

Đây sẽ là lĩnh vực tuyển dụng cực nóng trong những tháng tới“, ông Grant Gorden cho biết.

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

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

Xem thêm Jobs IT for Developer hấp dẫn trên TopDev

The Winner Takes It All

mẹo sống

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

Nguồn: https://chienluocsong.com/5-nguyen-tac-song-don-gian-p3-the-winner-takes-it-all/

Đây là một trong những bài viết khá hay của một anh bên chienluocsong.com. Mình đã học được khá nhiều điều về kinh nghiệm sống từ blog của anh. Xin trích dẫn một số ý chính.

Những thế hệ 7x, 8x hẳn không thể không biết bài hát này, đó là bài hát của ban nhạc ABBA. Tôi đã mở hết các lá bài nhưng vẫn là người thua cuộc, cô ý đã thắng và cô ý đã có tất cả, người thua cuộc thì nhỏ bé bên người chiến thắng. Lời bài hát như văng vẳng bên tai ta, thật phù hợp với những ai đang thất tình.

  10 mẹo nhỏ cho bạn để coding hiệu quả hơn!
  13 mẹo có thể giúp bạn rút ngắn thời gian phát triển kỹ năng lập trình

Trong entry này tôi sẽ nêu lên hai ý quan trọng:

  • Người thắng là người có tất cả
  • Cho dù thế nào thì kết quả mới là thứ quan trọng.

Chắc hẳn bạn là nghe câu “Thắng làm vua, Thua làm giặc”. Thắng vừa có tiếng mà lại vừa có miếng. Và cái gì quyết định ranh giới giữa thắng và thua? Trong chiến tranh đôi khi đó chỉ là một cá nhân đơn lẻ, có thể là một sự kiện nhỏ nào đó. Nếu không phải là Tướng Giáp thì cuộc chiến tranh Việt Nam có thể dài hơn hoặc cũng có thể là ngắn hơn, thậm chí có thể ảnh hưởng tới cả sự tồn tại của bạn. Các cuộc chiến tranh thế giới hay vụ thanh tra ở Bộ Thương Mại đều bắt nguồn những từ một sự kiện nhỏ (tất nhiên đôi khi nó chỉ là cái cớ).

Cá nhân ta cũng vậy, quyết định giữa thắng và thua của chúng ta cũng chỉ từ một yếu tố nhất định nào đó. Yếu tố đó có thể là quan trọng với công việc này nhưng không quan trọng với công việc khác, có thể quan trọng với tổ chức này nhưng lại không quan trọng với tổ chức khác. Nhiệm vụ của ta là căng mắt ra mà phát hiện và tận dụng những cơ hội cho dù đó là nhỏ nhất.

Một nguyên lý mà tôi đã nhắc tới trong các entry về Hoàn thiện bản thân đó là người ta chỉ nhớ tới người về nhất. Trong thể thao bắn súng, tôi và bạn chỉ biết tới Hoàng Xuân Vinh, cũng chỉ biết tới video Hoàng Xuân Vinh bắn phát cuối cùng. Bạn có nhớ tới ai đó cùng đoàn với Hoàng Xuân Vinh không? hoặc bạn có nhớ tới một đoạn bắn súng nào khác không?

Bạn có nhớ ai lên mặt trăng cùng Amstrong? Những phụ tá cùng Bill Gates thành lập lên đế chế Microsoft? Trong toàn bộ sự thành đạt của Steve Jobs, bạn có nhớ tới một cái tên nào khác không? Trong cả quãng đời của bạn đã trải qua, có phải bạn nhớ toàn bộ các sự kiện hay chỉ nhớ tới một số sự kiện nhất định nào đó? Con người của bạn được kể bởi những sự kiện rời rạc mà không mang tính liên tục vì bạn chẳng thể nhớ hết được.

Người ta chỉ nhớ tới người thứ nhất, người thứ hai về sau không ai còn nhớ nữa. Ta chỉ nhớ các sự kiện ấn tượng, các sự kiện lặp đi lặp lại hàng ngày ta không nhớ được, không thể nhớ được là buổi sáng cách đây 1 tuần mình ăn gì vì sáng nào chẳng ăn.

Và người thứ nhất cũng là hưởng lợi nhất.

Sếp sẽ giao cơ hội cho những người mà anh ta cho rằng là giỏi nhất nhằm tăng cơ hội thành công của một dự án. Khách hàng sẽ giao cho người bán hàng, công ty giỏi nhất để lợi nhất.

Tóm lại không cần biết khoảng cách giữa thằng nhất và thằng nhì bao nhiêu, thắng nhất là thằng có tất cả.

  • Nếu là một nhân viên bình thường hãy cố gắng là thằng giỏi nhất trong nhóm.
  • Nếu đã là người giỏi nhất trong nhóm hãy là người giỏi nhất trong phòng.
  • Nếu đã là người giỏi nhất trong phòng thì hãy là người giỏi nhất trong công ty.
  • Nếu đã là người giỏi nhất trong công ty hãy là người giỏi nhất trong nghề nghiệp đó.

VÒNG TRÒN CỦA THẰNG NHẤT

Thằng nhất thường được cung cấp các nguồn lực tốt nhất. Họ được cung cấp những người chơi cùng tốt nhất (giống như đội bóng), họ được cung cấp phương tiện tốt nhất, họ không bị giao những việc lặt vặt (vì lặt vặt hãy để người yếu hơn), họ được cung cấp cơ hội tốt nhất.

Ví dụ:

  • Một người sửa điều hòa giỏi sẽ ngày càng nhiều khách hàng hơn.
  • Một người giải quyết vấn đề giỏi trong một ngành nghề sẽ ngày càng được cất nhắc cao hơn (nơi anh ta sẽ tạo ra nhiều giá trị hơn)

… nguồn: Nguồn: https://chienluocsong.com/5-nguyen-tac-song-don-gian-p3-the-winner-takes-it-all/

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 Việc làm Developer hấp dẫn trên TopDev

Factory Method trong thực tiễn

Factory Method trong thực tiễn

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

Giả sử như bạn cần mua một chiếc máy tính, nhưng bạn vẫn chưa quyết định được nên sử dụng máy tính của hãng nào. Ngoài kia bao la bạt ngàn những thương hiệu chất lượng cao như Apple, Lenovo, Asus, HP… Như vậy để có thể chọn được chiếc máy tính ưng ý, bạn sẽ có 2 cách sau:

  Giới thiệu Abstract Factory Pattern
  Hướng dẫn sử dụng Factory trong Design Pattern

– Đến showroom của từng hãng, rồi tham khảo từng máy. Bạn đi hết showroom của hãng này tới showroom của hãng khác để xem, rồi nhớ thông tin trong đầu để so sánh chiếc này hợp hơn, chiếc kia rẻ hơn …

– Bạn đến một cửa hàng bày bán tất cả các loại laptop của tất cả các hãng, rồi bạn hỏi tư vấn là với số tiền này, bạn có thể chọn được laptop loại nào. Hay bạn đang muốn xem thử máy của hãng A, bạn nhờ tư vấn viên mang ra giúp bạn một chiếc. Rồi bạn băn khoăn một chiếc của hãng B, bạn lại nhờ tư vấn viên mang ra một chiếc khác.

Rõ ràng là cách thứ hai tiết kiệm thời gian và công sức cho bạn rất nhiều. Đây chính là cách mà mẫu thiết kế Factory hoạt động.

Mẫu thiết kế factory là gì?

Factory pattern là một mẫu thiết kế thuộc nhóm Khởi tạo. Pattern này sử dụng một interface hay một abstract class mà tất cả các lớp chúng ta cần khởi tạo đối tượng sẽ kế thừa. Factory sẽ định nghĩa việc khởi tạo đối tượng, nhưng đối tượng nào sẽ được tạo thì phụ thuộc vào các lớp con. Do vậy, pattern này còn được gọi với cái tên Virtual Constructor (phương thức khởi tạo ảo).

Factory pattern mang lại những tác dụng:

– Tạo ra một cách khởi tạo object mới

– Che giấu quá trình xử lý logic của phương thức khởi tạo

– Giảm sự phụ thuộc, dễ dàng mở rộng trong trường hợp chưa biết chắc số lượng đối tượng là đã đủ hay chưa. Trong trường hợp chúng ta có thêm lớp con kế thừa Factory, việc gọi đến virtual constructor vẫn không hề thay đổi.

– Giảm khả năng gây lỗi compile, trong trường hợp chúng ta cần tạo một đối tượng mà quên khai báo lớp, chúng ta cũng có thể xử lý lỗi trong Factory và khai báo lớp cho chúng sau.

Cấu trúc của Factory pattern

Xét theo ví dụ ở đầu bài viết, Factory pattern sẽ có cấu trúc dạng như sau:

Các lớp con Lenovo, Asus, HP đều override lại phương thức getSpec từ interface Computer. Phương thức viewComputer() của client sẽ  gọi tới phương thức viewComputer của lớp ComputerFactory và truyền vào đó một tham số computerBrand, chính là tên của máy tính mà client muốn xem thêm, để tạo một đối tượng tương ứng. Đối tượng này sẽ được sử dụng để chạy phương thức view mà lớp con đã override lại.

Factory pattern trong Java

Trong ví dụ trên, nếu chúng ta làm theo cách 1, mã nguồn sẽ có dạng như sau:

```
public class Client {
	public void viewComputer() {
		public void ViewLenovo() {
			Lenovo lenovoComputer = new Lenovo();
			System.out.println(lenovoComputer.getSpec());
		}

		public void ViewAsus() {
			Asus asusComputer = new Asus();
			System.out.println(asusComputer.getSpec());
		}

		public void ViewHP() {
			HP hpComputer = new HP();
			System.out.println(hpComputer.getSpec());
		}
	}
}

```

Như vậy, client sẽ phải gọi đến từng constructor cụ thể của từng lớp để tạo được đối tượng mong muốn.

Vậy khi áp dụng Factory pattern, mã nguồn sẽ thế nào?

Bước 1: Xây dựng lớp factory:

```
public class ComputerFactory {
	public void viewComputer(String computerBrand) {
		Computer computer;
		switch (computerBrand) {
			case "Lenovo":
				computer = new Lenovo();
				break;
			case "Asus":
				computer = new Asus();
				break;
			case "HP":
				computer = new HP();
				break;
			default:
				System.out.println("Computer brand not found");
				break;
		}
		if (computer != null) {
			System.out.println(computer.getSpec());
		}
	}
}
```

Bước 2: Từ lớp client, chúng ta gửi chỉ thị đến Factory:

```
public class Client {
	public void viewComputer() {
		ComputerFactory computerFactory = new ComputerFactory();
		computerFactory.viewComputer("Lenovo");
		computerFactory.viewComputer("HP");
		computerFactory.viewComputer("Asus");
		computerFactory.viewComputer("Dell");
	}
}
```

Như vậy, việc khởi tạo các đối tượng thuộc từng lớp kế thừa interface Computer đã bị ẩn đi đối với client. Mặt khác, khi chúng ta thêm mới lớp kế thừa Computer, chỉ có virtual constructor trong Factory cần cập nhật, thay vì phải thay đổi trên cả lớp Client.

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

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

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