Home Blog Page 140

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1980S – OBJECT ORIENTED PROGRAMMING

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

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

ĐỐI TƯỢNG

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

LỚP

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

ĐÓNG GÓI DỮ LIỆU

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

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

KẾ THỪA

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

ĐA HÌNH

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

1990S – SUBJECT & ASPECT ORIENTED PROGRAMMING

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

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

SAU OOP

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

KẾT LUẬN

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

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

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

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

Programming Language evolution

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

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

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

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

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

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

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

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

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

Method trong Python

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

Cấu trúc method trong Python:

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

Ví dụ:

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

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

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

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

Kết quả:

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

Function trong python

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

Cấu trúc function:

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

Ví dụ:

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

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

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

Kết quả:

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

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

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

Okay, Done!

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

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

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

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

Nguyên tắc KISS trong Java

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

Nguyên tắc KISS trong Java.

KISS là gì?

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

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

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

Ví dụ 1:

mình có 1 method:

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

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

Ví dụ 2:

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

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


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

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

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

Ví dụ 3:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Nguyên nhân

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

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

Nativefier

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

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

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

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

sudo npm i nativefier -g
Bash

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

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

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

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

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

./Messenger.com
Bash

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

Mở rộng

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

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

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

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

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

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

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

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

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

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

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

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

Kết luận

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

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

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

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

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

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

CV IT Manager
CV IT Manager

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Lời kết

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

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

MMA IMPACT
MMA IMPACT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

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

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

I.Kiểu dữ liệu

Swift cung cấp cho chúng ta đầy đủ các kiểu dữ liệu cơ sở giống như C và Obiective-C. Ví dụ: Int, Double, Float, Bool, String, …).

Các kiểu dữ liệu mới trong Swift:

Chúng ta có thể demo và học các câu lệnh cơ bản  trong Xcode nó sẽ chạy và show kết quả từng câu lệnh cho chúng ta.

  Hằng và biến trong Swift
  Các cách sử dụng AS, AS?, AS! một cách hiệu quả và an toàn trong code Swift

Apple có cung cấp cho chúng ta công cụ tuyệt vời để test code-Swift: playgroundChúng ta sẽ sử dụng tool playground để học swift3.

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Bạn click vào “Get started with a playground ”

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Các bạn click next và chọn nơi lưu project

Và đây là giao diện giúp chúng ta code.

Kiểu dữ liệu, biến, hằng trong ngôn ngữ Swift

Array
Các phần tử trong 1 array phải chung kiểu dữ liệu. Có thể khai báo array bằng những cách sau:

Khai báo mảng rỗng

  • let emptyArr = [Int]() // mảng Int rỗnglet emptyArr : Array<Int> = [] // mảng int rỗng

Thêm mới 1 phần tử:

  • arr.append(6) // thêm vào cuối mảng arr.insert(0, atIndex: 0) // thêm mới theo index

Dictionary

Dictionary dùng để chứa các biến có cùng kiểu dữ liệu. Khác với array là dictionary gọi biến theo key – value chứ không phải theo index.

Khai báo dictionary theo 2 cách như sau:

  • var dict : Dictionary<String,String> = [“HN” : “HaNoi” , “HCM” :“HoChiMinh”];var dict2 : [String : String] = [“HN” : “HaNoi”];

II.Biến và hằng

1.Biến

Trong ngôn ngữ Swift, các biến được khai báo bằng từ khóa “var”

Khai báo biến dùng từ khóa var theo sau là tên biến được khởi tạo giá trị. Kiểu dữ liệu của biến khai báo theo cách này phụ thuộc vào giá trị nó khởi tạo. Bạn có thể khai báo nhiều biến trên một dòng, mỗi biến cách nhau bởi dấu “,”.

var Tên biến: kiểu dữ liệu = Giá trị

Ví dụ:

  • var str: String = “Học swift”

//Khai báo biến, khởi tạo giá trị cho nó là //số nguyênvar bien1 = 123 //Khai 2 biến trên một dòng bien2 và biến3 var bien2 = “XYZ”, biến3 = bien1 + 10

2.Hằng

Khai báo hằng số

– Hằng số để sử dụng lưu giá trị nào đó mà không cần thay đổi,không giống với biến chúng ta có thể thay đổi được giá trị nhưng khi chúng ta đã khai báo 1 hằng số thì không thể thay đổi giá trị cho hằng số đó.

– Để khai báo 1 hằng số trong swift chúng ta sử dụng từ khóa “let”,cũng giống với biến thì hằng số cũng có nhiều cách khai báo hằng đó là có thể gắn luôn kiểu dữ liệu hoặc không gắn kiểu dữ liệu và gắn giá trị mặc định hoặc không.

Khi chúng ta không gắn kiểu giá trị cho hằng số mà gắn giá trị mặc định thì lúc đó Swift sẽ tự động gắn kiểu cho hằng đó như kiểu của giá trị.

Để khai báo hằng số thì dùng từ khóa let theo sau là tên hằng và giá trị hằng số.

Ví dụ:

  • let SỐ_PI = 3.14

3.Quy tắc đặt tên biến và hằng

Tên biến và hằng bạn có thể gõ tên bất kỳ (kể cả dùng ký tự Unicode, gõ tiếng việt …), miễn là đảm bảo những nguyên tắc sau sẽ được chấp nhận:

  • Không được có khoảng trắng, ký hiệu toán học (+ / …), mũi tên (← → ↑ ↓ …), các tên và ký hiệu dùng bởi ngôn ngữ Swift trong tên biến
  • Tên biến có thể chứa ký tự số nhưng không được phép dùng số để bắt đầu tên biến. bien123 thì được, 123bien thì không được

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

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

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

Open Source Story: Agar.IO Clone

Open Source Story: Agar.IO Clone

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

Những gì sắp kể ra ở đây là về hành trình của mình đến với thế giới open source, đây là một dự án làm cho vui nhưng rốt cuộc lại đóng vai trò khá quan trọng đối với con đường làm kĩ thuật của mình, nhất là khi nó cũng mở ra khá nhiều cơ hội lúc mình đặt chân đến Mỹ (khi có dịp mình sẽ nói về cái này sau). Từ đó đến giờ cũng khá lâu rồi, nên mình không thể nhớ hoàn toàn mọi chi tiết cũng như rất nhiều tư liệu trong quá trình viết game này đã bị mất, hôm nay quyết định viết ra chứ để lâu nữa có khi lại quên sạch luôn.

  Các resources mới dành cho web dev
  OpenCV là gì? Học Computer Vision không khó!

Vào khoảng nửa đầu năm 2015, thì trò chơi Agar.IO bắt đầu trở nên nổi tiếng và tình trạng chơi Agar trong giờ làm việc dần trở nên phổ biến, team mình lúc đó cũng không ngoại lệ 

Thú thực thì công ty outsource, ở thời điểm mới thành lập, dự án cũng không có nhiều và gắt nên anh em cũng khá rảnh rỗi. Rảnh đến mức mình cài luôn Diablo III vào máy để chơi cơ mà.

Nhưng chơi game cả ngày thì cũng chán, thế là mình chuyển qua làm game ở trên công ty luôn (thời điểm đó mình vẫn còn hoạt động trong mảng game dev, đối với mình, làm game là đam mê, còn chuyện đi làm outsource cũng chỉ là vì cơm áo gạo tiền, quyết không bán mình đi làm game vì tiền, một phần khác thì vì cty outsource này trả lương cũng khá là cao).

Làm game gì bây giờ nhỉ? Lúc đó mình đang chơi 2 game là Diablo và Agar, làm Diablo thì đương nhiên là không làm nổi rồi, trình đếu đâu, thôi thì làm game Agar vậy.

Bản prototype đầu tiên

Tính từ lúc start đến lúc hoàn thành bản prototype chơi được đầu tiên là khoảng 1 buổi sáng, chắc tầm 3 tiếng, bản prototype khá đơn giản, hoàn toàn không có chế độ chơi online, nhưng các thành phần cơ bản của gameplay thì đều có đầy đủ:

  • Cơ chế dịch chuyển/điều khiển, collision detection (nói cho sang, chứ chỉ là kiểm tra một điểm có nằm trong một đường tròn không thôi), food spawning, cơ chế ăn food, cơ chế growth khi ăn.
  • Game được render trên một thẻ <canvas>, xóa toàn bộ màn hình sau mỗi lần di chuyển 
  • Toàn bộ diện tích game là diện tích của màn hình hiện tại, chưa có scrolling và viewport

Thực ra ban đầu mình không có ý định làm bản online, mà dự định sẽ viết thêm bot và chơi offline. Nhưng mấy anh bạn trong team sau khi thấy mình làm ra được thế thì muốn mình share ra để chơi chung, nên đành phải viết thêm chức năng online.

Bản prototype tiếp theo: Multiplayer

Việc add thêm chức năng multiplayer cho một bản prototype game đang chạy offline cũng có nhiều cái thú vị cần nói tới, vì ngay từ bước này mình mắc phải nhiều sai lầm nghiêm trọng nhưng bản thân mình lúc đó chưa hề hay biết.

Về cơ bản thì logic của game vẫn được xử lý hoàn toàn trên phía client (!!!), server gần như chỉ làm nhiệm vụ nhận và broadcast các sự kiện được truyền lên từ các client.

Ví dụ có 2 player cùng kết nối vào game, khi player A di chuyển đến một vị trí (x, y) thì nó sẽ gửi một tín hiệu đến server, bảo là “Ê, tao chạy đến (x, y) nè”, server sẽ nhận tín hiệu đó và thông báo cho tất cả những player khác rằng “Chúng mài ơi, thằng A nó chạy đến (x, y) nhá”.

Hoặc khi player B ăn được một miếng food, thì nó sẽ thông báo lên server là “Này, tao vừa ăn được một cục, kích thước của tao giờ +1 rồi nhé”, với bản chất là một cái loa phóng thanh, server cũng sẽ hét lên rằng “Bớ làng nước ơi thằng B nó tăng thêm một đơn vị rồi kìa”.

Open Source Story: Agar.IO Clone

Nếu quan tâm, các bạn có thể đọc thêm về toàn bộ những cách liên lạc từ các client lên server trong phiên bản đầu tiên này tại đây Game Architecture – huytd/agar.io-clone.

Sau khi có bản multiplayer, mình liền share cho mấy anh em trong team chạy thử, kết quả có vẻ như khá thành công, mình quyết định sẽ chia sẻ mã nguồn lên GitHub, kèm theo đó là viết một bản document thiệt hoành tráng mô tả cách xây dựng game của mình.

Lên sóng

Đây là commit đầu tiên khi game được publish lên GitHub: edf3fec.

Tiếp sau đó, mình share cái repo này lên Hacker News và nhận được khá nhiều sự chú ý của cộng đồng, đứng ở vị trí top 1 được hơn 1 ngày, kết quả là lượng star cho project tăng lên vùn vụt, đó cũng là lần đầu tiên mình tạo được nhiều sự chú ý đến vậy trên phạm vi ngoài nước.

Từ đó kéo theo rất nhiều chuyện vui, như là, một anh thầy giáo đến từ Brazil đã sử dụng source game của mình và deploy lên mạng nội bộ của trường cho học trò chơi, từ đó ảnh có thể ngắt hoàn toàn internet trong lớp, không cho lũ trẻ duyệt web trong giờ học nữa, cơ mà đám trẻ rất thích. Và rất nhiều người cũng gửi mail đề nghị mình làm freelance cho họ một bản game hoàn chỉnh để cạnh tranh với Agar.io, hoặc clone thành một trò có phong cách giống vậy, tất nhiên nhận ra tính chất chụp giựt của các con buôn, và tinh thần làm vì đam mê chứ không bán rẻ công sức, nên mình đã từ chối, giờ nghĩ lại thấy hơi tiếc tiền.

Bên cạnh đó cũng có rất nhiều bài học quý giá mà mình nhận được trong quá trình cộng tác với những người bạn không quen biết từ khắp nơi trên thế giới.

Đập đi làm lại

Gần như ngay lập tức sau khi mình publish source lên mạng, rất nhiều người đã thấy ngay sai lầm về mặt design trong kiến trúc client-server mà mình sử dụng, vì nó hoàn toàn quá dễ để hack.

Vì game logic được kiểm soát bằng cách để cho client gửi messages lên server, và server phân phát lại cho toàn game, một client hoàn toàn có thể hack tọa độ hoặc hack tăng kích thước lên cực bự, hoặc nếu thích thì có thể giết toàn bộ các player khác chỉ bằng việc gửi lên server vài messages đã được thay đổi.

Vì thế nên mình đã phải viết lại toàn bộ sau khi publish source lên GitHub (xem commit 547134c)

Việc kiểm soát logic của game (dịch chuyển, cập nhật tọa độ các player, collision detect, xử lý việc ăn và bị ăn của các player,…) phải được thực hiện hoàn toàn ở phía server, và client chỉ làm một nhiệm vụ duy nhất là render ra theo những gì server bảo.

Nếu mà nói về Networking Programming cho game thì nó rất là rộng, rộng đến mức có thể tách nó thành một phạm trù riêng và không liên quan gì đến chuyện làm game luôn, chính vì thế nên mình lười, không học  cho nên đến lúc trước khi đụng phải vấn đề này, mình cũng chỉ biết mang máng là cách làm của mình nó sai lè ra đấy, nhưng không hình dung được phải làm sao cho nó đúng. Rất may, nhờ việc khoe cái ngu của mình lên mạng, nên mình đã chữa được cái ngu đấy của bản thân.

Một lần khác, project lại nhận thêm một issue nữa để bàn về vấn đề tại sao không sử dụng một cấu trúc dữ liệu khác tốt hơn thay cho việc dùng mảng để quản lý player.

Nói về vấn đề này, có thể hiểu nôm na rằng, ban đầu, tất cả các player được lưu vô một mảng ở trên server, và khi có sự tương tác xảy ra giữa các user, server sẽ phải kiểm tra bằng cách duyệt hết toàn bộ mảng đó:

// khởi tạo mảng chứa các player
const players = [];

// khi có player join vào game thì đưa vô mảng
server.on('playerJoined', (player) => players.push(player));

// kiểm tra va chạm giữa các players khác và player A
for (let player of players) {
	if (hitTest(playerA, player)) {
		// ... do something ...
	}
}

Tất nhiên làm như vậy thì rất ngu, vì server phải tốn công xử lý cho cả những user mà trên thực tế đang ở cách nhau rất xa (đầu screen và cuối screen chẳng hạn).

Open Source Story: Agar.IO Clone

Sau khi thảo luận, mọi người thống nhất sẽ dùng Quadtree để quản lý các player theo tọa độ tương ứng, từ đó giúp cho việc tìm ra player nào đụng nhau hiệu quả hơn. Thú thực thì đây cũng là một thứ mình chưa bao giờ đụng đến, và chỉ được biết về nó sau cuộc thảo luận này, ngay cả việc implement cũng do một anh bạn tốt tính nào đó thực hiện giúp luôn .

Open Source Story: Agar.IO Clone

Trên đây chỉ là ví dụ cho hàng tá thứ mà mình học được từ cộng đồng sau khi public mã nguồn của game lên GitHub.

Miniclip, DCMA và hưởng lợi

Phải nói thêm là, project của mình không phải là project duy nhất liên quan đến game Agar.IO ở thời điểm này, nhưng phần lớn các dự án khác trên GitHub lúc bấy giờ, bên cạnh các dự án written from scratch giống như mình làm, còn có các dự án kiểu rip off lại game cũ bằng cách dịch ngược client, deploy lại lên một server khác để gắn ads vào, hoặc viết lại client nhưng reverse engineering lại protocol để kết nối vào server chính,…

Sau khi game Agar.IO (bản gốc) được Miniclip mua lại, gần như ngay lập tức, họ gửi request đến GitHub để gỡ xuống hàng loạt các dự án liên quan đến Agar.IO hoặc có xài tên gọi Agar.IO

Lúc đó thì mình nghĩ, “thôi thế là xong phim con mẹ nó rồi”, vì project của mình kiểu gì cũng sẽ nằm trong danh sách bị gỡ bỏ. Nhưng bất ngờ thay, sau một tuần thì mọi thứ vẫn an toàn.

Đồng thời, nhờ việc các “đối thủ cạnh tranh” bị tiêu diệt hết, và “đối thủ chính” đã bị hốt về tay Miniclip, hàng loạt những thủ đoạn kiếm tiền trắng trợn được đưa vào Agar.IO khiến cho cộng đồng bất mãn, và họ bắt đầu đi tìm một giải pháp vừa open source vừa có thể self-hosted được, tất nhiên ứng cử viên sáng giá không ai khác ngoài kẻ còn sót lại sau cơn bão dữ, là dự án của mình  nên số lượng star cho dự án lại càng tăng lên từng ngày, từng ngày một.

Bên cạnh vai trò làm kẻ thay thế đại diện cho chính nghĩa trước thủ đoạn “xảo trá con buôn” của nhà phát hành game bản gốc, project của mình còn đóng vai trò là một nguồn tư liệu tham khảo cho nhiều developer khác khi họ có ý định bắt tay vào làm một game giống như Agar.IO – hẳn là bạn đang thắc mắc học hỏi được cái gì? mình cũng thắc mắc y thế khi thấy các repo khác mentioned tên mình và tên project của mình, chắc họ nhìn vào mình như là một case điển hình của code thối và kiến trúc tồi .

Về sau thì mình mới biết lý do project của mình còn sót lại là vì “người ta” không coi mình là đối thủ  https://news.ycombinator.com/item?id=9976643. Thêm một bài học nữa, ở hiền thì gặp lành, chỉ cần mình đừng làm hại đến người ta, thì dù có tiền, người ta cũng sẽ để yên cho mình.

Vấn đề kiểm soát dự án

Tất nhiên không phải bài học miễn phí nào cũng dễ chịu, bên cạnh những người bạn vô danh sẵng lòng đem kiến thức của họ ra mở mang tầm mắt cho mình một cách nhiệt tình và nhã nhặn, có không ít những cá nhân thoải mái mạt sát, chửi đổng khi gặp những điều họ không vừa ý về project, hoặc lên các diễn đàn, website khác để nói xấu, cũng có vô số người tạo issue xong lặn đâu mất, 2, 3 năm sau mới vô comment lại 

Tuy khó chịu thật, đôi lúc đọc issue xong chán chả buồn comment, nhưng nghĩ lại thì qua mỗi một trường hợp như thế, mình đều học được thêm về cách deal với từng loại người khác nhau trên internet, và quan trọng hơn nữa, đây là công sức và cống hiến của mình cho cộng đồng, ở đâu đó, dự án của mình đã ít nhiều tạo được một chút impact tốt đẹp (ví dụ như trường hợp anh thầy giáo Brazil ở trên), mình lấy đó làm động lực để tiếp tục fix bug 

Nếu mà nói về một bài học đắt giá nhất, thì có lẽ đó là bài học về cách để kiểm soát dự án một cách hiệu quả.

Hồi đầu khi project vừa được ra mắt, mình rất là ba phải, ai tạo issue gì hay suggest cái gì mình cũng đều accept, gần như là merge hết không chừa một cái PR nào (thằng bé lần đầu được nhiều người tặng star và contribue cho dự án, nên gặp ai cho cái gì cũng hốt).

Và hậu quả thì chỉ sau vài tháng, toàn bộ codebase đã trở nên hoàn toàn lạ lẫm đối với mình   , đến mức chính bản thân mình còn không hiểu được code nữa, còn thời gian dành cho việc fix bug do user report còn nhiều hơn cả thời gian làm việc ở công ty. Mặc dù đến lúc đó đã có thêm 2 bạn contributor khác cũng join vào để maintain dự án. Danh sách issue thì ngày một dài lên.

Nếu ở thời điểm đó mình biết cách nói không với các feature request, hay giữ thái độ cứng rắn hơn khi nhận được các pull request, biết cách sắp xếp và quản lý được roadmap cho dự án hiệu quả hơn thì có lẽ mình sẽ không bị quá tải và dẫn đến việc chán nản mà bỏ luôn dự án.

Tại sao lại bỏ?

Vì sao mình không làm tiếp dự án này?

Mặc dù những ai biết mình thì đều biết rằng mình nổi tiếng với việc làm giữa chừng là bỏ, nhưng nói thật là trong dự án này mình có lý do hẳn hoi đấy nhé.

Đầu tiên, phải nói đến đó là vision và motivation khi bắt đầu dự án. Mình hoàn toàn không có một định hướng gì rõ ràng cho dự án này, và mình bắt đầu làm nó chỉ vì rảnh quá không biết dùng thời gian để làm gì.

Và mình chỉ trở nên nghiêm túc với nó sau khi nhận được một vài sự chú ý nhất định.

Cho nên khi số lượng issue và feature request tăng lên, các vấn đề khó hơn xuất hiện càng nhiều, không còn quá quen thuộc với chính dự án do mình khởi xướng lên từ đầu, nên thời gian để fix bug cũng tăng lên, mức độ interest của mình đối với dự án càng lúc càng đi xuống.

Một lý do khác nữa, là mình không thực sự cảm thấy tự hào về dự án này, nhiều star để làm gì?  trong khi bản thân dự án có kiến trúc cực kì non nớt, performance cực kì kém và các kĩ thuật sử dụng trong dự án cũng cực kì lởm. Điểm sáng duy nhất có lẽ là project rất đơn giản và đi kèm với nó là tài liệu mô tả khá chi tiết.

Những vấn đề còn bỏ ngỏ

Vẫn còn rất nhiều những vấn đề quan trọng mà mình chưa có cơ hội / và không còn hứng thú để giải quyết trong dự án này, roadmap còn rất nhiều những task chưa được tick, nhưng có lẽ một trong những vấn đề lớn nhất đó là performance khi có nhiều người cùng chơi – có rất nhiều lý do đằng sau chuyện này, phần lớn là từ phía xử lý logic game trên server, từ việc sử dụng JSON để xử lý tín hiệu trong game,…

Có lẽ một lúc nào đó mình sẽ viết lại hoàn toàn game này, hoặc cũng có thể là mình sẽ sửa sai bằng một project hoàn toàn mới không biết chừng (rồi cũng sẽ bị drop thôi ).


Dù sao thì đây cũng là một project thú vị, và hành trình đưa nó đến với cộng đồng cũng đã đem lại cho mình rất nhiều kinh nghiệm và bài học quý giá. Và tất nhiên đây không phải là trải nghiệm duy nhất của mình, còn rất nhiều những dự án khác nữa mà mình sẽ kể trong các bài viết tới, mong các bạn đón đọc.

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

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

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

Các khái niệm căn bản trong kiến trúc phần mềm

Kiến trúc phần mềm

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

Trong bài viết này, hãy cùng điểm qua các khái niệm căn bản trong kiến trúc phần mềm để có thể hiểu rõ hơn trong các bài viết về sau.

  19 tips cho các kỹ sư phần mềm hữu ích trong 2024
  3 workhack để duy trì năng lượng tích cực tại công sở cho kĩ sư phần mềm

NO SILVER BULLETS!

Điều đầu tiên, cho dù bạn nghĩ thế nào đi nữa thì chắc chắn sẽ không có chuyện 1 bước lên mây, bạn không thể hi vọng có thể áp dụng 1 kiến trúc cho tất cả các vấn đề gặp phải dù cho kiến trúc đó có good cỡ nào, một đôi giày triệu $ chắc gì đã làm bạn thấy thoải mái và vừa vặn. Hãy học hỏi thật nhiều các cách tiếp cận khác nhau, ưu nhược của từng cái, vấn đề mà nó giải quyết. Hãy chắc chắn là bạn hiểu rõ dự án của bạn cần gì, hiểu rõ kiến thức nghiệp vụ và yêu cầu của khách hàng, từ đó sẽ đi đến việc quyết định lựa chọn / tùy chỉnh mô hình nào phù hợp nhất.

Rõ ràng là không dễ để những người trẻ tuổi, có ít hoặc không có kinh nghiệm trong việc chọn lựa mô hình kiến trúc nào phù hợp với yêu cầu của dự án. Bằng cách tham khảo các dự án đi trước, tham vấn ý kiến, kinh nghiệm từ những người dày dặn cộng với kiến thức đã học được về kiến trúc phần mềm sẽ giúp bạn đỡ bối rối hơn khi giải quyết các vấn đề ở mức vĩ mô hơn.

Trong kỹ nghệ phần mềm có hàng trăm các thuật ngữ nhập nhằng, mơ hồ được đưa ra khiến cho việc sử dụng và hiểu biết của chúng ta bị nhầm lẫn thậm chí hiểu sai. Cùng làm rõ 1 số thuật ngữ chuyên dùng nhất ở phía dưới đây (tôi dùng nguyên bản tiếng Anh cho tiện refer về sau):

FUNCTIONAL

Là những đơn vị code (dòng code, method, class hoặc nhóm các class) đề cập đến khía cạnh kỹ thuật của ứng dụng. Functional không liên quan đến nghiệp vụ. Ví dụ một số functional thường gặp: Layers Factories Repositories Value Objects Views ViewModels ConceptualLà những đơn vị code phản ánh các khái niệm nghiệp vụ của ứng dụng, ví dụ như: User Product Checkout Post Comment Review Một điểm lưu ý là một đơn vị code có thể đảm nhận luôn 2 chức năng là Functional và Conceptual. Ví dụ như class “Money” vừa có thể thể hiện như 1 domain concept hoặc có thể coi như là 1 Value Object. (không có ID, có thể immutable,…)

PACKAGE

Tập các class được group lại với nhau theo 1 số rule.

MODULE

Theo định nghĩa từ cuốn Software Architecture in Practice thì một module là 1 functional package, nó phản án 1 technical capability (tính năng kỹ thuật) trong ứng dụng. Các module có tính độc lập (decoupled) và một module có thể được thay thế bởi một module khác mà ứng dụng vẫn có thể hoạt động. Ví dụ ta có 1 “Security Module” hoặc “ORM”, hoặc cao hơn nữa, ta có thể xem Client và Server là 2 module của ứng dụng. Module tạo ra tính gắn kết về mặt chức năng kỹ thuật (Functional cohesion) nghĩa là tập các đơn vị code làm chung một Functional sẽ được đóng gói vào một module.

COMPONENT

Ngược lại với Module, theo định nghĩa từ cuốn Software Architecture in Practice thì một Component là một conceptual package, nó phản ánh một business capability (tính năng về nghiệp vụ). Và tất nhiên nó cũng có tính độc lập với các component và module khác. Ví dụ ta có User component, Product component, Checkout component.Một chú ý rất quan trọng đó là component phản ánh 1 bounded context, nó cung cấp tính gắn kết về mặt chức năng nghiệp vụ.Lưu ý: bounded context là thuật ngữ dùng trong Domain Driven Design, đề cập đến việc phân rã nghiệp vụ thành các nghiệp vụ đơn lẻ, nhỏ hơn mà vẫn đảm bảo ý nghĩa của nó trong toàn bộ hệ thống, khi đó bounded context được xem như là cái bao trùm và diễn tả cho nghiệp vụ đó.

APPLICATION

Tác giả xem application là UI – user-facing code, cái được build phía trên cùng và sử dụng các nền tảng nghiệp vụ phía dưới (components). Lấy ví dụ về Web shop, chúng ta có 1 tập các component về nghiệp vụ của 1 web shop. Chúng ta cũng có 2 là trang bán hàng (storefront) cung cấp các UI đến khác hàng và trang admin dùng để quản lý nội bộ. Trang bán hàng và admin có thể coi đó như 2 application sử dụng các nền tảng nghiệp vụ phía dưới.

SYSTEM

System là một tập các applications làm việc, tương tác cùng với nhau nhằm phục vụ các nhu cầu của một doanh nghiệp, tổ chức, hay còn được gọi với cái tên mỹ miều hơn: Enterprise Application. Các application trong 1 system có thể hoặc không xây dựng dựa trên cùng một nền tảng nghiệp vụ. Cũng ví dụ về web shop, trang bán hàng và trang admin phụ thuộc vào các nghiệp vụ bán hàng, tuy nhiên bên cạnh đó còn có các application bên thứ 3 khác liên kết trong hệ thống của mình đó là dịch vụ thanh toán, hoặc dịch vụ vận chuyển.

Động não: REST API có phải là 1 application? Các dịch vụ thanh toán, vận chuyển trong ví dụ trên nếu không có UI thì có thể được gọi là application hay không? Liệu bạn có muốn thay đổi định nghĩa về 1 application hay không?

Tham khảo thêm về Services vs. Applications

ARCHITECTURE

Theo wikipedia thì kiến trúc phần mềm của một chương trình máy tính hay một hệ thống tính toán là cấu trúc của các thành phần trong hệ thống đó. Kiến trúc phần mềm bao gồm các phần tử phần mềm, các thuộc tính và mối quan hệ giữa chúng. Ngoài ra, thuật ngữ “kiến trúc phần mềm” cũng đề cập đến các tài liệu kiến trúc phần mềm của một hệ thống, thuận tiện cho việc trao đổi thông tin giữa các thành viên trong một dự án. Kiến trúc phần mềm giúp việc quyết định ở mức cao trong thiết kế phần mềm dễ dàng hơn và cho phép tái sử dụng các thành phần và mẫu thiết kế của các dự án.

Ngoài ra còn có rất nhiều định nghĩa về Software Architecture, tuy nhiên tôi lại thích cách diễn đạt về Architecture bằng cách nói về két quả đầu ra của Architecture

Khi nói về Architecture, điều đó có nghĩa là:

  • Tất cả các quyết định kỹ thuật xuyên suốt tất cả các vấn đề phát triển phần mềm. Ví dụ như: frameworks, coding standards, documentation, process, …;
  • Những quyết định về mặt kỹ thuật rất khó thay đổi về sau trong dự án Big picture (cái view tổng thể) của cả system.
  • Những bản vẽ tổng quan ban đầu về hình hài của system, cấu trúc và mối liên hệ giữa các components
  • Nó chuẩn bị cho dự án sao cho có thể trì hoãn các quyết định (về framework, view, db, …) càng lâu càng tốt.
  • Nó chuẩn bị cho dự án để tái sử dụng các thành phần và mô-đun
  • Nó thiết lập các chuẩn trong việc nhất quán về mặt kết quả và Nó không phải là trách nhiệm của chỉ một người, mà là của một nhóm các nhà phát triển giàu kinh nghiệm thuộc các nhóm đặc trưng khác nhau trong dự án.

ARCHITECT

Về cơ bản, kiến trúc sư phần mềm chịu trách nhiệm cho thiết kế hệ thống phần mềm và đảm bảo rằng nó đáp ứng các yêu cầu của doanh nghiệp cũng như yêu cầu hệ thống của kết cấu nền của công ti. Kĩ năng đặc biệt này yêu cầu nhiều năm kinh nghiệm phát triển phần mềm trong các nền, ngôn ngữ và công nghệ nào đó. Trước khi thiết kế hệ thống, kiến trúc sư phần mềm phải làm việc chặt chẽ với kĩ sư yêu cầu hay người phân tích doanh nghiệp để hiểu các yêu cầu của khách hàng rồi hỗ trợ cho người quản lí dự án phát triển kế hoạch dự án nơi việc chia các yêu cầu thành những nhiệm vụ nhỏ hơn là mấu chốt.

SMELLS OF A BAD ARCHITECTURE (AND BAD CODE)

RIGIDITY (CỨNG NHẮC)

Phần mềm được gọi là cứng nhắc khi nó rất khó thay đổi vì thay đổi này sẽ dẫn đến những thay đổi khác mà không thấy điểm dừng.

FRAGILITY (DỄ VỠ)

Một phần mềm dễ vỡ là khi chỉ một thay đổi nhỏ cũng có thể dẫn đến những behavior không mong muốn và không thể dự đoán.

Immobility (không có tính di động)Một thiết kế không có tính di động (tái sử dụng) là khi nó không thể tách ra hoặc tốn quá nhiều effort để tái sử dụng cho nhiều thành phần khác nhau.

VISCOSITY (LÕNG LẼO)

Trong một hệ thống lõng lẽo là hệ thống dễ dàng để làm sai hơn là làm đúng. Nghĩa là khi ta muốn thực hiện một thay đổi, thay vì làm theo quy định trong thiết kế, ta lại đi “đường tắt” để làm việc đó. Điều đáng nói ở đây không phải là việc ta được đi đường tắt, mà bản thân thiết kế đã không có những ràng buộc chắc chắn để không ai có thể vi phạm và phá vỡ cấu trúc của hệ thống.

Đọc thêm về Technical Debt và Legacy System

NEEDLESS REPETITION (TRÙNG LẮP)

Điều này xảy ra khi các khái niệm trừu tượng (abstraction) cần thiết không được thực hiện, hoặc là do thiếu thời gian hoặc thiếu kinh nghiệm. Mã có thể đã không được dán sao chép nhưng các quy tắc kinh doanh tương tự được định nghĩa ở nhiều nơi.

OPACITY (KHÔNG RÕ RÀNG)

Mã đã được viết bằng một cách mờ đục và khó hiểu, và chúng ta cần phải nhảy vào từng method để hiểu những gì đang làm.

NEEDLESS COMPLEXITY (PHỨC TẠP KHÔNG CẦN THIẾT)

Việc tạo ra các khái niệm trừu tượng là rất cần thiết để có thể dễ dàng thay đổi và mở rộng trong tương lai, tuy nhiên trong 1 số nỗ lực để tránh các smell ở trên thì các nhà thiết kế có thể sẽ rơi vào bẫy phức tạp hóa vấn đề. Thiết kế phần mềm tốt nhẹ, linh hoạt, dễ đọc và dễ hiểu và trên hết là dễ thay đổi, tuy nhiên bạn không phải cố gắng dự đoán tất cả những thay đổi có thể xảy ra trong tương lai.

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

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

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

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

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

NoSQL là gì? Điểm mạnh vượt trội của NoSQL

NoSQL là gì? Điểm mạnh vượt trội của NoSQL

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

Thời gian gần đây NoSQL nổi lên như là một loại hình cơ sở dữ liệu mới. Hỗ trợ đầy đủ, hiệu năng không thua kém cấu trúc SQL truyền thống. Tuy nhiên, điểm mạnh NoSQL thực sự nằm ở đâu, điều gì làm NoSQL trở thành lựa chọn tuyệt vời trong một số trường hợp?

Bài viết dưới đây cung cấp cho anh em cái nhìn tổng quan NoSQL là gì, trường hợp nào nên sử dụng, khi nào không, tất tần tật sẽ được giải đáp.

NoSQL là gì?
Hiểu điểm mạnh NoSQL để đỡ phải lăn tăn sau này

NoSQL là gì?

NoSQL (Not only SQL) là một loại cơ sở dữ liệu không quan hệ (non-relational database), được xây dựng dành riêng cho mô hình dữ liệu có sơ đồ linh hoạt để xây dựng các ứng dụng hiện đại (như document-oriented, key-value, column-family, graph,…).

Cơ sở dữ liệu NoSQL được công nhận rộng rãi vì tính dễ phát triển, có khả năng mở rộng theo chiều ngang (horizontal scaling) để xử lý lượng dữ liệu lớn, mở rộng chức năng cũng như hiệu năng ở quy mô lớn.

Cần lưu ý rằng NoSQL tỏ ra vượt trội hơn về khả năng dễ phát triển và tính linh hoạt.

8 tính năng chính của NoSQL

  • Sơ đồ động (Dynamic schema): Cơ sở dữ liệu NoSQL không có sơ đồ cố định và có thể điều chỉnh các cấu trúc dữ liệu đang thay đổi mà không cần di chuyển hoặc thay đổi sơ đồ.
  • Khả năng mở rộng ngang (Horizontal scalability): Cơ sở dữ liệu NoSQL được thiết kế để mở rộng ra bằng cách thêm nhiều nút vào một cụm cơ sở dữ liệu, làm cho chúng phù hợp để xử lý lượng lớn dữ liệu và mức độ lưu lượng truy cập cao.
  • Dựa trên tài liệu (Document-based): Một số cơ sở dữ liệu NoSQL, chẳng hạn như MongoDB, sử dụng một mô hình dữ liệu dựa trên tài liệu, trong đó dữ liệu được lưu trữ ở định dạng bán cấu trúc không có sơ đồ, chẳng hạn như JSON hoặc BSON.
  • Dựa trên khóa-giá trị (Key-value-based): Một số cơ sở dữ liệu NoSQL khác, chẳng hạn như Redis, sử dụng một mô hình dữ liệu dựa trên khóa-giá trị, trong đó dữ liệu được lưu trữ dưới dạng một bộ sưu tập các cặp khóa-giá trị.
  • Dựa trên cột (Column-based): Một số cơ sở dữ liệu NoSQL, chẳng hạn như Cassandra, sử dụng một mô hình dữ liệu dựa trên cột, trong đó dữ liệu được tổ chức thành các cột thay vì các hàng.
  • Phân tán và khả năng sẵn sàng cao (Distributed and high availability): Cơ sở dữ liệu NoSQL thường được thiết kế để có sẵn cao và tự động xử lý lỗi nút và sao chép dữ liệu trên nhiều nút trong một cụm cơ sở dữ liệu.
  • Tính linh hoạt (Flexibility): Cơ sở dữ liệu NoSQL cho phép các nhà phát triển lưu trữ và truy xuất dữ liệu một cách linh hoạt và động, với hỗ trợ cho nhiều loại dữ liệu và các cấu trúc dữ liệu đang thay đổi.
  • Hiệu suất (Performance): Cơ sở dữ liệu NoSQL được tối ưu hóa cho hiệu suất cao và có thể xử lý một khối lượng lớn các thao tác đọc và ghi, làm cho chúng phù hợp cho dữ liệu lớn và các ứng dụng thời gian thực.

Ưu điểm nổi bật của NoSQL

Các ưu điểm vượt trội của NoSQL so với cơ sở dữ liệu quan hệ (SQL) bao gồm:

Tính co giãn (Scalability)

NoSQL có khả năng mở rộng theo chiều ngang (horizontal scaling) một cách dễ dàng bằng cách thêm máy chủ, cho phép xử lý lượng dữ liệu lớn. Điều này rất hữu ích trong các ứng dụng có lưu lượng dữ liệu lớn và không đồng nhất.

Hiệu suất (Performance)

NoSQL thường có hiệu suất cao hơn so với SQL khi xử lý dữ liệu lớn và phi cấu trúc. Các cơ sở dữ liệu NoSQL thường sử dụng các cấu trúc dữ liệu tối ưu hóa cho các truy vấn cụ thể.

Linh hoạt (Flexibility)

Các mô hình dữ liệu của NoSQL (document-oriented, key-value, etc.) cho phép lưu trữ dữ liệu phi cấu trúc một cách dễ dàng. Không cần phải định nghĩa sơ đồ dữ liệu trước khi lưu trữ dữ liệu, cho phép dễ dàng thay đổi và phát triển.

Khả năng sẵn sàng (Availability)

Nhiều cơ sở dữ liệu NoSQL được thiết kế để có tính sẵn sàng cao, cho phép duy trì hoạt động ngay cả khi có sự cố. Điều này được đạt được thông qua việc phân phối dữ liệu trên nhiều máy chủ.

Tính đa dạng (Diversity)

NoSQL cung cấp nhiều mô hình dữ liệu khác nhau như document-oriented, key-value, column-family, graph, etc. Điều này cho phép chọn mô hình phù hợp nhất với từng ứng dụng cụ thể.

Chi phí thấp (Cost-effectiveness)

Cơ sở dữ liệu NoSQL thường tiết kiệm chi phí hơn so với cơ sở dữ liệu quan hệ truyền thống vì chúng thường ít phức tạp hơn và không yêu cầu phần cứng hoặc phần mềm đắt tiền.

Nhược điểm của NoSQL

  • Thiếu chuẩn hóa: Có nhiều loại cơ sở dữ liệu NoSQL khác nhau, mỗi loại đều có điểm mạnh và điểm yếu riêng. Điều này có thể làm cho việc lựa chọn cơ sở dữ liệu phù hợp cho một ứng dụng cụ thể trở nên khó khăn.
  • Các cơ sở dữ liệu NoSQL không đảm bảo hoàn toàn tính ACID (Atomicity, Consistency, Isolation, Durability). Điều này có thể là hạn chế đối với các ứng dụng yêu cầu đảm bảo tính nhất quán và toàn vẹn của dữ liệu.
  • Quản lý dữ liệu lớn trong NoSQL phức tạp hơn so với cơ sở dữ liệu quan hệ.
  • Một số NoSQL lưu trữ dữ liệu dưới dạng JSON, khiến kích thước tài liệu trở nên lớn.

>> Đọc thêm: TOP 15 Hệ quản trị cơ sở dữ liệu nên dùng nhất hiện nay

Một số loại mô hình CSDL NoSQL

Key-Value (K-V) Stores

Key-value là loại cấu trúc thường được sử dụng nhất trong các Hệ CSDL NoSQL.

mô hình CSDL NoSQL - Key-Value (K-V) Stores

This model is also the fastest way to get data by known key, but without the flexibility of more advanced querying.

Model này là cách nhanh chóng để lấy dữ liệu bằng cách cung cấp key. Tránh được việc phải viết thêm nhiều query để collect data

Hình dưới đây là Key-value được lưu trữ trong collection ở Firebase. Với một key (được Firebase định danh duy nhất), ta có thể lấy ra tất cả field được store với key này.

Điểm mạnh NoSQL chính là ở chỗ này, một key có thể lấy ra nhiều value, số lượng item trong value cũng flexible, có thể tùy biến được.

It may be used for data sharing between application instances like distributed cache or to store user session data.

Ngoài, sử dụng Key-value còn hữu ích nếu muốn chia sẻ giữa các application trong hệ thống distributed cache hoặc lưu giữa user session data.

Document Stores

Ngoại trừ Key-value sử dụng phổ biến, NoSQL cũng hỗ trợ Document Stores

mô hình CSDL NoSQL - Document Stores

Document store is a data model for storing semi-structured document object data and metadata. The JSON format is normally used to represent such objects.

Document store là loại lưu trữ bán cấu trúc, gồm các đối tượng dữ liệu và siêu dữ liệu. Thông thường kiểu JSON được sử dụng để lưu trữ kiểu này

Thay vì tạo các column lưu trữ VARCHAR, CHAR rồi store JSON. Một số platform hỗ trợ lưu trữ các object JSON, dễ dàng để store và collect hơn. Đây là điểm mạnh NoSQL có được, vượt lên so với các hệ cơ sở dữ liệu SQL truyền thống.

Column-Oriented Stores

Lưu trữ hướng về cột (Column Oriented Stores) gần giống như relations ship giữa các primary key bên phía SQL.

mô hình CSDL NoSQL - Column-Oriented Stores

It is similar to a relational database index, however a column family may be an arbitrary collection of columns.

Gần giống như quan hệ giữa database index, tuy nhiên một họ cột có thể là một tập hợp các cột tùy ý.

Ngoài ra:

This particular approach is used for very large scalable databases to greatly reduce time for searching data. It is rarely used outside of enterprise level applications.

Cách tiếp cận cụ thể này được sử dụng cho các cơ sở dữ liệu có khả năng mở rộng. Giúp giảm đáng kể thời gian tìm kiếm dữ liệu. Loại này thường được sử dụng cho các application ở cấp doanh nghiệp.

Graph stores

Mô hình dữ liệu Graph Database được lưu trữ dưới dạng các nút (nodes), các mối quan hệ (edges) và các thuộc tính (properties). Các nút có thể là bất kỳ đối tượng, địa điểm hoặc cá nhân nào.

mô hình CSDL NoSQL - Graph stores

Các mối quan hệ (edges) định nghĩa các mối liên kết giữa các nút.

Graph Databases rất thích hợp cho việc lưu trữ và quản lý mạng lưới các mối kết nối giữa các thực thể trong dữ liệu như mạng xã hội, hệ thống khuyến nghị, phát hiện gian lận, quản lý quan hệ khách hàng, v.v.

Ví dụ về Graph Database: Neo4j là một ví dụ về Graph Database, được xây dựng trên nền tảng Java với cộng đồng mã nguồn mở. Neo4j cung cấp cả phiên bản miễn phí (community edition) và các bản có license để sử dụng các tính năng nâng cao như sao lưu và tính sẵn sàng cao.

NoSQL vs SQL

SQL hay NoSQL sẽ phù hợp hơn cho dự án của bạn? Cùng điểm qua một vài so sánh cơ bản về hai loại database này trong bảng dưới đây:

Tiêu chí NoSQL SQL
Mô hình dữ liệu Dữ liệu được lưu trữ dưới dạng tài liệu, bảng, đồ thị, column-family, hoặc cấu trúc dữ liệu khác. Dữ liệu được lưu trữ dưới dạng các bảng với hàng và cột.
Cấu trúc dữ liệu Linh hoạt, không cần theo một cấu trúc cứng nhắc. Cấu trúc cứng nhắc, đòi hỏi định nghĩa bảng và các ràng buộc trước khi lưu trữ dữ liệu.
Quan hệ dữ liệu Không có quan hệ chuẩn như trong SQL, thường sử dụng denormalization. Quan hệ giữa các bảng được định nghĩa rõ ràng bằng các khóa chính và khóa ngoại.
Tính mở rộng Mở rộng theo chiều ngang (scale-out) bằng cách thêm nút vào hệ thống. Mở rộng theo chiều dọc (scale-up) bằng cách nâng cấp phần cứng.
Sử dụng Phù hợp với dữ liệu có cấu trúc không chuẩn và yêu cầu tính mở rộng cao. Phù hợp với dữ liệu có cấu trúc chuẩn và yêu cầu tính nhất quán cao.
Ví dụ MongoDB, Cassandra, Redis, Couchbase. MySQL, PostgreSQL, Oracle, SQL Server.

Nên sử dụng NoSQL trong trường hợp nào?

Khi cấu trúc dữ liệu chưa hoàn chỉnh

Thực tế, thời gian cho vòng đời một phần mềm (Software) đang ngày càng rút ngắn. Không thể cứng nhắc là phải có Database Structure rõ ràng mới bắt đầu phát triển phần mềm. Tùy vào đặc thù của từng dự án để linh động trong giải quyết vấn đề.

Hiện tại, nếu table A được định nghĩa 4 column (4 field). Nhưng trong quá trình phát triển, nếu ta cần thêm 2 field nữa, sự khác biệt sẽ nhận thấy rõ ngay giữa SQL NoSQL

  • Nếu sử dụng SQL (Structure), có cấu trúc. Tất nhiên sẽ phải ALTER table đó, hoặc là tầm nhìn xa hơn sẽ dùng column store Json. Thay đổi Json Store. Việc này tuy có thể đáp ứng nhưng khá phức tạp.
  • Nếu sử dụng NoSQL, do không quá ràng buộc về mặt cấu trúc, ta vẫn có thể thoải mái store node đó với 4 field, trong khi những node trước đó là 2 field.

NoSQL là lựa chọn lý tưởng cho dữ liệu không được tổ chức thành cấu trúc hoặc có cấu trúc chưa hoàn chỉnh

Rõ ràng, khi ứng dụng chưa thực sự rõ ràng về cấu trúc dữ liệu (có thể do requirement từ khác hàng, các feature hoặc bug chưa tìm thấy). NoSQL là lựa chọn tốt hơn so với SQL truyền thống

Rõ ràng mà nói điểm mạnh NoSQL là tốt cho các ứng dụng có cấu trúc CSDL chưa hoàn chỉnh, đang hoặc sẽ được điều chỉnh trong quá trình sử dụng.

Xử lí Dữ liệu lớn (Big Data)

Với khả năng xử lý lượng dữ liệu khổng lồ, NoSQL là lựa chọn lý tưởng cho các hệ thống cần phân tích dữ liệu quy mô lớn, như các ứng dụng phân tích dữ liệu, Internet of Things (IoT), và các nền tảng truyền thông xã hội.

Các cơ sở dữ liệu như MongoDB, Cassandra, Couchbase rất phù hợp với các ứng dụng Big Data.

Cần khả năng mở rộng liên tục

Khi dữ liệu thay đổi liên tục và không có cấu trúc rõ ràng, NoSQL có thể phù hợp hơn.

Khi dữ liệu liên tục tăng lên và cần mở rộng cơ sở dữ liệu thường xuyên, NoSQL có thể cung cấp khả năng mở rộng tốt hơn.

Không cần quan hệ giữa dữ liệu

Nếu mối quan hệ giữa các dữ liệu không quan trọng, không yêu cầu các ràng buộc và kết nối phức tạp cấp độ database bạn có thể chọn NoSQL, ngược lại nên chọn RDBMS.

Tóm lại, NoSQL hay SQL đều có những ưu và nhược điểm riêng, với những phân tích trên, hi vọng bạn đã hiểu NoSQL database là gì và khi nào cần sử dụng cơ sở dữ liệu SQL. Theo dõi TopDev để cập nhật thêm nhiều kiến thức công nghệ!

Nguồn tham khảo: kieblog.com

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

Làm thế nào tôi trở thành một Software Developer tại Twitter?

cv it tiếng anh
Làm thế nào tôi trở thành một Software Developer tại Twitter?

Dịch từ bài viết của tác giả: Zhia Chong

Cách tôi bắt đầu cuộc hành trình của mình

Tôi sống và làm việc hàng ngày trong một căn hộ thuê ở tầng hầm với mức giá 600 đô/tháng. Mong muốn tìm cho bản thân một công việc tốt ở những môi trường chuyên nghiệp luôn hiện hữu trong tôi. Và Twitter là một trong những nơi tôi hướng đến với suy nghĩ như thế. Tôi cũng hiểu rõ là để bắt đầu cuộc hành trình chinh phục giấc mơ này, trước tiên mình cần chăm chút hơn cho CV IT tiếng Anh của mình.

Năng lực chuyên môn

Về background của mình, tôi tốt nghiệp với tấm bằng cử nhân về khoa học máy tính và nộp đơn xin việc vào 30 công ty khác nhau, được phỏng vấn với 15 công ty, bị từ chối bởi 6 trong số đó. Tôi hiểu rằng để nhận được offer của các công ty tốt, một chiếc CV English IT là rất cần thiết. Vậy nên tôi dành nhiều thời gian để đầu tư hơn cho CV của mình. Cuối cùng tôi nhận việc tại một công ty startup và có 3 năm làm việc với tư cách một Full stack Engineer. Công việc chính của tôi là build microservices cũng như phát triển API trên AWS stack. Đây là công việc đầu tiên của tôi, trước đây tôi chưa hề có kinh nghiệm làm việc hay thực tập ở bất kì vị trí nào khác cả.

cv english it
Thể hiện năng lực trong CV là cách chinh phục nhà tuyển dụng

Làm sao tôi đến được Twitter với CV IT tiếng Anh của mình?

Trước đây tôi đã từng ứng tuyển vào Twitter nhưng không thành công. Một phần là vì tôi chưa có nhiều kinh nghiệm xin việc (như đã chia sẻ ở trên) nên cũng không biết cách để CV IT tiếng Anh của mình được đánh giá cao hơn. Vì thế ở lần thứ hai này, tôi may mắn nhận email từ phòng tuyển dụng của họ với đề nghị sắp xếp một cuộc phỏng vấn qua điện thoại với các kỹ sư của họ. Họ cũng gửi cho tôi một sheet tổng hợp toàn diện những kiến thức liên quan đến việc luyện tập và nâng cao kỹ năng coding cũng như xây dựng thuật toán.

  Software Developer và 5 bài học kinh nghiệm quan trọng
  9 trang web mà bất kỳ developer nào cũng nên theo dõi

Trong tài liệu có đề cập đến việc sử dụng Leetcode cho việc luyện tập. Tôi dành hàng giờ mỗi ngày để luyện coding và chuẩn bị tốt nhất cho vòng phỏng vấn sắp tới. Những cuộc phỏng vấn liên quan đến chuyên môn thật sự không hề dễ dàng, nhất với một người đã tốt nghiệp được một khoảng thời gian như tôi. Tôi phải dành nhiều thời gian để trau dồi thêm kỹ năng và nguyên tắc cần thiết khác để ứng tuyển thành công.

Twitter đã nhấn mạnh cuộc phỏng vấn này sẽ tập trung vào những kiến thức chuyên môn liên quan tới map, cây nhị phân, danh sách liên kết, đồ thị,… Vậy nên thậm chí tôi còn tham gia khóa huấn luyện cá nhân Acing The Technical Interview để chuẩn bị tốt nhất.

Xem thêm các tin đăng việc làm software developer trên TopDev

Cách tôi nộp CV IT tiếng Anh và chuẩn bị cho một cuộc phỏng vấn

Tôi tìm được công việc này thông qua LinkedIn. Đây là một trong những nền tảng giúp bạn dễ dàng tìm được nhiều công việc hấp dẫn vì nó được các nhà tuyển dụng sử dụng rất nhiều. Tôi đăng tải CV IT tiếng Anh của mình trên tài khoản cá nhân để các nhà tuyển dụng dễ quan sát và tìm kiếm. Và kể từ khi nhận được thông báo phỏng vấn, tôi có 1 tháng làm việc và học tập liên tục để chuẩn bị cho cuộc phỏng vấn này.

Đầu tiên, tôi được giao cho các tài liệu liên quan đến coding trên Google Tài liệu. Chúng tôi bàn về cách phân tích và tiếp cận các dữ liệu này, tôi có 30 phút để phân tích với nhà tuyển dụng. Những kinh nghiệm và chuyên môn được đề cập trong CV IT tiếng Anh là một phần để nhà tuyển dụng tham khảo và đặt ra câu hỏi phỏng vấn ứng viên. Sau hai vòng đầu tiên, tôi được chuyển tiếp đến vòng phỏng vấn tại chỗ tiếp theo tại Twitter Seattle.

Xem thêm Top 5 API thú vị dành cho các New Developers

Sau đó, họ gửi cho tôi một liên kết đến kho mã hóa trực tuyến và yêu cầu tôi đánh giá code. Tôi cần đưa ra đề xuất về cách cải thiện code và thảo luận với người phỏng vấn trực tiếp. Có một điều bạn cần lưu ý trong các cuộc phỏng trực tiếp tại Twitter là mỗi vòng sẽ có 2 người phỏng vấn bạn.

Thiết kế hệ thống

Các vấn đề xoay quanh nội dung này liên quan đến việc thiết kế một hệ thống từ đầu, mục đích là kiểm tra xem giới hạn thật sự của ứng viên có thể đạt đến đâu. Một trong những câu hỏi mà tôi được hỏi là “Bạn có thể xây dựng một hệ thống đáng tin cậy với thời gian ngừng hoạt động hợp lý từ đầu đến cuối, từ thiết lập giao diện người dùng đến giao tiếp thông qua API HTTP, xây dựng dịch vụ phụ trợ không?”…

Chuyên môn – phần quan trọng của CV IT tiếng Anh

Các vấn đề xung quanh cuộc phỏng vấn đều xoay quanh chuyên môn và kỹ năng thật sự của bạn. Các câu hỏi sẽ đi sâu vào từng khía cạnh của vấn đề như “Dự án bạn đã xây dựng gần đây là gì? Tại sao bạn lại xây dựng nó? Những lựa chọn thay thế được xem xét là gì? Cuối cùng thì nó có hoạt động không?” Vòng này không có các câu hỏi mã hóa mà sẽ tập trung năng lực của bạn trong xử lý từng chi tiết nhỏ của dự án.

Văn hóa làm việc

Nếu được vào đến vòng này, nghĩa là bạn đã làm tốt trong 2 vòng phỏng vấn trước, và ở vòng này họ đang tìm kiếm một người có văn hóa làm việc phù hợp với văn hóa doanh nghiệp. Bạn sẽ được nói chuyện với Giám đốc tuyển dụng và chuyên viên cấp cao trong công ty. Mọi hành động và lời nói của bạn sẽ được đánh giá một cách khắt khe nhất để đảm bảo tìm được ứng viên phù hợp.

Mỗi môi trường làm việc chuyên nghiệp đều đòi hỏi ứng viên cần có tính cách hoặc cách ứng xử phù hợp. Mỗi nhân viên là thành phần gắn kết và có ảnh hưởng đến công ty. Chính vì thế khi tuyển dụng họ đều chú ý đến vấn đề này. Gear Inc. là một ví dụ điển hình.

Kết luận

Đa phần việc tuyển dụng tại các doanh nghiệp lớn như Twitter đều đòi hỏi người ứng tuyển có chuyên môn cao và năng lực ứng xử tốt. Do đó, bạn hãy cố gắng trau dồi, cải thiện những khả năng này của mình để có được công việc mình mong muốn nhé.

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

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

Xem thêm Junior/Senior Developer Jobs hấp dẫn tại TopDev

Dùng .NET Framework với IronPython

Dùng .NET Framework với IronPython

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

IronPython là một triển khai của Python chạy trên .NET Framework, cho phép bạn kết hợp sức mạnh của Python với các tính năng của .NET. Dưới đây là hướng dẫn chi tiết cách sử dụng IronPython với .NET Framework

Assembly là gì?

Assembly (số nhiều: assemblies) là một file được tạo ra bởi quá trình compile một ứng dụng .NET. Nó có thể có đuôi .dll hoặc .exe. .NET Framework có sẵn rất nhiều assemblies (chính là thành phần Class Library trong .NET Framework), cũng tương tự như Python có sẵn rất nhiều standard libraries vậy.

AddReference .NET Assemblies

Khi lập trình các ngôn ngữ .NET khác như C# hay VB.NET, dùng Visual Studio, muốn sử dụng các công cụ trong .NET Framework thì bạn phải thêm “Reference” vào project browser. IronPython có 1 module hỗ trợ “Add Reference” vào script là clr. Các methods Add Reference trong IronPython:

# Sử dụng một trong các methods sau
clr.AddReference
clr.AddReferenceByName
clr.AddReferenceByPartialName
clr.AddReferenceToFile
clr.AddReferenceToFileAndPath

clr.AddReference nhận vào 1 đối tượng System.Reflection.Assembly, hoặc full name của assembly (vd clr.AddReference("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")), hoặc partial name của assembly (vd clr.AddReference("System.Drawing")). Khi dùng partial name, IronPython sẽ tìm file dll ở trong Global Assembly Cache (GAC). Mình thường dùng cách thứ 3: truyền vào partial name cho ngắn gọn. Xem các assemblies đã add ở clr.References:

C:\Users\HTL>"c:\Program Files (x86)\IronPython 2.7\ipy.exe"
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.42000 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> clr.AddReference("System.Drawing")
>>> clr.References
(<mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089>,
<System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089>,
<IronPython.SQLite, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b71
3576e1>,
<IronPython.Wpf, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b713576e1>,
<System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a>)

>>>

Sau khi AddReference, phải import các namespaces có trong assemblies để sử dụng trong IronPython. Cú pháp import như bình thường:

>>> from System import Drawing
>>> print(Drawing)
Microsoft.Scripting.Actions.NamespaceTracker:System.Drawing
>>>

Thắc mắc hay gặp: Mình muốn sử dụng 1 công cụ trong .NET Framework thì biết tên assembly là gì để AddReference, biết namespace nào để import? Trả lời với từ khóa tìm kiếm: Tên_công_cụ msdn (VD System Environment msdn). Dùng phần Assembly để AddReference, phần Namespace để import.

Khi chạy ipy.exe, IronPython đã AddReference sẵn tới mscorlib.dll và System.dll [1]. Khi đó chỉ việc import các namespaces có trong 2 assemblies này mà không phải AddRerence.

Xem thêm tuyển dụng .NET developer lương cao cho bạn

AddReference các Assemblies khác

Ngoài các assemblies có trong .NET Framework, còn có các assemblies khác đi kèm với các phần mềm cài vào Windows, hoặc assemblies được compiled từ chính IronPython. Cú pháp AddReference tương tự như trên, với lưu ý là AddReference khi đó sẽ tìm assemblies trong GAC hoặc sys.path. Nếu không muốn append đường dẫn tới folder chứa file .dll thì có thể dùng AddReferenceToFileAndPath. Phải chạy đúng phiên bản IronPython 32bit/64bit tương ứng với Target Platform mà file assembly được compiled.

Ví dụ file RevitAPI.dll được compiled với Target Platform là x64 (64-bit), nếu chạy ipy.exe (32-bit) sẽ không AddReference được:

C:\Users\HTL>"C:\Program Files (x86)\IronPython 2.7\ipy.exe"
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.42000 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> import sys
>>> sys.path.append(r'C:\Program Files\Autodesk\Revit 2018')
>>> clr.AddReference('RevitAPI')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: System.IO.IOException: Could not add reference to assembly RevitAPI
   at IronPython.Runtime.ClrModule.AddReference(CodeContext context, String name
)
   at IronPython.Runtime.ClrModule.AddReference(CodeContext context, Object refe
rence)
   at IronPython.Runtime.ClrModule.AddReference(CodeContext context, Object[] re
ferences)
   at Microsoft.Scripting.Interpreter.ActionCallInstruction`2.Run(InterpretedFra
me frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0
, T1 arg1, T2 arg2, T3 arg3)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite s
ite, T0 arg0, T1 arg1, T2 arg2)
   at Microsoft.Scripting.Interpreter.FuncCallInstruction`6.Run(InterpretedFrame
 frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0
, T1 arg1, T2 arg2, T3 arg3)
   at IronPython.Compiler.Ast.CallExpression.Invoke1Instruction.Run(InterpretedF
rame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 a
rg1)
   at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
   at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
   at IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteraction
>b__0()
>>>

Mà phải dùng ipy64.exe để AddReference:

C:\Users\HTL>"C:\Program Files (x86)\IronPython 2.7\ipy64.exe"
IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.42000 (64-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> import sys
>>> sys.path
['.', 'C:\\Program Files (x86)\\IronPython 2.7\\Lib',
 'C:\\Program Files (x86)\\IronPython 2.7\\DLLs',
 'C:\\Program Files (x86)\\IronPython 2.7',
 'C:\\Program Files (x86)\\IronPython 2.7\\lib\\site-packages']
>>> sys.path.append(r'C:\Program Files\Autodesk\Revit 2018')
>>> clr.AddReference('RevitAPI')
>>> from Autodesk.Revit.DB import Wall
>>> Wall
<type 'Wall'>
>>>

AddReference các assemblies được compiled bằng IronPython

Nếu như bạn chưa biết, IronPython có thể compile python script thành các file assemblies (.dll hoặc .exe) sử dụng công cụ kèm theo là pyc.py (sẽ có bài viết riêng về Compile python script dùng IronPython).

Một lưu ý quan trọng khi AddReference các file assemblies này là: phải dùng đúng phiên bản IronPython tương ứng với phiên bản đã dùng để compile ra file assembly đó thì mới AddReference được. Ví dụ: file assembly được compiled bằng IronPython 2.7.3 thì khi AddReference ta phải dùng IronPython 2.7.3. Sẽ có ví dụ cụ thể trong bài Compile python script dùng IronPython.

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

Có thể bạn quan tâm: Cách cài .NET framework 3.5 cho Window

15 thư viện slider jquery miễn phí cho dự án website của bạn

15 thư viện slider jquery miễn phí cho dự án website của bạn

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

Slider jquery miễn phí – Trong các website hiện đại slider là 1 phần không thể thiếu, nó giúp trang web của chúng ta chuyên nghiệp hơn, bắt mắt hơn, truyền tải nội dung tới người đọc 1 cách rõ ràng, sinh động hơn…

Để tự code được 1 slider chuyên nghiệp có hiệu ứng đẹp thì thật sự tốn thời gian và không hề đơn giản, vì vậy người ta thường dùng những thư viện slider được cung cấp sẵn để nhúng vào dự án web của họ. Vì thế hôm nay mình sẽ giới thiệu cho các bạn 15 thư viện slider jquery miễn phí, hi vọng sẽ giúp ích cho dự án website của các bạn!

1. bxSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

Các bạn có thể click vào hình để xem demo và cách sử dụng

  • Bxslider đáp ứng đầy đủ nội dung của 1 slider jquery.
  • Có reponsive thích hợp cho nhiều màn hình, lên di động có thể lướt cảm ứng để chuyển động.
  • Nội dung của slider có thể là hình ảnh, video, hoặc là nội dung html.
  • Tương thích với tất cả các trình duyệt.

2. Jssor Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Jssor Slider là 1 thư viện rất thông dụng mình đã sự dụng rất nhiều lần cụ thể là dự án Quảng Đà Hitech, nó chứa hàng chục mẫu slider khác nhau.
  • Dung lượng nhẹ.
  • Tương thích với các trình duyệt.
  • 1 số slider có responsive, thích hợp với các loại màn hình khác nhau.

3. Swiper

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là slider có hiệu ứng chuyển động cực kỳ bắt mắt.
  • Tương thích với tất cả các hệ điều hành: windows, Android, iOS điện thoại cũng như desktop.
  • Có thể sử dụng trên các ứng dụng di động.

4. FlexSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Flexslider được phát triển bởi WooThemes (nếu ai chơi wrodpress sẽ biết 😀 )
  • Là 1 slider đơn giản, nhẹ nhàng.
  • Tương thích với nhiều loại màn hình, trình duyệt cũng như hệ điều hành.

5. Superslides

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là loại slider full màn hình.
  • Tự động canh hình ảnh ở vị trí trung tâm.
  • Slider rất nhẹ giúp tăng tốc độ cho website.
  • Tính tương thích cao.

6. Unslider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Unslider là 1 jquery slider nhẹ.
  • Có hỗ trợ reponsive.
  • Có nhiều hiệu ứng chuyển động ngang và dọc.
  • Có tính tương thích cao.

7. AnythingSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là 1 slider jquery miễn phí có nhiều hiệu ứng độc đáo
  • Có nhiều tính năng ưu việt (Bạn click vào hình để xem thêm)

8. OWL Carousel

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là thư việc slider jquery mình hay sử dụng nhất.
  • Có thể chuyển động slider bằng cách kéo lê chuột.
  • Có responsive có thể tùy chỉnh trên từng loại màn hình.
  • Sử dụng hiệu ứng css3.

9. PgwSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là silider thích hợp dùng ở vị trí bài viết
  • Dung lượng nhẹ
  • Có hỗ trợ responsive
  • Thân thiện với các hệ điều hành và trình duyệt
  • Hỗ trợ seo tốt.

10. ayaSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Là 1 slider jquery miễn phí, đơn giản, dễ cài đặt.
  • Có hỗ trợ responsive.
  • Có thể tùy biến cao.

11. Liquid Slider  jquery miễn phí

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • 1 slider jquery dạng tabs
  • Có hỗ trợ responsive, dễ dàng sử dụng
  • Sử dụng hiểu ứng Animation and transition

12. StackSlider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Đây là slider có responsive thân hiện với các trình duyệt, hệ điều hành.
  • Sử dụng hiệu ứng 3D.
  • Lên di động có thể sử dụng lướt để thay đổi slider.

13. Immersive Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Có responsive.
  • Hiệu ứng chuyển động độc đáo và lạ mắt.
  • Có tính tương thích cao

14. 360 Image Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

15. Fullscreen Slit Slider

15 thư viện slider jquery miễn phí cho dự án website của bạn

  • Có responsive
  • Tương thích cao

Trên đây là 15 thư viện slider jquery miễn phí khá chất lượng mà mình tìm hiểu được, còn rất nhiều thư viện khác nếu có thời gian các bạn có thể tìm hiểu.

Hi vọng những thư viện này sẽ có ích trong dự án website của các bạn, nếu biết được những thư viện slider jquery nào hay hãy cmt chia sẽ bên dưới nhé!

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

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

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

[Update] Thêm Firebase vào Flutter và login với Google

Thêm Firebase vào Flutter và login với Google (Update 9/2020)

Bài viết được sự cho phép của tác giả Khiêm Lê

Firebase là gì?

Firebase là một nền tảng lập trình di động và web application được phát triển bởi Firebase, Inc năm 2011. Vào năm 2014, Firebase được Google mua lại, và đây chính là sự bùng nổ của Firebase khi được một ông lớn công nghệ như Google đứng sau. Tính đến thời điểm tháng 10 năm 2018, Firebase có 18 sản phẩm, chúng được sử dụng bởi 1.5 triệu ứng dụng.

Rất nhanh chóng, sau khi Flutter ra mắt, các plugin hỗ trợ Flutter kết nối với Firebase cũng đã được Google phát triển, họ gọi các plugin đó là FlutterFire. Tuy nhiên, do còn mới các FlutterFire này vẫn chưa chạm đến phiên bản 1.0, đây chính là nguyên nhân gây ra rất nhiều lỗi trong quá trình tích hợp Firebase vào Flutter. Hôm nay mình sẽ hướng dẫn các bạn cách tích hợp Firebase vào Flutter và login với Google. Hãy cùng bắt đầu ngay bây giờ!

>>> Xem thêm: Có nên dùng cho các ứng dụng lớn?

Tạo project Flutter

Chọn nơi bạn muốn lưu project Flutter của mình, nhấn chuột phải mở git bash, chạy câu lệnh “flutter create <your_project_name>”, mình sẽ đặt tên App là firebase_login. Mình muốn là trên màn hình có hai nút Login, Logout và một dòng chữ thông báo user đã login hay chưa, code của mình như sau:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _message = 'You are not sign in';

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase Login'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_message),
            OutlineButton(
              onPressed: () {},
              child: Text('Login'),
            ),
            OutlineButton(
              onPressed: () {},
              child: Text('Logout'),
            ),
          ],
        ),
      ),
    );
  }
}

Sau khi xong phần flutter project, chúng ta sẽ chuyển sang phần Firebase project.

Tạo project Firebase và kết nối với Flutter

Đầu tiên, bạn truy cập Firebase Console, nhấn vào nút Add project. Sau đó đặt tên project, phần Project Id các bạn để mặc định. Ở đây mình đặt project tên là Flutter Firebase, sau đó nhấn Continue để tiếp tục.

Tiếp theo, ở phần Google Analytics for your Firebase project, bạn bỏ tích Enable Google Analytics for this project và nhấn Create project, sau khi tạo xong bạn nhấn Continue để tiếp tục.

Ở trang chủ, bạn nhấn vào biểu tượng Android để thêm ứng dụng Android vào project, ở đây chúng ta sẽ phải nhập applicationId. Bạn mở lại project flutter, vào thư mục “android/app”, mở file “build.gradle”, bạn tìm đến dòng “applicationId”, bạn sửa lại dòng này thành id bạn muốn (lưu ý định dạng com.example.app), copy nó và dán vào phần Android package name trong Firebase.

Tiếp đến phần Debug signing certificate SHA-1, nếu app của bạn không dùng Google Sign in hoặc Dynamic link thì không cần (mình vẫn khuyên bạn nên thêm vào cho chắc). Để lấy được mã SHA-1, bạn mở thư mục cài Android Studio và tìm đến thư mục “jre/bin”, máy của mình sẽ là thư mục “C:\Program Files\Android\Android Studio\jre\bin”. Trong thư mục bin, bạn mở git bash và chạy lệnh “keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android”, sau khi chạy lệnh này, bạn sẽ thấy trên cửa sổ git có một mục là Certificate fingerprints, bên trong đó có mục SHA1, bạn copy toàn bộ phần mã đó dán vào mục SHA-1 bên Firebase.

Nếu như lệnh keytool bị lỗi, các bạn hãy thay đường dẫn thành “keytool -list -v -keystore C:/Users/<Tên user trên máy của bạn>/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android”. Tiếp tục copy mã SHA1 và bỏ vào trong firebase.

Bạn nhấn Next để tiếp tục, ở bước tiếp theo, bạn nhấn vào Download google-services.json, sau đó để nó vào trong thư mục android/app của project.

Tiếp theo, bạn copy dòng “classpath ‘com.google.gms:google-services:4.3.3′”, mở project flutter, tìm đến folder android, mở file build.gradle, bạn tìm đến phần dependencies và dán đoạn code vừa copy vào.

Tiếp tục bạn quay lại Firebase, copy đoạn code “apply plugin: ‘com.google.gms.google-services’”, thêm vào cuối file build.gradle trong folder “android/app” và lưu lại. Quay về Firebase và nhấn Continue to console.

Tiếp theo, bạn copy file google-services.json đã tải ở trên vào thư mục “android/app”. Vậy là chúng ta đã hoàn thành phần config Firebase trong flutter rồi. Sang phần tiếp theo là code flutter để đăng nhập và đăng xuất.

Thêm plugin và code phần đăng nhập

Đầu tiên, mình cần thêm các plugin sau vào file pubspec.yaml:

dependencies:
  firebase_core: "0.5.0"
  firebase_auth: "^0.18.0+1"
  google_sign_in: ^4.5.3
  // ...

Trở lại với file main.dart của chúng ta, trong phiên bản rework mới của Google, chúng ta bắt buộc thêm đoạn code sau trước khi chạy bất kỳ dịch vụ nào của Google. Nhớ là phải gọi mọi dịch vụ của Google sau khi initializeApp hoàn tất, nếu không sẽ bị lỗi.

await Firebase.initializeApp();

Vì lý do này, chúng ta cần phải thêm FutureBuilder vào Widget tree để đảm bảo việc initial firebase được thực hiện xong trước khi bất kỳ chức năng nào khác được thực hiên.

// Thêm thư viện firebase_core
import 'package:firebase_core/firebase_core.dart';

class _MyHomePageState extends State<MyHomePage> {
// Thêm dòng này
final Future<FirebaseApp> _initialization = Firebase.initializeApp();

// Trong body của Scaffold
// Bọc Widget Center bằng FutureBuilder
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase Login'),
      ),
      body: FutureBuilder(
          future: _initialization,
          builder: (context, snapshot) {
            // Kiểm tra xem có bị lỗi khi initialize không
            if (snapshot.hasError) {
              return Text('Something went wrong');
            }

            // Nếu thành công thì hiển thị như lúc đầu chúng ta đã tạo
            if (snapshot.connectionState == ConnectionState.done) {
              return Center(
                // Code goes here
              );
            }
            // Đang load
            return CircularProgressIndicator();
          }
}

Sau khi xong các bạn có thể run app để check thử xem có bị lỗi không. Nếu không có thì chúng ta tiếp tục thêm tính năng login.

import 'package:flutter/material.dart';
// import thêm hai thư viện này
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

// ...

class _MyHomePageState extends State<MyHomePage> {
  String _message = 'You are not sign in';

  // Thêm các đoạn code sau
  FirebaseAuth _auth;
  GoogleSignIn _googleSignIn;

  Future<User> _handleSignIn() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;

    final AuthCredential credential = GoogleAuthProvider.credential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );

    final User user = (await _auth.signInWithCredential(credential)).user;
    print("signed in " + user.displayName);
    setState(() {
      // User đã login thì hiển thị đã login
      _message = "You are signed in";
    });
    return user;
  }

  Future _handleSignOut() async {
    await _auth.signOut();
    await _googleSignIn.signOut();
    setState(() {
      // Hiển thị thông báo đã log out
      _message = "You are not sign out";
    });
  }

  Future _checkLogin() async {
    // Khi mở app lên thì check xem user đã login chưa
    final User user = _auth.currentUser;
    if (user != null) {
      setState(() {
        _message = "You are signed in";
      });
    }
  }

  // ...
            if (snapshot.connectionState == ConnectionState.done) {
              // Chỉ có thể thực hiện các dịch vụ Google sau khi initializeApp hoàn tất
              _auth = FirebaseAuth.instance;
              _googleSignIn = GoogleSignIn();
              _checkLogin();
                    // Code goes here
                    OutlineButton(
                      onPressed: () {
                        _handleSignIn();
                      },
                      child: Text('Login'),
                    ),
                    OutlineButton(
                      onPressed: () {
                        _handleSignOut();
                      },
                      child: Text('Logout'),
                    ),
                    // Code goes here
            }
// ...

Code của mình đơn giản chỉ có vậy. Nhưng hiện giờ bạn chưa thể login được đâu, bạn cần bật phương thức đăng nhập bằng Google Account trong Firebase Console. Cách thực hiện như sau: bạn mở tab Authentication, nhấn vào button Set up a sign-in method.

Tiếp theo, bạn nhấn vào dòng Provider là Google, chọn Enable. Sau đó, ở phần Project public-facing name bạn đặt tên gì cũng được, nó sẽ là tên hiển thị trong phần hỏi user khi login. Phần project support email, bạn chọn email của bạn và nhấn Save.

Vậy là chúng đã xong rồi, giờ là lúc chúng ta run app và test thử. Một lưu ý nhỏ cho các bạn là các bạn dùng Login với Google thì phải run trên máy ảo có Google Play, hoặc chạy trên máy thật cho nó chắc, nếu không app sẽ bị lỗi. Và đây là kết quả!

Nếu như bạn nào gặp phải lỗi build app, bạn nên xem lại các cái version của dependencies, classpath, đã chỉnh sửa lại như trong bài viết chưa (mình sẽ có gắng update bài liên tục), nếu vẫn chưa được, bạn hãy migrate sang android X, chỉnh minSdkVersion (trong file “android/app/build.gradle”) từ 16 sang ít nhất là 21. Nếu vẫn chưa giải quyết được bạn có thể comment phía bên dưới mình sẽ giúp đỡ bạn.

Tổng kết

Vậy là trong bài này, mình đã hướng dẫn các bạn tích hợp Firebase vào Flutter và đăng nhập với Google Sign In. Nếu các bạn có thắc mắc dì có thể để lại comment phía bên dưới, mình sẽ giúp nếu có thể. Nếu Firebase có update, các plugin có thay đổi hoặc flutter có thay đổi, bài viết này không còn áp dụng được nữa, bạn có thể vào trang Liên hệ để thông báo với mình, mình sẽ update lại bài viết này nha.

Bài viết này sẽ được mình cập nhật khi có thay đổi lớn diễn ra. Nếu các bạn gặp vấn đề với các method bị Deprecated thì có thể comment bên dưới, mình sẽ cố gắng cập nhật bài viết sớm nhất có thể nha. Trong bài này mình chỉ hướng dẫn các bạn cách có thể thêm firebase và login bằng Google thôi, code chưa được tổ chức hợp lý nên các bạn có thể tổ chức lại cho dễ quản lý hơn nha.

Các bạn có thể xem code tại GitHub của mình. Hy vọng bài viết này hưu ích đối với các bạn, nếu bạn thấy bài viết hay, hãy share bài viết để mọi người cùng biết nha ^^. Cảm ơn các bạn đã đọc bài viết của mình!

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

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

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

5 tips để trở thành một coder giỏi hơn mỗi ngày!

javascript

javascript Dịch từ bài viết của tác giả: Kevin Gardner

Giới thiệu

Lập trình từ khi ra đời cho đến nay vẫn không ngừng phát triển. Bạn càng có kỹ năng coding tốt thì càng có nhiều cơ hội làm việc tốt hơn. Quan trọng là hãy biết cách “làm mới” mình mỗi ngày, đừng tự mãn với những gì mình có mà hãy cố gắng học hỏi thêm thật nhiều kiến thức mới từ những kiến thức cơ bản như ngôn ngữ JavaScript đến các ngôn ngữ, kỹ thuật chuyên môn hơn như Assembly, C,…. Dưới đây là 5 chiến thuật tuyệt vời bạn có thể áp dụng để trở thành một dev giỏi hơn.

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer
  5 ngôn ngữ lập trình “khó chịu” nhất thế giới

5 chiến thuật học hỏi tốt nhất (áp dụng cả với JavaScript)

1. Lên kế hoạch để vượt qua điểm yếu của bản thân

Một trong những kỹ năng quan trọng của dev là biết mình cần phải làm gì. IT là một lĩnh vực rộng nên mỗi dev chỉ cần tập trung vào đúng lĩnh vực chuyên môn của mình và làm tốt nhất có thể trong khả năng với một số nhiệm vụ hay ngôn ngữ lập trình nhất định.

javascript cơ bản
Cần biết cách vượt qua điểm yếu của chính mình

Khi mới bắt đầu bạn nên làm quen với ngôn ngữ JavaScript cơ bản. Đó là ngôn ngữ nền tảng web chuẩn, được sử dụng phổ biến nhất và thường được ứng dụng trong build mobile app. Bạn cũng nên cân nhắc về khả năng tài chính của mình để đăng kí thêm những khóa học JavaScript online hoặc tự học để trau dồi kiến thức, khắc phục các điểm yếu trong chuyên môn của mình.

Bên cạnh đó, khi làm việc và học tập, bạn nên cố gắng lựa chọn một môi trường yên tĩnh, giúp bạn tập trung tối đa nhất. Vì theo kết quả nghiên cứu của Viện Công nghệ Georgia, các lập trình viên có thể mất 10 đến 15 phút để quay trở lại với công việc sau khi bị ngắt quãng, điều này có thể khiến các dev bị gián đoạn suy nghĩ và giải quyết vấn đề kém hơn.

Xem thêm: Javascript ES6 – Đôi điều thú vị có thể bạn chưa biết

2. Luôn có một dự án trong quá trình hoạt động, nhất là với code mới

Ngoài các công việc thường ngày, dev nên làm thêm các dự án phụ bên ngoài để nâng cao khả năng cũng như giới hạn của bản thân. Việc làm thêm những task mới chắc chắn sẽ giúp bạn học hỏi rất nhiều điều bổ ích khác như một kỹ thuật mới, ngôn ngữ mới, kiến thức mới chẳng hạn. Học tập chưa bao giờ là việc dễ dàng, nhất là trong lĩnh vực IT, từ ngôn ngữ lập trình JavaScript, C/C++,… đến các kỹ thuật chuyên môn khác, đều cần sự kiên trì, chăm chỉ rèn luyện. Hãy cố gắng giữ cho bản thân động lực cao nhất để hoàn thành nhiều việc hơn, từ đó nâng cấp trình độ của bạn lên một vị trí mới.

3. Tham khảo ý kiến với các lập trình viên đi trước bất cứ khi nào có thể

Bạn có thể học hỏi được nhiều thứ từ những tiền bối trong nghề vì họ có nhiều kinh nghiệm làm việc hơn. Bạn có thể nhờ các đồng nghiệp trong công ty hỗ trợ và giải thích khi gặp một số công việc hay chưa hiểu rõ về JavaScript cơ bản,… vấn đề mà bạn không quen thuộc. Hoặc bạn có thể tham khảo thêm ý kiến của những người đi trước thông qua các nền tảng trực tuyến như đặt câu hỏi trên Google, Reddit, YouTube, blog hoặc Codecademy.

Xem thêm các việc làm Tester hấp dẫn

Hãy học hỏi cách người khác viết code. Đó là một nguồn tài nguyên tuyệt vời để bạn mở mang tầm mắt và suy nghĩ của mình, học hỏi thêm nhiều thứ từ cách mà người khác xử lý vấn đề.

4. Không chỉ dừng lại ở một lần viết code, nhất là với JavaScript

Bạn sẽ không bao giờ có thể cải thiện được kỹ năng viết code của mình nếu chỉ viết đến khi code có thể chạy được và ngay lập tức dừng lại, hoặc chỉ đơn thuần là copy và paste mà không tìm hiểu lý do tại sao code đó hoạt động được. Với ngôn ngữ lập trình JavaScript chẳng hạn, bạn nên cố gắng viết code đến khi nào bạn hoàn toàn hiểu hết về chúng thì lúc đó mới có thể gọi là đã hoàn thành một dự án. Có một sự thật là bạn có thể viết code bằng tay trên giấy, tuy hơi mất thời gian nhưng đây được xem là cách giúp cải thiện kỹ năng coding đáng kể dù đang ở trình độ nào đi chăng nữa.

>>> Xem thêm Top 5 API thú vị dành cho các New Developers

Code luôn luôn có thể cải thiện được để nó hoạt động nhanh hơn, đáng tin cậy hơn. Nếu bạn thật sự muốn đạt trình độ bậc thầy coding, bạn nên viết code cho một dự án ít nhất 3 lần. Nghĩa là sau khi viết code 1 lần và nó đã chạy được, bạn hãy viết tiếp thêm lần nữa, viết mới hoàn toàn. Cứ như thế, sau 3 lần bạn sẽ tìm ra được đâu mới là sản phẩm thật sự chất lượng, đáp ứng đầy đủ các thông số kỹ thuật cho yêu cầu của dự án.

5. Không nên chỉ học một ngôn ngữ lập trình

Mỗi ngôn ngữ lập trình (JavaScript, Golang, Java,…) đều có ưu và nhược điểm riêng, các dev không nên có suy nghĩ phiến diện rằng chỉ có ngôn ngữ này thì tốt và ngôn ngữ khác thì vô dụng và không đáng để học hỏi. Học một ngôn ngữ mới mang lại cho bạn một góc nhìn mới và có thể giúp bạn xử lý các dự án đang triển khai với chuyên môn cao hơn.

Bạn có thể bắt đầu học thêm về ngôn ngữ C / C ++, JavaScript, Ruby, Python, Django, Pascal và NodeJS,… Học thêm ngôn ngữ lập trình khác, với cách tiếp cận và tư duy khác nhau sẽ cho bạn cơ hội hiểu được vấn đề ở nhiều góc độ khác nhau. Giúp các dev mở rộng suy nghĩ và sáng tạo hơn trong quá trình làm việc của mình.

Kết luận

Có nhiều cách khác nhau để bạn có thể nâng cao trình độ coding của mình và tìm được việc làm phù hợp tại các công ty như Gear Inc. Hãy cân nhắc với các tip hữu ích nhất và từ đó rút ra kinh nghiệm làm việc phù hợp nhất với bản thân mình nhé!

Tìm hiểu thêm về công ty Gear Inc. tại đây

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

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

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

Docker to Serverless (Google Cloud Platform)

Docker to Serverless (Google Cloud Platform)

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

Hi xin chào các bạn sau chuỗi ngày dài trốn dịch thì mình đã quay trở lại, chợ bị yêu cầu đống cửa, chả buôn bán được gì nên mình lại có thời gian rảnh để mà vọc vạch, tình cờ nghe ông anh nói qua serverless đồ các kiểu thì mình cũng thấy hứng thú, trong bài viết này mình sẽ chia sẻ những thứ mà mình đã vọc vạch trong ngày vừa qua.

Deploy application từ docker image

Ý tưởng đơn giản là bạn s đống gói ứng dụng thành docker image rồi upload lên docker image repository nào đó như gcloud container registry sau đó sử dụng một dịch vụ hỗ trợ chạy container từ docker image như google cloud run.

  1. Build ứng dụng ra Docker Image

Trong ví dụ này mình sẽ dùng blog của mình làm ví dụ. Project này sử dụng nextjs, mỗi khi mình viết một bài mới thì mình sẽ build code rồi export ra static file, mình không cần phải làm phức tạp, vì với blog này chỉ cần static file là đủ.

git clone https://github.com/dongnguyenltqb/dongnguyen.dev.git
cd dongnguyen.dev
yarn install# Để build project
yarn build
# Để export ra static file
yarn export

Và sau khi export thì mình có toàn bộ static file trong thư mục out

➜  dongnguyen.dev git:(master) ✗ ll
total 864
-rw-r--r--    1 gopher  staff    25B Apr  4 23:57 404.html
-rw-r--r--    1 gopher  staff   155B Apr  5 11:41 Dockerfile
-rw-r--r--    1 gopher  staff   1.1K Mar 14 13:29 LICENSE
-rw-r--r--    1 gopher  staff   870B Apr  5 11:45 cloudbuild.yaml
-rw-r--r--    1 gopher  staff   667B Mar 14 13:29 next.config.js
-rw-r--r--    1 gopher  staff   174B Apr  4 23:57 nginx.conf
drwxr-xr-x  854 gopher  staff    27K Apr  4 20:13 node_modules
drwxr-xr-x   44 gopher  staff   1.4K Apr  4 20:15 out
-rw-r--r--    1 gopher  staff   1.5K Apr  4 20:12 package.json
-rw-r--r--    1 gopher  staff   506B Mar 14 13:29 postcss.config.js
drwxr-xr-x   37 gopher  staff   1.2K Mar 16 10:02 public
drwxr-xr-x    8 gopher  staff   256B Mar 16 10:02 src
-rw-r--r--    1 gopher  staff   867B Mar 14 13:29 tailwind.config.js
-rw-r--r--    1 gopher  staff   394K Apr  4 20:12 yarn.lock
➜  dongnguyen.dev git:(master) ✗

Các bạn để ý thì thấy mình có sử dụng nginx để serve static file

Nginx sẽ lắng nghe request, dựa vào path mà xem có file nào match không, không thì nó sẽ gửi file index.htmlvà nếu không thấy fileindex.html nữa thì trả về 404

server {
    listen 80;
    listen [::]:80;root /usr/share/nginx/html;
    error_page 404 /404.html;location / {
        try_files $uri /index.html =404;
    }
}

Và đây là nội dung của Dockerfile

FROM nginx:1.14WORKDIR /usr/share/nginx/htmlCOPY out  /usr/share/nginx/html/
COPY 404.html .
COPY nginx.conf /etc/nginx/conf.d/default.confEXPOSE 80

Khi build image thì mình sẽ copy tất cả file trong thư mục out vào /usr/share/nginx/html/ Sau đó copy file nginx.conf vào /etc/nginx/conf.d/default.conf để nginx dùng cho việc tạo server serve static file.

➜  dongnguyen.dev git:(master) ✗ sudo docker build .
Password:
Sending build context to Docker daemon    312MB
Step 1/6 : FROM nginx:1.14
 ---> 295c7be07902
Step 2/6 : WORKDIR /usr/share/nginx/html
 ---> Running in b3833b65516a
Removing intermediate container b3833b65516a
 ---> 88cb20f7c71e
Step 3/6 : COPY out  /usr/share/nginx/html/
 ---> 6baffa267a2e
Step 4/6 : COPY 404.html .
 ---> ccc50836cbf4
Step 5/6 : COPY nginx.conf /etc/nginx/conf.d/default.conf
 ---> af5a5d05ce44
Step 6/6 : EXPOSE 80
 ---> Running in d5c64c94d39e
Removing intermediate container d5c64c94d39e
 ---> 45bbe32cd01c
Successfully built 45bbe32cd01c
➜  dongnguyen.dev git:(master) ✗

Kết quả image nặng 138MB

➜  dongnguyen.dev git:(master) ✗ docker image ls
REPOSITORY   TAG     IMAGE ID     CREATED            SIZE
<none>       <none>  45bbe32cd01c  32 seconds ago      138MB

2. Đưa image lên Google Container Registry

container registry là nơi mà ta sẽ lưu trữ image, để push được image lên đây thì docker của các bạn cần phải được config để có quyền. Ở đây mình dùng gcloud cli để cấp quyền cho docker và nếu các bạn chưa cài gcloud cli thì có thể xem hướng dẫn cài đặt, cài đặt tài khoản cho cli tại đây.

➜  dongnguyen.dev git:(master) ✗ sudo gcloud auth configure-docker
Password:
WARNING: Your config file at [/Users/gopher/.docker/config.json] contains these credential helper entries:{
  "credHelpers": {
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud"
  }
}
Adding credentials for all GCR repositories.
WARNING: A long list of credential helpers may cause delays running 'docker build'. We recommend passing the registry name to configure only the registry you are using.
gcloud credential helpers already registered correctly.Updates are available for some Cloud SDK components.  To install them,
please run:
  $ gcloud components update➜  dongnguyen.dev git:(master) ✗

Vậy là xong việc cấp quyền, việc tiếp theo là đánh tag cho nó và upload lên.

➜  dongnguyen.dev git:(master) ✗ sudo docker push asia.gcr.io/tough-racer-272817/blog:v0.69
The push refers to repository [asia.gcr.io/tough-racer-272817/blog]
518883fbeafc: Pushed
39fdf81e18fd: Pushed
070d58aabef7: Pushed
82ae01d5004e: Layer already exists
b8f18c3b860b: Layer already exists
5dacd731af1b: Layer already exists
v0.69: digest: sha256:965753d697100fa539efaf0730de6856db0d52a0f3db7557a87a18f5467f7fcd size: 1573
➜  dongnguyen.dev git:(master) ✗

Và ở trên container registry

Docker to Serverless (Google Cloud Platform)

Và để deploy lên cloud run các bạn chỉ cần

sudo gcloud \
beta \
run \
deploy \
--region asia-east1 \
--image asia.gcr.io/tough-racer-272817/blog:v0.69 \
--max-instances 1 \
--platform managed \
--port 80 \
--allow-unauthenticated \
blog

Kết quả

➜  dongnguyen.dev git:(master) ✗ 

Deploying container to Cloud Run service [blog] in project [tough-racer-272817] region [asia-east1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [blog] revision [blog-00014-dax] has been deployed and is serving 100 percent of traffic at https://blog-k3ndrinnqq-de.a.run.app
➜  dongnguyen.dev git:(master) ✗

Và xong ứng dụng của mình đã được deploy tại https://blog-k3ndrinnqq-de.a.run.app

Để tự động hóa quá trình build và deploy thì mình dùng đến dịch vụ google cloud build, trình tự sẽ như thế này, kết nối GitHub repository với cloud build, tạo một triggerđến một event từ githubví dụ như là khi push to a branchpush new tag

Docker to Serverless (Google Cloud Platform)

Ví dụ như trong hình mình setup một trigger cứ mỗi khi mình push code lên branch master thì cloud buildsẽ tiến hành làm những công việc mình đã định nghĩa trong file cloudbuild.yaml

Sau khi tạo xong trigger

Docker to Serverless (Google Cloud Platform)

Nội dung file cloudbuild.yamltrong gitHub repository

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA']
- name: 'gcr.io/cloud-builders/docker'
  args: ['tag', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA', 'asia.gcr.io/tough-racer-272817/blog:latest']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'asia.gcr.io/tough-racer-272817/blog:latest']
- name: 'gcr.io/cloud-builders/gcloud'
  args:
    - beta
    - run
    - deploy
    - --region=asia-east1
    - --image=asia.gcr.io/tough-racer-272817/blog:latest
    - --cpu=1
    - --memory=128Mi
    - --max-instances=1
    - --platform=managed
    - --port=80
    - --concurrency=100
    - --allow-unauthenticated
    - blog
images:
  - 'asia.gcr.io/tough-racer-272817/blog:latest'

Trình tự các bước mà cloud run sẽ làm

  1. Build image và đánh tagcho nó.
  2. Đẩy image đã build lên container registry
  3. Đánh thêm tag latest nữa cho image
  4. Đẩy image với tag latest lên container registry
  5. Chạy lệnh để deploylên cloud run với image có tag latest

Nhưng trước tiên, bạn phải setup kết nối gitHub repository và cấp quyền cho cloud build với thêm hai role Cloud Run Admin vàCloud Run Service Agent là trong cài đăt IAM

Docker to Serverless (Google Cloud Platform)

Và bây giờ mọi thứ đã có thể diễn ra tự động rồi, mình sẽ commit code và push lên branch master, và đây là kết quả

Docker to Serverless (Google Cloud Platform)

Thực ra thì cái gì cũng có hạn chế, serverless (Google cloud Platform) cũng vậy, đây là một vài issue đang tồn tại của Cloud Run nhưng so với nhau cầu serve static file hay là host một web api của mình thì cái này cũng đủ rồi.

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

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

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

Đối diện với sự non kém của chính mình

Đối diện với sự non kém của chính mình

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

Nếu chúng ta đánh giá cao tính độc lập, nếu chúng ta cảm thấy phiền lòng về sự phát triển kiến thức, giá trị và thái độ theo cùng một khuôn mẫu mà hệ thống hiện tại tạo ra, thì chúng ta có thể mong muốn tạo lập môi trường học tập khuyến khích sự khác biệt, tự định hướng và tự học.

—Carl Rogers, On Becoming a Person

Bối cảnh

Bạn đã xác định được những kĩ năng mình còn thiếu, những kỹ năng đó liên quan trực tiếp tới công việc hàng ngày của bạn.

Vấn đề

Có rất nhiều công cụ và kỹ thuật mà bạn cần phải nắm vững, nhưng bạn không biết cách để bắt đầu. Những người xung quanh bạn dường như đã biết một số kỹ năng đó, và họ kỳ vọng rằng bạn cũng đã lam chủ được các kiến thức này.

Giải pháp

Hãy chọn một kỹ năng, công cụ hoặc một kỹ thuật nào đó để lấp đầy khoản trống còn thiếu.

Hãy thực hiện điều này bằng cách lựa chọn một cách làm hiệu quả nhất đối với mình. Với một số người, cách tiếp cận tốt nhất là tìm hiểu để có cái nhìn tổng quan thông qua việc đọc các bài giới thiệu và danh sách các câu hỏi thường gặp. Một số người khác lại thích bắt tay ngay vào xây dựng một chương trình phần mềm nhỏ, đó là cách hiệu quả giúp họ hiểu rõ vấn đề. Bạn lựa chọn cách tiếp cận nào cũng được, đừng quên hỏi những người có cùng sở thích và cố vấn của bạn để xem họ có kỹ năng này không và họ có sẵn sàng chia sẻ về những gì họ biết không. Đôi khi có những người khác cũng như bạn, đang cố gắng tìm hiểu những kỹ năng này, làm việc cùng nhau sẽ giúp bạn tiến bộ hơn. Đến một thời điểm nào đó, bạn sẽ đạt được trình độ mà mình khá hài lòng trong lĩnh vực mới này, sau đó bạn có thể quyết định liệu có nên đào sâu hơn hay là chuyển sang tìm hiểu các kỹ năng khác. Chúng ta không có đủ thời gian để mài giũa tất cả các kỹ năng đến trình độ cao, vì vậy bạn phải đưa ra lựa chọn của mình.

Trường hợp này rất gần với tình huống không che giấu sự thiếu hiểu biết (Expose Your Ignorance), nhưng bạn sẽ ít ngại ngùng hơn vì có thể tự mình thực hiện, sẽ không có ai biết được những thiếu sót của mình. Tuy nhiên, với tư cách là một người học việc có khát vọng làm chủ kiến thức thì bạn cần sẵn sàng biểu lộ sự thiếu hiểu biết của mình. Sử dụng mô hình này một cách tách biệt (tức là, khắc phục sự thiếu hiểu biết của mình mà không biểu lộ ra ngoài) có nguy cơ tạo ra một văn hoá mà ở đó việc thất bại và học tập không được khuyến khích, tất cả mọi người đều tự học trong im lặng. Nên nhớ rằng học tập công khai là một trong những cách để một người học việc có thể trở thành thợ lành nghề. Đây là một bước nhỏ cần thiết để mọi người thấy được rằng bạn đang cố gắng học, và sau đó họ sẽ dạy bạn.

Kể cả khi áp dụng thành công cách làm này thì nó cũng có thể dẫn đến một số ảnh hưởng xấu. Chẳng hạn, trong trường hợp bạn cần học cách xây dựng các hệ thống đồng thời (concurrent system), các lập trình viên khác sẽ không đánh giá cao nếu bạn tự viết một hệ thống nhắn tin của riêng mình bằng ngôn ngữ Scala thay vì sử dụng một sản phẩm đã có sẵn. Và họ sẽ thấy khó chịu hơn nếu họ không thể hỏi bạn bất cứ một câu hỏi nào về vấn đề này bởi vì đơn giản là bạn đang tham dự một cuộc họp. Và cuối cùng ông chủ của bạn cũng không thể hiểu liệu nhu cầu học của bạn có gây trở ngại trong việc hoàn thành dự án hay không. Tóm lại, bạn cần có đủ sự tinh tinh tế để giữ cho việc học tập của mình không gây ra vấn đề cho nhóm. Một trong những điểm nổi bật của cách tiếp cận thủ công là sẵn sàng đưa lợi ích của cộng đồng lên trước cá nhân, không sử dụng nhóm và khách hàng để phục vụ việc phát triển của cá nhân.

Mặt khác, cũng có người thể hiện sự thiếu hiểu biết của mình nhưng lại không đối mặt với nó. Những người làm điều này chỉ đơn thuần nhún vai xin lỗi, như để nói rằng “đó là điều hiển nhiên”. Việc này khiến họ trở nên thấp kém, thiếu hiểu biết và quá phụ thuộc vào các thành viên khác trong nhóm. Cuối cùng, nó tạo nên các nhóm mà ở đó các thành viên bảo vệ cái “nhà kho” kiến thức nhỏ bé của mình và nhún vai khi gặp một vấn đề nằm trong phạm vi lãnh thổ của người khác.

Vì vậy, điều quan trọng là phải cân bằng giữa mô hình này và việc thể hiện sự thiếu hiểu biết của bạn. Tự đối mặt với sự thiếu hiểu biết của chính mình có thể khiến bạn trở thành một kiêu ngạo không bao giờ hoàn thành được việc gì, còn nếu không thể hiện sự thiếu hiểu biết của chính mình và đối mặt với nó thì bạn sẽ trở nên kém cỏi và vô dụng hơn.

Hành động

Lập một danh sách các kỹ năng mà mình còn non kém (Thể hiện sự thiếu hiểu biến của mình) và cố gắng học từng thứ một để đạt được và loại bỏ nó khỏi danh sách. Khi biết thêm một kiến thức mới, bạn lại có thể phát hiện ra những thiếu sót khác của mình mà đã không nhận ra trước đây, đừng quên thêm chúng vào danh sách của bạ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 các việc làm Developer hấp dẫn tại TopDev

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

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

Ruby và Python là hai trong số các ngôn ngữ lập trình được sử dụng phổ biến nhất để lập trình ứng dụng. Theo khảo sát hàng năm của Stack Overflow, được đánh giá bởi hơn 90.000 lập trình viên trên toàn thế giới. Ruby và Python nằm trong Top 15 ngôn ngữ lập trình có nhu cầu cao nhất trong năm 2019. Cho bạn nào chưa biết thì trên thế giới có khoảng 700 ngôn ngữ lập trình nhé.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Ruby và Python có rất nhiều điểm chung. Chúng đều là các ngôn ngữ hướng đối tượng bậc cao, tập trung vào sự đơn giản và rõ ràng. Tuy nhiên, như trên tiêu đề của bài viết, hôm nay chúng ta sẽ so sánh hai ngôn ngữ này để tìm ra ngôn ngữ nào tốt hơn cho các dự án lập trình ứng dụng web của bạn.

Trước tiên, chúng ta hãy bắt đầu tìm hiểu những thông tin cơ bản về Ruby và Python trước khi tiến hành so sánh.

Ruby

Ruby được phát hành vào năm 1995. Yukihiro Matsumoto, người sáng lập Ruby, cho biết: Mục đích của Ruby là làm cho các lập trình viên cảm thấy hài lòng. Ruby được thiết kế như một ngôn ngữ thân thiện với các lập trình viên. Nó cũng là một ngôn ngữ rất linh hoạt cho phép các lập trình viên dễ dàng thay đổi các yếu tố của nó và kết hợp các cách tiếp cận khác nhau theo nhiều cách mạnh mẽ. Ngôn ngữ này tập trung vào nhu cầu của con người, chứ không phải là máy tính.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Bất kỳ loại phần mềm nào cũng có thể được tạo ra với sự trợ giúp của Ruby, từ web đến các ứng dụng di động. Tuy nhiên, Ruby có thể được sử dụng cho nhiều mục đích khác nhau, nhưng nổi tiếng nhất vẫn là dùng để xây dựng các ứng dụng web. Ruby on Rails (RoR), một framework ứng dụng web mã nguồn mở được viết bằng Ruby, tập trung vào việc lập trình đơn giản nhưng hiệu quả. RoR được các lập trình viên yêu thích vì nó cung cấp cho họ các công cụ có sẵn giúp việc lập trình ứng dụng cực kỳ nhanh.

Ruby là ngôn ngữ lập trình hướng đối tượng. Trong Ruby, mọi giá trị, thậm chí là class, đều là đối tượng – object. Behavior mặc định có thể được sửa đổi bằng cách thêm các methods (phương thức) mới vào class và mở rộng các class tuỳ chỉnh. Ngoài ra, Ruby còn cho phép các lập trình viên sử dụng lại code và các đơn vị lập trình logic cho các dự án khác. Bên cạnh đó, lập trình hướng đối tượng đảm bảo tính kết hợp các đối tượng lại với nhau thành các mô đun để cấu trúc dự án trở nên rõ ràng hơn.

Ruby sử dụng trình thu gom rác là một hệ thống quản lý bộ nhớ tự động, do đó, lập trình viên không phải phân bổ bộ nhớ theo cách thủ công. Bên cạnh các tính năng hữu ích khác, Ruby còn có khả năng thích ứng cao và dễ dàng chấp nhận các bản cập nhật và bản phát hành mới.

Xem thêm việc làm ruby các vị trí

Python

Python được tạo ra bởi một lập trình viên người Hà Lan, Guido van Rossum. Được phát hành vào năm 1991, Python là ngôn ngữ lập trình đa năng nhất cho việc lập trình back-end. Python là một ngôn ngữ kịch bản mạnh mẽ (scripting language) cho phép bạn tạo các tập lệnh và thực hiện nó nhiều lần mà không cần tốn nhiều thời gian code.

Giống như Ruby, Python là một ngôn ngữ hướng đối tượng bậc cao. Triết lý mà Python tập trung nhiều nhất là khả năng đọc. Code Python cũng giống như nói chuyện tiếng Anh với nhau vậy, cú pháp của nó rất dễ sử dụng và rất đơn giản để đọc. Đó là lý do tại sao Python là ngôn ngữ tuyệt vơi nhất cho beginners. Python cũng có tiếng tăm trong giới những lập trình viên có kinh nghiệm, những người này thường sẽ chọn Python là ngôn ngữ thứ hai hoặc thứ ba để học.

>>> Xem thêm: Python Là Gì? Các Bước Tự Học Lập Trình Python

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Python được thiết kế cho các chương trình khoa học và học thuật. Nó có thể xử lý khá nhanh chóng các dữ liệu lớn và được sử dụng để lập trình các trang web nặng. Python là ngôn ngữ lập trình được ưu thích nhất cho trí tuệ nhân tạo, machine learning và các ứng dụng Robot. Python còn có thể được sử dụng để lập trình các ứng dụng di động.

Python là ngôn ngữ đa nền tảng mà không cần cài đặt (portable code). Điều đó có nghĩa là các lập trình viên có thể sử dụng code Python trên nhiều hệ điều hành (Linux, Windows, Mac, Unix) mà không cần phải thay đổi code.

Framework web mã nguồn mở, Django, khuyến khích việc lập trình nhanh chóng và sạch sẽ. Framework mạnh mẽ này được dùng để xây dựng một số trang web phổ biến như Spotify, Instagram và YouTube. Không có gì ngạc nhiên khi theo đánh giá PYPL của Github, Python là ngôn ngữ lập trình phổ biến nhất trong năm 2020.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

 Ruby vs Python: Những khác biệt chính

Như đã được đề cập, cả Ruby và Python đều là các ngôn ngữ kịch bản hướng đối tượng bậc cao thuộc thế hệ mới. Tuy nhiên, sự khác biệt chính giữa chúng là nằm ở triết lý đằng sau của mỗi ngôn ngữ.  Ruby nhằm mục đích làm các lập trình viên hài lòng với cú pháp thanh lịch và đẹp đẽ, trong khi nhiệm vụ chính của Python là làm cho mọi thứ trở nên rõ ràng với các lập trình viên. Ruby cung cấp cho các lập trình viên sự tự do và linh hoạt. Họ có thể giải quyết vấn đề bằng các phương pháp khác nhau, trong khi Python chỉ có một cách chính xác để giải quyết vấn đề. Các cách tiếp cận khác nhau làm cho Ruby và Python phù hợp với các loại ứng dụng web khác nhau.

Dưới đây là bảng so sánh sự khác biệt chính giữa Python và Ruby.

Ruby vs Python: Đâu mới là ngôn ngữ tốt hơn cho lập trình ứng dụng

Khi nào nên chọn Ruby?

Ruby sẽ là sự lựa chọn tuyệt vời cho các doanh nghiệp nhỏ và các công ty khởi nghiệp mong muốn lập trình các ứng dụng nhanh. Ruby rất hữu ích khi bạn có nhu cầu xây dựng một nguyên mẫu nhanh ngay cả khi dự án chưa được xác định rõ ràng và sẽ có các thay đổi trong tương lai. Nhìn chung, Ruby được khuyến nghị trong các trường hợp có thời gian ngắn và bị giới hạn về ngân sách.

Nếu bạn cần tìm các ví dụ cụ thể hơn về các loại ứn dụng được xây dựng tốt nhất với Ruby, thì đó là các trang web thương mại điện tử và phát nhạc trực tuyến. Shopify là một ví dụ đầy cảm hứng về giải pháp thương mại điện tử phức tạp được lập trình với sự trợ giúp của framework Ruby on Rails đã có mặt trên thị trường từ năm 2006 và là ngôi nhà chung cho hơn 800 ngàn của hàng trực truyến.

Framework Ruby on Rails hoàn toàn phù hợp với lập trình các ứng dụng web tuỳ chỉnh nhiều chức năng. Ruby còn có một trong những cộng đồng mạnh nhất, đảm bảo tài liệu đầy đủ và chính xác, kèm theo đó là một thư viện rộng lớn được gọi là Ruby gems. Chúng cung cấp các chức năng đặc biệt cho các ứng dụng Ruby và tăng tốc mọi giai đoạn trong quá trình lập trình.

Đồng thời, bạn phải nhớ rằng Ruby không phải là lựa chọn tốt nhất để tạo ra các ứng dụng web đòi hỏi phải kiểm soát toàn bộ kiến trúc sản phẩm, modules chương trình hoặc tích hợp dữ liệu.

Khi nào nên chọn Python?

Python sẽ là lựa chọn tốt hơn cho các giải pháp và ứng dụng khoa học phức tạp trên cloud. Nó cũng được sử dụng để lập trình các ứng dụng có quy mô theo chiều ngang. Các ứng dụng như vậy giúp quản lý khối lượng công việc thay đổi thường xuyên.

Xây dựng các ựng dụng với Python, có thể vượt xa các dự tích lập trình web ban đầu so với khi sử dụng Ruby. Bởi vì Python được sử dụng trong các ngành công nghiệp khác nhau, từ khoa học dữ liệu đến robot. Đó là lý do tại sao cộng đồng Python là một trong những cộng đồng đa dạng nhất. Trên Stack Overflow, cộng đồng trực tuyến lớn nhất và đáng tin cậy nhất dành cho các lập trình viên, có hơn 1.455.817 câu hỏi về Python.

>>> Xem thêm: Python cơ bản cho ứng dụng trong công việc

Python, kết hợp với thư viện TensorFlow, đơn giản hoá đáng kể việc lập trình các giải pháp dựa trên AI vì nó có các thuật toán machine learning tích hợp. Python cũng được sử dụng rộng rãi trong xử lý và phân tích dữ liệu. Nó đặc biệt hữu ích trong phân tích âm thanh và video nhờ khả năng hiển thị dữ liệu và khả năng sắp xếp dữ liệu của nó.

Xem thêm tuyển dụng python các vị trí

Kết luận

Sẽ là không công bằng khi tuyên bố đâu mới là người chiến thằng. Cả hai đều là ngôn ngữ bậc cao mạnh mẽ được các lập trình viên yêu thích. Tuy nhiên, bạn phải nhớ rằng Ruby và Python phù hợp với các loại ứng dụng khác nhau. Nếu bạn đang có kế hoạch lập trình các trang web và ứng dụng dữ liệu nặng với các yếu tố có machine learning, hãy chọn Python. Trong trường hợp, bạn muốn lập trình ứng dụng web nhanh, Ruby sẽ là sự lựa chọn tuyệt vời.

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

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

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

Tips tạo dấu ấn cho CV ứng viên ngành IT

CV IT Developer
CV IT Developer

Bạn đã biết cách tạo một CV ấn tượng để ghi điểm với nhà tuyển dụng hay chưa? Một CV IT Developer liệu có được đảm bảo các nội dung và format đúng chuẩn? Nếu bạn là ứng viên trong lĩnh vực CNTT, đừng bỏ qua bài viết! TopDev sẽ chia sẻ cho bạn những mẹo giúp tạo dấu ấn đặc biệt đối với nhà tuyển dụng.

Chú trọng đến sự trải nghiệm gián tiếp

Nếu là những người mới, có thể chiếc CV cho sinh viên IT mới ra trường (CV IT student) dường như còn quá “non” để đủ sức cạnh tranh. Tuy nhiên, kinh nghiệm nhiều hay ít không quan trọng. Bạn vẫn có thể tạo được lợi thế nếu có sự chuẩn bị khoa học nhất.

CV IT Developer
Cách ứng viên nhận biết về sự trải nghiệm của bản thân rất quan trọng.

Thách thức lớn nhất đối với các ứng viên nằm ở vấn đề kinh nghiệm. Thế đâu là giải pháp hoàn hảo cho việc xoay chuyển các thách thức này? 

Nếu là một ứng viên mới, đừng e ngại về năng lực. Bạn hãy liệt kê những công việc tình nguyện, hoặc các dự án về công nghệ mà bạn/team đã thực hiện, cộng tác,… Ngoài ra, nếu có các sản phẩm khoa học về ngành IT hay đã từng thực tập; làm báo cáo về một vấn đề chuyên sâu nào đó thuộc lĩnh vực IT, hãy tự tin chia sẻ với nhà tuyển dụng.

Đó được gọi là trải nghiệm gián tiếp. Tức sự cộng hưởng về mức độ am hiểu của ứng viên về một khía cạnh có liên quan đến việc giải quyết các vấn đề mà nhà tuyển dụng đặt ra. 

Bạn phải tin rằng bạn đang dẫn dắt nhà tuyển dụng đi đúng hướng. Đồng thời, sự lựa chọn thông minh từ các trải nghiệm cá nhân sẽ phản ánh tính xác thực; khả năng phân tích về kiến thức và tiềm năng phát triển của bạn.

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

Gợi nguồn tương tác thông tin bổ sung

Thông qua các tài khoản mạng xã hội, nhà tuyển dụng sẽ biết về bạn rõ hơn. Đồng thời, có những đánh giá chính xác hơn dựa trên các tài nguyên ấy. Một số tài nguyên phản ánh rõ cá tính cảu bạn như Facebook, Linkedin, Instagram,… 

CV cho sinh viên IT mới ra trường
Kênh truyền thông mạng xã hội của ứng viên là yếu tố khai thác hiệu quả cá tính của ứng viên.

Bạn là ứng viên tích cực? Sở hữu cá tính hướng nội hay hướng ngoại? Bạn quan tâm đến các vấn đề, lĩnh vực chuyên sâu nào? Chúng đều có ý nghĩa lớn trong việc khoanh vùng ứng viên tiềm năng. Do vậy, hãy chia sẻ các nguồn thông tin với nhà tuyển dụng. Điều này giúp gợi cho họ các minh chứng thể hiện bạn xứng đáng với vị trí ứng tuyển.

Đặc biệt nếu bạn ứng tuyển các vị trí ngành IT của các công ty lớn, ngoài CV IT tiếng Anh (CV English IT), việc bổ sung các kênh mạng xã hội có ý nghĩa quan trọng. Hãy lưu tâm điều này và tận dụng lợi thế từ mạng xã hội một cách khôn ngoan nhất.

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

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

Văn phong ngôn ngữ thật sự là điểm nhấn!

Nếu một CV sở hữu cách định dạng  – bố cục trình bày (format và visual), tổ chức nội dung (content) đầy đủ, thu hút thì chưa chủ để tạo nên một CV IT chuyên nghiệp. Điểm nhấn quan trọng nhất nằm ở văn phong ngôn ngữ. 

cv it tiếng anh
Văn phong ngôn ngữ có giá trị quan trọng đối với chất lương CV IT.

Không một nhà tuyển dụng nào dành 5 phút để đọc một CV chứa các câu cú dài ngoằn, phức tạp. Thậm chí, cách viết quá hời hợt, không có sự hiểu biết về văn viết cơ bản sẽ khiến CV của bạn bị out ngay lập tức.

Cách diễn đạt trong CV cần rõ ràng, tránh mơ hồ và thiếu khả thi. Chẳng hạn, bạn ứng tuyển vị trí về Mobile App Developer, thì tính tư duy mạch lạc trong CV IT Developer được nhà tuyển dụng rất quan tâm. Đừng biến CV của bạn trở nên khó đọc, khó hiểu và không có giá trị.

Hãy đọc lại thông tin trong CV để chắc chắn rằng nội dung đều được liên kết với nhau một cách tốt nhất. Chính việc kiểm tra sẽ giúp CV của bạn chỉn chu hơn.

Một điều quan trọng nữa là bạn có thể cập nhật những nội dụng mới. Đâu là điểm mạnh – điểm yếu để định hướng truyền tải nội dung trong CV IT Developer một cách hợp lý. CV cần được bạn update lại nếu bạn có những thay đổi tốt hơn trong hành trình nghề nghiệp. Đó có thể là các kinh nghiệm mới, các dự án với quy mô lớn hơn. Hãy đầu tư cho CV để sẵn sàng cho cuộc chơi tuyển dụng bất cứ lúc nào!

Lời kết

Một CV IT ấn tượng sẽ giúp gia tăng cơ hội ứng tuyển của bạn. TopDev mong rằng với những tip vừa chia sẻ, bạn đọc sẽ có những thong tin bổ ích. Hãy xem xét về nội dung, hiệu chỉnh về format để CV của bạn thật xịn xò, đủ sức tạo được dấu ấn riêng của bản thân. Đặc biệt, bạn cần lưu các đặc trưng riêng từng vị trí, ví dụ như CV IT Developer để có cách triển khai nội dung CV IT phù hợp. Chúc bạn thành công!

Học AI tại Phần Lan, tại sao không?

Học Trí tuệ nhân tạo – Artificial Intelligence (AI) đã và đang góp phần không nhỏ trong việc giúp chúng ta thêm hiểu về thế giới và xây dựng tương lai tốt đẹp hơn. AI tác động tích cực đến xã hội từ sản xuất đến giao thông, năng lượng, chăm sóc sức khỏe, kinh tế và cả những thách thức từ môi trường.

Không chỉ thế giới đón nhận những tiến bộ của AI, tại thị trường Việt Nam cũng đang ghi nhận nhu cầu tuyển dụng nhân lực lĩnh vực này. Có thể nói, đây là thời điểm không thể nào thích hợp hơn để học về AI, cũng như trở thành chuyên gia về nó.

  Trải nghiệm giáo dục Phần Lan cùng Hội thảo Khoa học Việc làm: Future Is Made In Finland
  Hội thảo Khoa học Việc làm - Webinar Series: Future Is Made In Finland

Tiếp thu kiến thức thực tế nhất về AI tại Phần Lan

Không những là quốc gia nổi tiếng về chiếc nôi giáo dục, Phần Lan còn đặt mục tiêu trở thành một trong những quốc gia đi đầu trong việc ứng dụng AI. Trung tâm Trí tuệ Nhân tạo Phần Lan tập hợp nhiều ngành khoa học, lĩnh vực kinh doanh, sáng kiến đổi mới giáo dục và xã hội cho cuộc cách mạng AI. Trong đó, các nhà khoa học và doanh nghiệp cùng hợp tác phát triển và khai thác AI giúp nhân loại giải quyết những thách thức hiện thời của thời đại. 

Episode 5: Get REAL, AI!

Tiếp nối chuỗi hội thảo Webinar Series: Future is made in Finland, episode 5 của chương trình sẽ diễn ra vào ngày 11/11/2020 lúc 17h với tên gọi Get REAL, AI!, tổ chức bởi Finnish Center for Artificial Intelligence, FCAI, điều phối bởi tiến sĩ Patrik Floréen, Giám đốc, hợp tác quốc gia và quan hệ đối ngoại FCAI, Helsinki University.

Theo dõi chương trình để tìm hiểu bạn có thể làm gì để tạo ra REAL AI cho Real People – AI thật cho Việc thật trong cộng đồng tiên tiến tại Phần Lan. Qua các cuộc thảo luận từ những nhà khoa học và chuyên gia hàng đầu, hội thảo lần này giới thiệu các cơ hội học tập, nghiên cứu, làm việc và hợp tác tại Phần Lan.

Timeline EP 5: Get REAL, AI tại chuỗi hội thảo

  • 17:00 – 17:05: Giới thiệu chương trình
  • 17:05 – 17:30: THE REAL AI IS MADE HERE! REAL AI FOR REAL PEOPLE IN THE REAL WORLD: được trình bày bởi Ms. Samuel Kaski, Giáo sư ngành Khoa học Máy tính, Aalto University và Giám đốc tại Finnish Center for Artificial Intelligence
  • 17:30 – 17:45: BECOME A REAL AI EXPERT OF FUTURE: Mr. Teemu Roos, Giáo sư ngành Khoa học Máy tính, Helsinki University và là Leader của chương trình AI Education tại Finnish Center for Artificial Intelligence
  • 17:45 – 17:55: Giải lao
  • 17:55 – 18:05: STUDYING AND WORKING IN REAL AI IN FINLAND: Milica Todorović, Research fellow, Aalto University
  • 18:05 – 18:25: CONQUERING CURRENT AND FUTURE PROBLEMS WITH REAL AI: Nidhi Singh, Director of Research, Elisa Corporation
  • 18:25 – 18:30: Kết thúc

Tìm hiểu chi tiết thông tin về chuỗi Hội thảo và đăng ký ngay tại: https://www.studyinfinland.fi/future-is-made-in-finland/webinar-series-programme/episode-v-get-real-ai