Friday, September 25, 2009

Start?

Em muốn trở thành 1 lập trình viên. Hãy giúp em điểm bắt đầu ....
Theo tôi, tốt nhất để bắt đầu, bạn hãy mở một cuốn sách Visual Basic và tự bạn gõ từng dòng lệnh theo nó. Nếu là Ebook, đừng copy/paste nhé, hãy tự gõ vào. Bạn sẽ gặp rất nhiều lỗi. Bạn debug từng dòng theo chỉ dẫn, và bạn sẽ khá lên từng ngày. Vì sao lại là Visual Basic mặc dù nhiều người nói với bạn rằng đó là thứ ngôn ngữ "kém cỏi"? Chẳng có gì kém cỏi cả. Đừng đặt nặng vấn đề ngôn ngữ, vì ngôn ngữ gắn liền với công nghệ. Công nghệ thay đổi liên tục để phục vụ nhu cầu thực tế và nhu cầu thị trường, nên chẳng có gì là "kém cỏi" cả. Quan trọng là nó giúp bạn có được một tư duy sáng sủa về xử lý Thông Tin. (Thế mới gọi là Công Nghệ_Thông Tin, phải nắm chắc về các quy tắc Thông Tin trước, sau đó tha hồ tìm hiểu về Công Nghệ).

Visual Basic là một gạch nối hoàn hảo giữa những thứ cổ điển (Pascal, C/C++... for DOS) và những thứ hiện đại (J2EE, VC++, VJ++, và đặc biệt là VC# for .Net). Nó là một ngôn ngữ dễ tiếp cận, hiệu quả tức thì và trên hết là nó thú vị cho bạn, một newbie. Bạn sẽ không cảm thấy khô cứng và đơn điệu như khi lập trình trên màn hình xanh/đen cho DOS (vẫn đang được lải nhải giảng dạy trong trường). Bạn cũng sẽ không thấy quá rối rắm khi phải tìm hiểu về các namespace, các lớp đối tượng, các môi trường trung gian (các framework, application server, hay các "máy ảo") như ở các ngôn ngữ hiện đại.

Visual Basic có một chút lập trình hướng cấu trúc như Pascal/C, một chút lập trình hướng đối tượng như C++/Java, nhưng rõ nét nhất là hướng sự kiện, tức là từng cái click chuột, từng cái nút bấm bây giờ đều do bạn làm chủ. Những thứ này bạn đã quá quen thuộc: khởi động máy lên, vào windows, mở các ứng dụng, nhấn phím, click chuột... tất cả là các "sự kiện" trên môi trường hệ điều hành Windows. Có thể nói Visual Basic 6 là ngôn ngữ lập trình của Windows, cho Windows, và vì Windows

Khi đã khá thạo (khoảng 1 tháng), bạn tiếp tục tìm hiểu sâu hơn về hướng đối tượng. Lúc này mở lại cuốn C++ cũng không muộn, và bạn sẽ thấy rằng C/C++ chẳng có gì là "bác học" cả, cho nên người ta mới liên tục phải cải tiến nó. Cái thời khó khăn, thiếu RAM, thiếu CPU đã qua rồi và những thứ rắc rối dễ gây lỗi như "con trỏ cấp phát động" của C/C++ cũng một đi không trở lại. Không cần thực hành, chỉ cần hiểu lý thuyết là đủ (mất khoảng 1 tuần). Sau khi hiểu rõ thế nào là "hướng đối tượng" thì tiếp tục nghiên cứu C#. Quá hiện đại, quá mềm dẻo, quá dễ dàng, quá mạnh. Bạn sẽ gặp lại tất cả những gì đã gặp vì đã chăm chỉ thực hành VB và đọc lý thuyết hướng đối tượng C++... Nếu không thích cách làm (cú pháp, quy tắc, từ khóa) của dòng họ nhà C thì vẫn có thể tiếp tục với Visual Basic.Net (VB 7), chẳng có nhiều khác biệt. Tóm lại, đừng đặt nặng vấn đề ngôn ngữ. Hãy học những gì gắn liền với thực tiễn, với nhu cầu thị trường và có hiệu quả nhanh.

Cũng đừng lan man nhiều thứ. Hãy biết nhiều thứ, nhưng phải thật giỏi một thứ. Chẳng phải C/C++, chẳng phải C#, chẳng phải J2EE, mà chỉ cần bạn siêu SQL và bạn đam mê trở thành một chuyên gia về Database, bạn sẽ là ông trùm. Những anh bạn thích khoe khoang nào là C/C++ "bác học", nào là Java "cao siêu"... sẽ chẳng thể bằng bạn được, vì họ không thực tế. Chúc bạn luôn đam mê lập trình. Sau 6 tháng tự học, bạn sẽ trở thành một chuyên gia.
Nhưng nên nhớ đó chỉ là chuyên gia coder thôi nhé, mà trong các công ty, coder không được coi trọng như các bạn vẫn nghĩ. Để trở thành chuyên gia CNTT thực thụ, bạn phải va chạm và đập phá nhiều thứ: mạng, security, hacking (nếu bạn muốn làm chuyên gia lập trình mạng); nghiệp vụ kế toán, nghiệp vụ ngân hàng, bảo hiểm, tài chính, chứng khoán, thậm chí cả chính trị nữa (nếu bạn muốn làm chuyên gia cơ sở dữ liệu hay tư vấn giải pháp)... và không thể thiếu là tiếng Anh. Sống chết gì cũng phải học tiếng Anh thật tốt. Khi đi giao dịch với khách hàng, ngôn ngữ lập trình không quan trọng bằng ngôn ngữ... tiếng Anh

Tóm lại là phải có tinh thần tự học. Học theo các thầy cô trong trường không ổn tí nào, vì tự họ cũng thấy họ đang bế tắc, viển vông nhiều, thiếu thực tế.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Học xong một ngôn ngữ không có nghĩa là bạn đã trở thành một lập trình viên đâu,để trở thành 1 LVT đúng nghĩa thì ít nhất bạn phải qua đại học hoặc tương đương, đã lăn lộn nhiều năm trong nghề và thạo tới nửa tá các NNLT ... nếu ko chỉ có thể gọi bạn là coder- người viết mã mà thôi.
Để có được hướng đi đúng và nhanh trong việc theo nghiệp coding thì tôi góp ý với bạn như sau:
+ Công nghệ thông tin là 1 trong các lĩnh vực có sự phát triển nhanh đến chóng mặt, nếu cứ chú trọng học lấy lền tảng trước rùi học dần lên ngọn thì xin lỗi--> chẳng bao giờ các bạn có thể viết nổi một chương trình ra hồn
, Nhiều bạn nói rằng có thể học 1 ngôn ngữ trong vòng vài ngày thì tôi tin rằng bạn đó nổ hơi to hoặc bạn đó nói đúng khi cậu ta cho rằng học xong 1 ngôn ngữ là viết xong cái helllo world application , Cứ dõi theo microsoft thì thấy hãng này ko bao giờ bằng lòng với sản phẩm mình tạo ra, ngay bây giờ , nhiều LTV còn chưa rành VS 2kK3, thì các version sau đã liên tiếp ra đơi Vs2k5 với những cải tiến vượt bậc rồi Vs2k8 đã rục rịch với các công nghệ mới.Nhiều bạn có lẽ sẽ bị động, học cái gì ,nhiều quá,hướng thủ tục, hướng sự kiện, hướng đối tượng,SOAP,..?? các hình thức truy xuất dữ liệu thì có hàng mớ RDO,OLEDB,ODBC,ADO,DAO...., các ngôn ngữ thì gia tăng theo cấp số cộng....nào là ASM,C,Pascal,C++,Delphi,FOX,Prolog,#......
Có lẽ đến đây nhiều bạn sẽ cảm thấy bối rối bởi mặc dù tôi mới chỉ đề cập đên 1 phần nhỏ của lĩnh vực phần mềm, còn phần cứng ( 1 trong các yếu tố then chốt thúc đẩy sự phát triển của PM) sẽ làm bạn càng chóng mặt hơn, chỉ trong vài năm quá nhiều sự thay đổi mà ko ai ko nhận ra.
Do vậy, với thời điểm hiện nay cách học lập trình tốt nhất là đứng trên vai người khổng lồ để tiếp tục đón nhận các tri thức tiên tiến của loài người thay vì làm 1 chú dã tràng ngày ngay xe cát , chẳng có tương lai bạn ạ...
Hãy chú trọng thừa kếphát huy thay vì phát minh lại bánh xe, hãy bỏ qua các kỹ thuật đã lạc hậu và lỗi thời như ASM, C và thậm chí cả C++ để tiếp cận nhanh chóng với các ngôn ngữ thế hệ mới như C#.
Đừng bao giờ có tư tưởng phát minh lại bánh xe,nếu như nhiều bạn cho rằng học C , C++ để viết game engine chạy cho tít thì bạn có biết rằng các game engine chuẩn đã được free trên rất nhiều 4 room rùi ko, nhiều hãng lớn vì 1 lý do nào đó mà ko dùng các game engine có sẵn mà tự viết lại theo ý mình dẫn đến tăng chi phí và thời gian sx đồng thời sự ổn địng lại thua xa các engine chuẩn đã qua thời gian kiểm định .Đơn giản hơn nữa nhièu bạn cho rằng C,C++ APP chạy nhanh hơn C# nhưng xét trên nhiều khía cạnh thì :
+ Chí phí viết 1 chương trình = C,C++ cao gấp 5 lần C#
+ Thời gian phát triển + debug sẽ gấp 10 lần hoặc hơn
+ Ưu điểm nhanh hơn sẽ chẳng còn ý nghĩa gì khi mà phần cứng ngày càng rẻ , các máy tính mạng và phổ biến bây giờ đủ sức đạp ứng
+ Đặc biệt với các ứng dụng chuyên về CSDL ,các ứng dụng đa lớp thì .net càng tỏ ưu thế vượt trôi với các kỹ thuật tiên tiến như ado.net

Chỉ là 1 số góp ý! chúc các bạn thành công



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tôi muốn nói với các bạn muốn bước vào nghề coding một điều: Các bạn phải tự tin và chăm chỉ.

Hãy quên đi những huyền thoại "cao thủ lập trình" quanh bạn, vì hầu hết đó chỉ là giả tạo. Ngay cả các thầy cô, rất nhiều trong số họ đã mắc một thứ bệnh nguy hiểm của thời đại, đó là bệnh sĩ. Họ cố gắng tạo ra một màn sương mù bí ẩn xung quanh họ khiến bạn cảm thấy họ tài giỏi kinh hồn, mặc dù kiến thức của họ chẳng đâu vào đâu cả, người thực sự hiểu biết sẽ phát hiện ra ngay. Nếu các bạn chỉ nghe những lời khoa trương của họ, rằng thứ này cao siêu, thứ kia bác học, các bạn sẽ trở nên tự ti, không biết bao giờ mình mới có được 1/10 kiến thức của họ. Các bạn đang tự dìm mình xuống bùn.

Sự thực là, không có cái gì cao siêu và quá khó hiểu trong ngành khoa học máy tính, công nghệ thông tin nói chung cũng như lập trình, gia công phần mềm nói riêng. Mọi thứ đã được những người tốt bụng đi trước (nước ngoài có, Việt Nam có) nghiên cứu, tổng hợp, chia sẻ free đâu đó trên mạng. Hãy cảm ơn họ và kiên trì tìm kiếm, nghiên cứu. Đến lượt các bạn, nếu tìm ra được một hướng tiếp cận hiệu quả, hãy chia sẻ cho những người đi sau, không khoa trương, không giấu giếm.

Tôi lấy ví dụ, có rất nhiều người đang hiểu sai về c_racking. Bẻ khóa phần mềm có thể bị coi là một tội ác, nhưng nó chỉ là một hạt cát trong sa mạc được gọi là Reverse Engineering, kỹ thuật dịch ngược nhằm chỉnh sửa mã thực thi ở cấp thấp (thập lục phân - Hex hay mã Assembly). Nhưng điều đáng nói là bất cứ ai với một nền tảng cơ bản nhưng vững chắc về lập trình (không phân biệt VB hay C/C++ "bác học"), về cách chuyển đổi giữa các hệ cơ số (nhị phân, thập phân, thập lục phân)... đều có thể tiếp cận Reverse Engineering chứ nó không có gì là bí hiểm cao siêu như người ta tô vẽ.

Reverse Engeneering cũng phân ra hai phái hắc/bạch rõ rệt: Một bộ phận là những người nghiêm chỉnh nghiên cứu về bảo mật (chống virus, spyware), về tối ưu (các phương pháp nén file cho nhỏ hơn, đóng gói cho gọn hơn và an toàn hơn, cách phân hoạch tốt hơn cho các section của file thực thi giúp chúng có độ tương thích và độ tin cậy cao hơn).

Bên cạnh đó là những người phá phách cho vui (bẻ khóa phần mềm, thêm mã độc hại, viết virus). Người ta chẳng cần hiểu biết quá sâu sắc về ngôn ngữ ASM cũng có thể bẻ khóa phần mềm như thường, chẳng hạn dùng kỹ thuật NOP - No operation chỉ cần click chuột phải sau đó nhấn lệnh vô hiệu hóa đoạn mã yêu cầu đăng ký license; kỹ thuật đảo ngược JMP 74-75, tức là nhập mã đăng ký sai vẫn được chấp nhận; hay kỹ thuật dò Real Serial Number cho những phần mềm cực nhỏ mà người viết ra chẳng thèm quan tâm nhiều đến license... Những kỹ thuật c_racking "bác học" này dễ hơn cả việc bạn dò giá trị trong ArtMoney hay Cheat Engine khi muốn cheat game.

Vậy có cần phải thần thánh hóa vấn đề không? Có cần phải thần tượng hóa những thiên tài ảo tưởng không? Tất nhiên là không, vì ta đã hiểu ra vấn đề. Để rõ hơn, chẳng hạn ta có một đoạn mã chương trình kinh điển dùng để chuyển đổi chữ thường sang chữ hoa nằm trong file UpperCase.exe viết bằng Delphi như sau:

10000011111011000010000001010011010101100101011111 11111100010101100000000000000001100111101101110100 011100110001000000101000000

chuyển sang thập lục phân Hex thành:

83EC20535657FF158C40400033DBA39881400053

rồi chuyển sang ASM thành:

sub esp, 20h
push ebx
push esi
push edi
call ds:GetProcessHeap
xor ebx, ebx
mov hHeap, eax
push ebx ; lpModuleName

Chương trình rất ngắn, rất đơn giản. Theo quá trình dịch ngược này, các bạn có thể thấy rằng thậm chí người ta chẳng cần biết ngôn ngữ ASM "bác học", chỉ cần một trình Hex Editor, một chiếc máy tính Calc sẵn có của Windows, một bản Appendix (phụ lục) ghi rõ quy ước chuyển đổi mã Hex, thế là có thể mò mẫm trở thành thành "chuyên gia" c_raking rồi. Tất nhiên phải rất kiên trì. Chuyển đổi trực tiếp mã nhị phân 0-1 (Binary) đòi hỏi kiên trì hơn chút nữa, và đó là công việc của các chuyên gia Intel, Asus, những người sản xuất chip, mainboard; hay các chuyên gia tạo dựng các trình biên dịch (Compiler) thế hệ sơ khai.

Như vậy, huyền thoại về một thứ ngôn ngữ ASM "bác học" chỉ là huyền thoại mà thôi, không có gì cao siêu cả. C/C++ cũng vậy, vì chúng đơn thuần là những ngôn ngữ cao hơn ASM một chút, và hoàn toàn có thể dịch ngược toàn bộ đoạn mã trên thành mã C, chẳng có gì bí ẩn hết, cả thế giới đều biết. Những người đạt được khả năng dịch ngược từ ASM sang C và sẵn sàng chia sẻ kinh nghiệm với bạn, đó là những người đáng nể vì họ hiểu biết thực sự. Họ là những người có khả năng làm ra các file K_e_y_gen tạo mã license hợp lệ cho các phần mềm đắt đỏ, có ích cho những người nghèo không có tiền mua nhưng vẫn muốn sử dụng phần mềm để nâng cao dân trí. Đẳng cấp, trí tuệ và thường cả đạo đức của những Keymaker này cao hơn những nhà c_racker nửa mùa một bậc.

Nhưng làm thế nào mà cái đoạn 1000001111101100001000000101001101... kia có thể chạy như một chương trình chuyển đổi từ chữ thường ra chữ hoa? Câu trả lời là tất cả đã được mã hóa sẵn trong các bộ vi xử lý. Một chương trình đặc biệt của hệ điều hành, với hệ điều hành Windows thì đó là Windows Loader, sẽ tải nó vào hệ thống bus trong máy tính. Có rất nhiều bộ vi xử lý nhận lấy tín hiệu này, sau đó chúng được họp lại tại bộ xử lý trung tâm, lưu một phần đệm vào RAM hoặc ra bộ nhớ ảo trên đĩa cứng (pagefile.sys) nếu cần để chờ xử lý (liên quan đến các khái niệm ngăn xếp, hàng đợi). Bộ xử lý trung tâm sẽ biết 10000011111... nghĩa là gì, 110000100... nghĩa là gì. Sau đó thông qua bus địa chỉ, bus điều khiển, bus dữ liệu, nó gửi tín hiệu tới card màn hình và bảo card màn hình cách phóng tia điện tử vẽ lên màn hình những gì mã chương trình muốn thể hiện.

Trên đây là vài dòng sơ lược cùng các bạn, nhằm phần nào giúp các bạn newbie xua tan đi những mặc cảm tự ti và những huyễn hoặc về các khó khăn hay sự "cao siêu" này nọ của các ngôn ngữ. Hãy tự tin lựa chọn nghề coding, vì đó là một nghề tốt, đến lúc râu tóc bạc phơ vẫn làm việc được như thường (các bạn có thấy những ông thầy viết sách lập trình lừng danh thế giới đều râu tóc bạc phơ không, đâu phải 35 tuổi là sẽ bị đào thải). Xin khẳng định lại một lần nữa là các bạn đừng quá đặt nặng vấn đề ngôn ngữ. Cái nào tính thực tiễn cao, tư duy ngôn ngữ sáng sủa, hiệu quả tức thì, đó là sự lựa chọn lý tưởng cho các bạn.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Dreaminess Dreaminess là offline
Administrator
Gia nhập ngày: 07 2006
Nơi ở: Hà Nội
Bài viết: 1,437
Gửi một tin nhắn qua Yahoo tới Dreaminess Gửi một tin nhắn qua Skype™ tới Dreaminess
Mặc định Re: Em muốn trở thành 1 lập trình viên. Hãy giúp em điểm bắt đầu ....

Chà! Mấy vụ học hành thế nào Dr không bàn nhưng Dr muốn hỏi người lập đề tài này rằng bạn đã bao giờ tìm câu trả lời cho 2 câu hỏi sau trước khi gửi đề tài này chưa?

- Lập trình viên nó là cái gì?
- Thành công nó là cái gì?

Nếu 2 câu hỏi này mà bạn chưa có lời giải đáp thì việc bạn cố gắng là vô nghĩa. Bởi vì bạn đã biết nó là cái gì đâu mà cố gắng! Cố gắng để lấy cái gì?
Dr dám khuyên bạn là: Bạn hãy tìm kiếm câu trả lời thực sự cho 2 câu hỏi này, tất cả boăn khoăn trên của bạn sẽ tự động được giải phóng.

Lời khuyên là rất hữu ích, kinh nghiệm là một thứ rất có giá trị, nhưng nó chỉ có ích với bạn khi bạn thực sự biết bạn đang ở đâu và bạn sẽ đi đến đâu. Kinh nghiệm mà ngày hôm nay mang lại thành công thì có thể ngày hôm sau nó sẽ không còn tác dụng.

No comments: