Sunday, 30 September 2012

Lập trình viên ký (Phần 2)

Dưới đây là những khó khăn tớ gặp, những quãng đường đã trải qua, nói ra để mọi người biết  mà đi đường tắt  :D

C là một ngôn ngữ có cú pháp đơn giản. Chẳng phải tớ giỏi giang gì mà nói thế, mà chính ông Dennish Ritches cũng chỉ viết cuốn C programming language có ~ 200 trang.
Nếu bạn nắm được hết nội dung cuốn sách ấy, bạn đã nắm hết được cú pháp của C. Tất cả chỉ có vậy, còn dùng ra sao thì không ai nói cả.
Sai lầm cũng là ở đây, bạn chỉ biết làm mấy cái bài tập ví dụ trong sách, cài đặt thuật tóan cơ sở dữ liệu, sắp xếp tìm kiếm... và sẽ không bao giờ viết được 1 chương trình làm việc thực sự.


Nói đến viết chương trình, có thể chia làm 2 mức:
Viết chương trình cho bạn dùng.
Viết chương trình cho người khác dùng.

Cái chương trình cho bạn dùng nó nằm quanh quẩn đâu đó trong phần lý thuyết và minh hoạ lý thuyết. Cái còn lại chính là những thứ ngoài đời thật, và chúng ta chưa từng biết tới!

Khi bạn đang chỉ biết viết 1 chương trình dài ngoằng trong hàm main. Hãy kiên quyết, hãy cố gắng để bắt đầu viết thành chương trình với những hàm con. Điều này là BẮT BUỘC để bạn có thể viết được 1 chương trình lớn. Lớn ở đây là lớn hơn cái bài "viết chương trình sắp xếp nổi bọt".

Hãy nhớ lấy 1 kinh nghiệm thực tế: hãy viết hàm của bạn ngắn hết mức có thể. nhớ rằng: mỗi hàm chỉ nên thực hiện 1 nhiệm vụ duy nhất. Thậm chí dòng printf("~~~~~~~~~Ngan cach~~~~~~~~~~\n"); cũng nên viết thành 1 hàm tên là printSeparator(); :D Nếu bạn đang trong giai đoạn này, hãy thử cắt chương trình của mình ra thành thật nhiều hàm con.

Sau khi bạn biết tách các chương trình ra thành những hàm con, vấn đề tiếp theo sẽ gặp phải là : xử lý các lỗi đầu vào và đầu ra của hàm. Lúc này sẽ gặp phải vấn đề đầu vào là int** hay int***[] @@, tham trị, tham trỏ là đều ở giai đoạn này.

Người ta nói, có 2 cách để xử lý 1 vấn đề, người thông minh nghĩ cách giải quyết nó, người thông thái thì tránh không gặp nó.

Tốt nhất là bạn nên giải quyết nó ở mức cơ bản, cũng viết được hàm swap 2 số là ok rồi :D
Đến đây có thể nói bạn đã đạt trình độ: biết cú pháp lập trình.

Và chính nơi đây bắt đầu ngã rẽ. Nếu bạn quyết định học C, hãy ôm quyển kinh thánh của ngôn ngữ C : C programming language ngấu nghiến và luyện chưởng để thấu hiểu con trỏ. Bắt đầu down source code của các chương trình commandline trên linux về nghiên cứu và tập viết những chương trình thực sự. Tập sử dụng các thư viện bên ngoài , các hàm gọi hệ thống...

Hoặc chọn một ngôn ngữ khác để đi tiếp. Hầu hết chúng ta đều chọn các ngôn ngữ nhánh con của C như C++, PHP, Java, Python...

Sau khi chọn xong 1 ngôn ngữ mới, bạn băt đầu học cú pháp của nó. Bắt đầu viết những chương trình của mình, thậm chí là viết cho người khác dùng. Nhưng đến đây, cuộc chơi đã khác!
Khi bạn học để đi làm (chứ không phải học để biết những cái cơ bản như phần trên), bạn cần học dùng những công cụ, những thứ có sẵn, chứ không phải ngồi hì hục với một tấn suất cao hơn trước kia. WHY?
vì 80% những thứ bạn làm (con số tớ bịa thế) đều đã có người làm rồi, đều đã có sẵn. Bạn chỉ cần search và tìm cách dùng chúng, chứ không phải ngồi cắm đầu viết lại tất cả.

Nếu là PHP, hãy học cách load dữ liệu từ DB, sau đó bắt đầu học 1 framework nào đấy, hiểu cách nó hoạt động hoặc học cách Wordpress, Joomla hoạt động và  thay đổi chúng theo ý mình. Mọi thứ đều có sẵn và bạn chỉ cần học dùng... thế là xong! rồi sau đó vẽ râu vẽ ria JavaScript, CSS, AJAX cho gái mình thêm xinh.

Nếu học Java, hãy học các thư viện có sẵn của nó, chọn 1 nền tảng Web, Desktop, nhúng, Android... rồi học dùng các thư viện mà nền tảng ấy hỗ trợ, xong!

Điểm khác biệt giữa đống này và C là được gắn thêm phần hỗ trợ lập trình hướng đối tượng. Ai sẽ viết quyển sách Java 200 trang? không ai cả! vì sức mạnh của những ngôn ngữ này nằm ở những thư viện có sẵn, những thư viện từ bên ngoài. Bạn cần học cách sử dụng những thư viện ấy cho việc của mình, không phải ngồi viết lại chúng.

Và cuộc chơi lúc này lại nâng lên một mức khác.
Viết code cho ứng dụng của mình. -> thấp
Viết code phục vụ các ứng dụng khác. -> cao
Viết code để tất cả mọi người cùng dùng, để hoạt động 3,5, hay 10 năm nữa. -> cao hơn nữa.

Phần khó ở đây chính là việc bạn viết code có khả năng sử dụng lại, viết ít code hơn, chương trình chạy nhanh hơn, phục vụ hệ thống lớn hơn, có thể nâng cập được, bạn thiết kế các lớp như thế nào, có hỗ trợ unittest ra sao...
và cuộc chơi cứ tiếp tục mãi... Khi nào tớ đi đến level khác thì tớ sẽ viết bài sau. Còn giờ ngồi chờ trời sáng chứ deck ngủ đc :((