Cảm ơn bạn đã đọc và ủng hộ blog KTMT ʘ‿ʘ Từ bây giờ chúng tôi sẽ là kipalog.com !

Chắc hẳn là một unix user (có thể mac os hay linux), lại là một programmer, bạn sẽ phải hàng ngày sử dụng terminal cho việc lập trình, quản lý source, monitoring hệ thống…. Và đã là người sử dụng terminal hàng ngày thì cái bạn phải nhìn thấy nhiều nhất chính là cái gọi là “Command prompt”

Cái command prompt này thì tùy thuộc vào shell bạn đang dùng (bash hay zsh..) mà sẽ có những cách tùy chỉnh khác nhau. Mình thì đang dùng bash (chắc một ngày gần đây sẽ chuyển qua zsh), nên bài viết này sẽ áp dụng chủ yếu ở trên bash. Command prompt ở trên bash thì gồm có 4 biến môi trường (environment variable) chính: PS1, PS2, PS3, PS4 (Ngoài ra còn có COMMAND_PROMPT nữa nhưng thằng này na ná PS1 nên mình không đề cập đến). Để sử dụng các biến môi trường này thì bạn chỉ cần:

export export.sh
1
export PS1 = "abcxyz"

hoặc đặt đoạn code đó vào ~/.bash_profile hoặc ~/.bashrc rồi

export export.sh
1
source ~/.bash_profile

để shell load lại các setting trong file tương ứng là biến môi trường đã được set.

Dưới đây mình sẽ nói về việc sử dụng các biến môi trường này để biến cái command prompt của bạn trở nên màu mèthân thiện hơn. Về thứ tự thì mình sẽ nói về cái có độ tùy biến thấp đến cao

PS2

Trong 5 biến mình nói ở trên thì biến PS2 là thằng nhàm chán nhất. PS2 gọi là Continuation interactive prompt. Tại sao lại gọi như vậy thì: khi một câu lệnh unix quá dài thì bạn thường dùng kí hiệu “\” ở cuối dòng để làm cho câu lệnh đấy thành multiple-line (gõ được ở nhiều dòng). Và PS2 là biến quyết định cái gì được in ở đầu mỗi dòng đó

Cách sử dụng thì vô cùng đơn giản:

export export.sh
1
export PS2="continue here -> "

Và kết quả là:

Chắc bạn cũng đã hình dung ra cách dùng PS2 thế nào rồi nhỉ, và hẳn bạn đang nghĩ, biến này chả có gì thú vị lắm nhỉ, mình cũng nghĩ thế :D. Thế nên chúng ta qua thằng tiếp theo nhé: PS3

PS3

PS3 gọi là biến dùng cho việc “select inside shell script” Giả sử bạn phải viết một đoạn script cho lựa chọn (ví dụ như bạn làm infra, phải viết script kiểu như: hãy chọn giữa install rvm hay rbenv chẳng hạn).Thì chắc đoạn script đó sẽ trông như sau:

select select.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
==> code
echo "Select your option:"
select i in 1) 2) 3)
do
  case $i in
    x)....
    y)....
    z)....
  esac
done

==> run
# /.select.sh
x)....
y)....
z)....

#? 1
x)

Như các bạn thấy, prompt để lựa chọn khi không có setting gì sẽ là không hiện gì, quite boring Giờ nếu chúng ta chỉ cần setting PS3 cho đoạn code đó như sau

select select.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
==> code
PS3="Select an option of installer (1-3): "
select i in 1) 2) 3)
do
  case $i in
    x)....
    y)....
    z)....
  esac
done

==> run
# /.select.sh
x)....
y)....
z)....

#? Select an option of installer (1-3): 1
x)

Như vậy là chúng ta sẽ có một cái prompt có hiện gì, use case để dùng thì chắc trong phần lớn các trường hợp sẽ là để cung cấp thông tin cho user về các option lựa chọn phía dưới. PS3 có vẻ khá useful trong một số case nhất định đúng không :D, tiếp theo chúng ta sẽ đến với PS4

PS4

Khi execute một đoạn script mà bạn muốn tracking output (để debug chẳng hạn), bạn sẽ dùng {set -x} để làm việc đó. ví dụ như đoạn code ở dưới đây:

tracking tracking.sh
1
2
3
4
5
6
7
8
9
10
11
==> code tracking.sh
set -x
ls -all -lrt | grep xyz
pwd

==> run
++ ls -all -lrt
++ grep xyz
drwxr-xr-x   2 doxuanhuy  staff   68 Apr 28 11:45 xyz
++ pwd
/Users/doxuanhuy/cur-project/android-globalit

Như các bạn thấy, {set -x} sẽ output ra các câu lệnh được execute và prefix bằng cái “++”. 2 kí tự này có vè không thể hiện được gì nhỉ, và với PS4, bạn có thể thêm thông tin hữu ích cho việc debug như line number thông qua biến $LINENO, hay function name thông qua biến $FUNCNAME, hay script name thông qua biến $0

tracking tracking.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
==> code tracking.sh
export PS4='$0.$FUNCNAME $LINENO '

set -x
somefunction() {
    ls -all -lrt | grep xyz
      pwd
}
somefunction

==> run
../test.sh. 8 somefunction
../test.sh.somefunction 5 ls -all -lrt
../test.sh.somefunction 5 grep xyz
drwxr-xr-x   2 doxuanhuy  staff   68 Apr 28 11:45 xyz
../test.sh.somefunction 6 pwd
/Users/doxuanhuy/cur-project/android-globalit

Như vậy chúng ta đã có những thông tin khá hữu ích để debug đúng không. Và tiếp theo chúng ta sẽ đi đến bộ đôi thú vị nhất trong ngày: PS1 và COMMAND_PROMPT

PS1

Đây chính là biến quyết định cái gì sẽ hiện lên ở command prompt, và là biến có nhiều cái để hack nhất trong các loại PSx

Đầu tiên chúng ta sẽ nói về PS1 Giả sử chúng ta muốn command prompt hiện lên Username, Hostname và full-path đến directory hiện tại, đơn giản chúng ta chỉ cần

PS1 PS1.sh
1
export PS1="\u@\h \w> "

Ở đây à Username, là Hostname và là full path của current dir. Như vậy chúng ta sẽ có 1 cái prompt như dưới đây

PS1 PS1.sh
1
doxuanhuy@xxx ~/cur-project/android-globalit>

Quite easy phải không :D Hay hơn chút nữa, bạn muốn hiện thêm current time, lên prompt, rất đơn giản:

PS1 PS1.sh
1
export PS1="\$(date +%k:%M:%S) \w> "

Ở đây (date +%k:%M:%S) là để format date và biến nó thành variable thông qua $

Và kết quả là

PS1 PS1.sh
1
12:23:59 ~/cur-project/android-globalit>

Ngoài ra còn rất nhiều cái bạn có thể cho vào command prompt để biến nó thêm phần phong phú như:

  • !: The history number of the command
  • $kernel_version: The output of the uname -r command from $kernel_version variable
  • $?: Status of the last command

Hacking thêm chút nữa, bạn có thể thay đổi màu của từng phần trên command prompt thông qua 3 metacharacter sau:

  • [ - Indicates the beginning of color prompt ( giống như cái “^” của regex vậy)
  • x;ym - Indicates color code. Use the color code values mentioned below ( bạn đặt x;ym ở trước node nào thì node đó sẽ được colorize theo màu đó)
  • [m - indicates the end of color prompt (giống như cái “$” của regex)

Một ví dụ đơn giản:

PS1 PS1.sh
1
export PS1="\e[0;34m\u@\h \w> \e[m"

Đoạn code trên có nghĩa là gì:

Hacking thêm một chút nữa, bạn hiện là một developer đang sử dụng git với rất nhiều repo, rất nhiều branch. Mỗi lần vào một repo nào đấy bạn lại phải {git branch} để xem bạn đang ở branch nào, bất tiện vô cùng. Bạn muốn prompt của bạn sẽ hiện branch name mỗi khi bạn vào folder của một repo nào đấy? Thật đơn giản, với backquote để execute bash command và sự trợ giúp của sed, bạn làm điều đó thật đơn giản:

PS1 PS1.sh
1
export PS1='\e[0;36m\u⌘ \e[0;35m\W \e[0;33m`git branch 2> /dev/null | grep -e ^* | sed -E  s/^\*\ \(.+\)$/\(\1\)\ /`\e[m\]'

Trông có vẻ đáng sợ, nhưng thực ra lại rất đơn giản :D, Chúng ta sẽ đi từng phần nhé:

  • [ : start của command prompt
  • [0;36m : bạn tô màu phần user ( bởi 0;36m (màu xanh dương) và thêm vào đằng sau cái kí tự ⌘ (cho cool thôi :D)
  • [0;35m: bạn tô màu phần directory hiện tại () bởi 0;35m (màu hồng)
  • [0;33m : tô màu toàn bộ phần đằng sau bởi màu 0;33m (màu vàng)
  • git branch 2> /dev/null | grep -e ^* | sed -E s/^\* (.+)$/(\) /: nguyên văn đoạn này sẽ như sau: đầu tiên bạn dùng “git branch” để lấy branch hiện tại. Trong trường hợp không ở trong git repo nào thì sẽ có lỗi ra stderr, bạn redirect cái lỗi này vào dev/null thông qua “2> /dev/null” để nó không hiện ra prompt (2 là stderr). Sau đấy bạn tìm line nào có * ở đầu (current git branch) thông qua việc pipe vào grep. Tìm được line đó rồi thì bạn sẽ tách phần đằng sau dấu * ra thông qua sed , và output phần đó ra ngoài với format (branch) thông qua $/(). Tất cả đoạn code này được để vào backquote để được execute trực tiếp mỗi khi PS1 được gọi. Và kết quả thật bất ngờ:

Looks so cool!! Ngoài ra bạn còn có rất nhiều thứ có thể hacking với PS1 như:

  • the number of jobs currently managed by the shell
  • # the command number of this command
  • the basename of the shell’s terminal device name ….. mà bạn có thể tham khảo ở đây: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/

Ending

Như vậy với PS[1-4], bạn đã có thể customize command prompt của bạn trở nên đẹp đẽ hơn, cool hơn và useful hơn. Trong các bài viết sắp tới mình sẽ nói về việc sử dụng các công cụ rất mạnh của unix family os như grep, sed, wc để giúp cho công việc development của bạn trở nên thú vị hơn :D. Happy hacking!

Mở đầu

Bạn đang say sưa hacking code và bắt gặp một hàm với những con số bí ẩn như ở dưới đây:

fbc.c
1
2
3
4
5
6
7
8
9
int fbc(unsigned int data)
{
        data = (data & 0x55555555) + ((data >> 1) & 0x55555555);
        data = (data & 0x33333333) + ((data >> 2) & 0x33333333);
        data = (data & 0x0F0F0F0F) + ((data >> 4) & 0x0F0F0F0F);
        data = (data & 0x00FF00FF) + ((data >> 8) & 0x00FF00FF);
        data = (data & 0x0000FFFF) + ((data >> 16) & 0x0000FFFF);
        return data;
}

Chắc hẳn bạn sẽ không khỏi hét lên: “what the fuck! Không hiểu gì hết” khi nhìn đoạn code này. Bạn hoàn toàn không hiểu mục đích của nó. Tên hàm không cho bạn một thông tin nào hữu ích. Những con số bí ẩn cùng phép toán >>, &, + làm bạn rối.

Nếu tôi nói với bạn fcb có nghĩa là “fast bit count” và hàm trên trả về số bit 1 của 1 số 32 bit (unsigned int trong C), tôi cá chắc chắn bạn sẽ không khỏi hoài nghi. Vậy chúng ta hãy thử biên dịch chương trình và test thử hàm này. Tôi viết chương trình như dưới đây để test hàm fbc.

test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <assert.h>

int fbc(unsigned int data)
{
        data = (data & 0x55555555) + ((data >> 1) & 0x55555555);
        data = (data & 0x33333333) + ((data >> 2) & 0x33333333);
        data = (data & 0x0F0F0F0F) + ((data >> 4) & 0x0F0F0F0F);
        data = (data & 0x00FF00FF) + ((data >> 8) & 0x00FF00FF);
        data = (data & 0x0000FFFF) + ((data >> 16) & 0x0000FFFF);
        return data;
}

int main()
{
        int ans;
        ans = fbc(5);
        assert(ans == 2);  // 5 = 101b
        ans = fbc(198123);
        assert(ans == 10); // 198123 = 110000010111101011b
        return 0;
}

Kết quả chạy:

$ gcc -o test test.c
$ ./test
$ echo $?
0

Chương trình chạy bình thường, cho kết quả bằng 0 chứng tỏ hàm fbc trả về giá trị như ta mong muốn.

Bạn sẽ thắc mắc: Tại sao hàm này lại có thể đếm được số bit 1? Chúng ta hãy cùng tìm hiểu cơ chế đếm của hàm này.

Cơ chế

Để có thể hiểu tại sao hàm này trả về số bit 1, ta hãy thử xem các con số 0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF và 0x0000FFFF có ý nghĩa gì.

Bằng cách ấn máy tính, đổi từ hệ 16 sang hệ 2, ta có giá trị nhị phân của các số trên như bảng dưới đây:

0x55555555      01010101010101010101010101010101   
0x33333333      00110011001100110011001100110011     
0x0F0F0F0F      00001111000011110000111100001111    
0x00FF00FF      00000000111111110000000011111111   
0x0000FFFF      00000000000000001111111111111111   

Ta nhận thấy các con số trên không hoàn toàn bí ẩn mà nó hoàn toàn có quy luật. Từ trên xuống dưới, các bit 1 xen kẽ nhau theo chu kỳ 1, 2, 4, 8, 16.

Ta thử quay lại hàm fbc và xem cách con số này được sử dụng. Vì số 0x55555555 lên đến 32 bit nên rất khó theo dõi (nhiều 0 với 1 quá @.@), ta sẽ thử xét trường hợp số 8 bit với bit pattern không đổi (tức là số 0xFF). Dòng 1 của hàm fbc sẽ như dưới đây:

    data = (data & 0x55) + ((data >> 1) & 0x55);

Giả sử data = 10110011b, ta sẽ có: data = 10110011 & 01010101 + ((10110011 >> 1 & 01010101)

“Dễ dàng” nhận thấy chuỗi bit của 0xFF có các bit 1 ở vị trí chẵn (0, 2, 4…) do vậy bằng cách & data với 0xFF, ta đã loại trừ các bit 1 ở vị trí lẻ (1,3,5…). Do vậy kết quả của data & 0x55 sẽ cho ra các bit 1 ở vị trí chẵn. Bằng cách dịch 1 bit của data, ta chuyển các bit từ vị trí lẻ sang vị trí chẵn, và lại & với 0xFF, do đó đại lượng sau dấu cộng sẽ có các bit 1 ở vị trí chẵn. Kết quả của phép cộng sẽ cho ra số lượng bit ở vị trí lẻ và vị trí chẵn

Lần tính 1 data & 01010101 00 01 00 01
(data >> 1)& 01010101 01 01 00 01
01 10 00 10

Do kết quả tối đa của phép + này là 2, khả năng kết quả phép cộng “tràn sang” vùng bit bên cạnh là không có. Sau lần tính thứ nhất, ta có kết quả của số bit 1 của cặp đôi bit cạnh nhau.

Tất nhiên ở đây ta vẫn chua có kết quả số bit. Tuy nhiên ta sẽ áp dụng phương pháp tương tự cho cụm 4 bit.

Nhìn dòng thứ 2 đoạn code bạn sẽ thấy: …1100110011b: 2 bit đan xen! Phép dịch bit bây giờ là >> 2.

Lần tính 2 data & 00110011 00 10 00 10
(data >> 2)& 00110011 00 01 00 00
00 11 00 10

Như vậy ta có 4 bit đằng sau có tổng số bit là 2, 4 bit đâu có tổng số bit là 11 (3 trong hệ thập phân)!!!

Áp dụng cách tính tương tự, ta có kết quả như ở dưới.

Lần tính 3 data & 00001111 00 00 00 10
(data >> 4)& 00001111 00 00 00 11
00 00 01 01

Kết quả là 5, chính là số bit của data ban đầu!!

Để tính số bit của 1 số 32 bit, ta chỉ việc tăng số bit của các “magic number” lên. Đấy là lý do ta có các số 0x55555555, 0x33333333, …

Đến đây chắc hẳn bạn đã hiểu tại sao hàm fbc trả về số bit 1.

Tổng kết

Hy vọng với giải thích trên, bạn đã hiểu ý nghĩa sâu sắc đằng sau hàm fbc. Bạn sẽ vẫn hét “What the fuck!!!” nhưng lần này cho sự tuyệt vời không những cho sự ngắn gọn, tinh tế của đoạn code.

Tham khảo

  1. bithacks
  2. assembly book
  3. Programming groundup
Comments

Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì happy programmer là những programmer(lập trình viên), có khả năng kiếm được tiền và sống tốt bằng việc lập trình, họ training liên tục để trở thành better programmer, và họ hạnh phúc với cuộc sống như vậy. Nếu bạn đã và đang là một programmer, có nhiều lý do để bạn nên happy với việc đấy. Lý do là:

  • Lý do đầu tiên là không happy thì bạn sẽ không làm được gì cả, đơn giản là vậy thôi. Bạn làm công việc gì cũng vậy, nếu bạn cảm thấy không thoải mái với nó thì tốt nhất là không nên làm, mỗi người chỉ có một cuộc sống, đừng phí thời gian làm những gì bạn không thích.

  • Lý do thứ hai, bạn có biết là programmer là một trong số hiếm các ngành bạn được làm đúng cái bạn được học ra, và có thể kiếm tiền đủ sống với nó (Định nghĩa đủ sống của mình là đủ ăn no, tiêu không phải dè sẻn, đủ để thi thoảng đi du lịch, để thi thoàng mua sắm, tính theo tiền Việt với mình cứ lương tầm 1k2 trở lên mình gọi là đủ sống). Tất nhiên để có cái đủ sống đó thì bạn không thể là một average programmer, ít ra bạn phải là một người có kĩ năng tương xứng.

  • Lý do thứ ba, với mình là một người không thích cuộc sống nhàm chán, thì cái nghề lập trình là cái nghề mà mỗi ngày đều có cái để mình suy nghĩ, để giải quyết. Niềm vui lớn nhất của mình là có vấn đề, giải quyết, và đem solution đi khoe với thằng đồng nghiệp, rồi nó tròn mắt ra thán phục, kể cũng sướng.

Với từng đấy lý do thì chắc các bạn có thể thấy là, trở thành một happy programmer là một điều nên làm, đúng không :D. Chắc nhiều bạn thắc mắc mình có chỗ đứng thế nào mà lại khuyên bảo các bạn. Mình không kiếm nhiều tiền, và cũng không nổi tiếng, do đấy mình không thể khuyên bảo bất kì ai.Mình chỉ muốn chia sẻ là mình đang cực kì happy với việc mỗi ngày được code cái gì đó useful, tìm hiểu thêm được về công nghệ mới, bàn luận về thuật toán với mấy thằng bạn :D

Hơi lạc đề một chút, thực trạng IT ở Việt Nam đang làm chúng ta không có nhiều happy programmer, hay đúng hơn là chỉ có một số ít programmer cảm thấy happy với công việc, mức lương và luôn cố gắng để hoàn thiện kĩ năng bản thân. IT Việt Nam hiện nay theo mình đang chia làm 2 mảng chính Start-up và Outsource. Ở bên Start-up với lực lượng chính là các venture (và một số các ông lớn như VNG) có vẻ xuất hiện nhiều happy programmer hơn, mình chỉ biết sơ sơ về mảng này thông qua một vài người bạn, nên không dám nhận xét nhiều. Còn ở bên mảng Outsource, cái mảng mà đang chiếm phần lớn tỉ trọng trong mảng IT VN, thì thực trạng tỉ lệ công việc nhàm chán cao, không yêu cầu kĩ năng, cộng với tầm nhìn công nghệ hạn hẹp của các ông chủ thì đang có thực trạng là các lập trình viên thường chăm chăm nhảy lên project manager. Việc đấy không có gì là sai cả, hoàn toàn đúng là khác, chỗ nào lương cao hơn, ta nhảy lên chỗ đó, là mình mình cũng làm thế. Cái sai ở đây là cái sai của những người lãnh đạo, mình nghĩ họ là những người không có tầm nhìn (đặc biệt là tầm nhìn về mặt công nghệ), họ có thể kiếm được tiền, rất nhiều tiền (có thể hàng chục tỉ, hàng trăm tỉ) nhưng cái đó chắc không còn lâu nữa, khi mà cái thị trường lao động rẻ màu mỡ VN không còn là duy nhất, và không còn chỗ để khai thác. Chính vì vậy nếu bạn là một người làm outsource, mà không cố để trở thành một happy programmer ngay khi còn có thể, thì không lâu nữa chắc mình sẽ gặp lại bạn ở đầu dốc Bưởi :D. Mình sẽ nói về outsource Việt Nam trong một bài khác.

Quay lại vấn đề chính, hiện tại cá nhân mình thấy mình đang là một happy programmer :D. Tuy nhiên việc duy trì cái sự happy đấy đòi hỏi mình phải làm theo một số rule và duy trì một nhịp sống để luôn keep high motivation. Dưới đây là những cái mình đã và đang thực hiện hàng ngày,đó cũng là những rule chung mà nếu ai có điều kiện cũng nên thử làm, mình nghĩ nó sẽ ít nhiều có ích cho các bạn :

  • Stay healthy: Một trong những đặc điểm chung của nerdy là sinh hoạt cực kì thiếu điều độ. Có một thời gian dài mình toàn ngủ lúc 4h, dậy lúc 12h, cho đến gần đây mình mới nhận thấy là sinh hoạt điều độ (ngủ lúc 12h, dậy 8h30, ngồi đọc sách, code một tí, ăn cơm, lên trường, tối về đúng giờ, ăn cơm đúng giờ, code một tí, đi ngủ) đem lại cho mình khả năng tập trung tốt hơn hẳn, và cũng đớ hẳn một số cảm giác khó chịu trước hay gặp như đầy bụng, buồn ngủ…

  • Embrace the uncomfortable: sẵn sàng làm những việc không thoải mái cũng là những việc nên tập. Một ví dụ đơn giản nhất là làm unit-test. Đợt mới làm việc mình cực ghét unit-test (cũng một phần tại chỗ mình làm unit-test thiếu chuyên nghiệp quá). Kết quả thì là code bug , và khi code có thay đổi lớn về kiến trúc, không có unit-test thì chắc bạn chỉ có khóc, bạn sẽ không biết đoạn nào chạy đoạn nào không. Do đấy việc cố làm những gì mình cảm thấy không thoải mái vừa là một cách rèn luyện mình, mình tin là khi làm rồi bạn sẽ không còn cảm thấy việc gì là uncomfortable nữa.

  • Learn a new programming language: Nhiều bạn chắc sẽ tự nghĩ, ngôn ngữ lập trình thì mình biết cả thùng, từ c, cpp, java, perl, python… Bạn nào nghĩ thế chắc nên đọc lại http://norvig.com/21-days.html của peter norvig. Học một ngôn ngữ mới, mình định nghĩa hiểu về ngôn ngũ đấy khi bạn có thể viết được một cái gì đấy useful bằng ngôn ngữ đó, một cái web crawler, một con chat-bot, một cái web,…, bạn hiểu ngôn ngữ đấy về mặt bản chất (vd như js thì ít ra phải hiểu prototype programming, module pattern, hay ruby thì hiểu metaprogramming, ruby vm,… python thì chí ít cũng nắm được cái decorator nó là cái gì, hay là new-style class với old-style class khác nhau thế nào). Học ngôn ngữ mới giúp bạn có cái nhìn rộng hơn, làm đầu óc bạn flexible hơn. Cá nhân mình thì thấy khi đã hiểu kĩ imperative programming thì bạn nên đọc thêm về declarative programming( ví dụ như haskell hay scala(functional programming) hay prolog(logic programming))

  • Automate: automate là kĩ năng không thể thiếu của bất kì programmer nào. Bản chất của programmer là phải lazy and dumb. Lý do tại sao thì bạn tham khảo tại http://www.codinghorror.com/blog/2005/08/how-to-be-lazy-dumb-and-successful.html. Automate là bước đầu hiện thực hóa của lazy. Bạn phải gõ đi gõ lại một thứ, phải click đi click lại một thứ mà bạn vẫn miệt mài ngồi làm thì chắc bạn nên bỏ nghề đi thôi :D. Hãy viết tool automate bất cứ cái gì có thể.

  • Learn more mathematic: Cái này thì không áp dụng với tất cả mọi người. Có 2 type of computer programmer: computer scientist và computer engineer. Computer scientist sẽ làm những công việc có hàm lượng “science” cao hơn một chút, như physic engine, compiler optimizer hay data mining, hoặc pattern recognition.. Còn computer engineer sẽ làm thiên về technical, họ sẽ có rất nhiều trick để làm chương trình chạy nhanh hơn, có rất nhiều kĩ năng để làm một hệ thống robust. Đi theo hướng nào là tùy career path của từng người. Cá nhân mình thì mình thích có tí gì đó thiên về khoa học, do đấy những kĩ năng về probabilistic, matrix algebra, linear algebra là phải có. Và toán là một trong những kĩ năng không thể nhồi ngay được, nên bắt buộc bạn phải học mỗi ngày, hay mỗi tuần một chút một. Nếu bạn không có chút interest nào với toán thì bạn có thể thay toán bằng algorithm, thi thoảng lên topcoder hay project euler ngồi làm cũng giúp bạn có kĩ năng tốt hơn để giải quyết công việc hàng ngày :).

  • Focus on security: Rất nhiều app developer thiếu những kĩ năng về security cơ bản, đặc biệt là web app với những xss hay sql injection, cho đến khi bị tấn công thì mới ngớ người ra. Ngay cả developer ở những tập đoàn lớn như facebook hay twitter cũng đã từng mắc những lỗi cơ bản liên quan đến oauth (đặc biệt là twitter).Do đó việc tìm hiểu về những lỗ hổng cơ bản là cần thiết với tất cả các programmer.

  • Complete a personal project: side project là một trong những yếu tố rất quan trọng giúp bạn keep high motivation cho việc phát triển career path để thành một programmer đúng nghĩa. Với side project, bạn có thể làm gì bạn thích, design những gì bạn muốn, up lên github, khoe hàng trên ycombinator, và tự hào nhìn số starred của repo trên github (cá nhân mình thì chưa làm được cái đoạn từ khoe hàng trên ycombinator), nhưng mình vẫn cố gằng nghĩ ra, và hoàn thành các side project, chỉ vì đơn giản là nó giúp mình happy và highly motivated với việc là một programmer đúng nghĩa

  • Get your community: Ở VN hiện tại có một điều mình rất bức xúc là thiếu cộng đồng làm công nghệ. Thiếu cộng đồng thì bạn làm gì đi nữa, có side project khủng bố thế nào đi nữa thì cũng chả khác gì bạn đang masturbate cả :D. Mô hình meetup hay conference giúp bạn có thể giao lưu với những người cùng sở thích, biết bạn đang đứng ở đâu, và làm thể nào để phát triển bản thân. Bạn sẽ có những lời khuyên tốt nhất và chân thành nhất. Chính vì vậy đừng ngần ngại, hãy tìm những người bạn cùng sở thích lập trình, lập thành các group, cùng giải quyết vấn đề, bạn sẽ học được nhiều điều hơn bạn nghĩ :D

The end

Trên đây là những điều mình vẫn đang làm hàng ngày, và những điều đấy giúp mình luôn tin là mình đang đi đúng con đường mình đã chọn. Bạn hãy thử làm xem bạn có trở nên happy hơn với việc là một programmer không, nếu không thì mình nghĩ là bạn nên đổi nghề… :D. Chúc các bạn thành công.

Copyright © 2015 kỹ thuật máy tính