27 thg 6, 2018

Bản beta đầu tiên

Sau 6 tháng cả team cặm cụi làm việc điên cuồng, bản alpha cũng được giới thiệu ra toàn bộ công ty và được testing nội bộ công ty mà thôi. Version này chỉ gồm các tính năng cơ bản cần có của ứng dụng nhưng cũng làm cả toàn bộ công ty sôi sục vì sản phẩm khá “đinh” về cả UI/UX so với cái sản phẩm hiện tại có UI khá basic và truyền thống.
Vì bản nội bộ dùng nhưng team cũng nhận được rất nhiều feedback về sản phẩm như cái nút này khó bấm, chưa có nút đăng xuất, sao cái hình hiển thị trên 2 máy lại khác nhau, tính năng đang chạy thì crash trên galaxy Y.... Nhưng chính sự quan tâm này lại kích thích sự làm việc cật lực hơn của team. và việc cập nhật phiên bản lại diễn ra từng ngày. Có thời điểm trong 1 ngày team gửi vài version mới cho toàn bộ nhân viên trong công ty để update tính năng cũng như fix các lỗi. Điều này làm cho nhân viên các bộ phận khác thích thú vì sự đóng góp của họ đã được ghi nhận. Sau 2 tuần, phiên bản beta đã có với 1 số tính năng mới, hoàn chỉnh fix các lỗi mà feedback gửi về và sẵn sàng để lên store và cho người dùng cuối sử dụng. Đến lúc này team vẫn chưa sử dụng công cụ quản lý chuyên nghiệp nào. Timeline vẫn là tờ A4 với chi chiết các nét mực, Bug được cập nhật thủ công vào 1 file excel, cũng chả có tool nào về quản lý dự án cả. Điều này chứng tỏ khi cả team đã đặt tâm huyết vào dự án thì mọi công cụ quản lý chỉ là thứ yếu. Dự án vẫn chạy tiến độ nhanh và tốt. Lại tiếp, sau khi đã có bản beta, team quyết định email cho BOD báo cáo tiến độ phát triển sản phẩm và sẵn sàng launching sản phẩm đến người dùng cuối. Việc này làm cả công ty háo hức, và nó như là 1 cột mốc đánh dấu của anh em trong team làm sản phẩm, ghi nhận mọi người và chờ đợi phản hồi của mọi người bên ngoài văn phòng nhỏ này về sản phẩm.
LAUNCHING SẢN PHẨM....

Dự án bắt đầu

Sau khi chốt được nhân sự làm dự án, team bắt đầu làm việc. Việc đầu tiên là setup dự án đều do CTO làm như khởi tạo dự án, chọn tool làm việc. Sau đó phân công rõ ràng Boss sẽ làm về phần server- backend, còn mình phụ trách dev phần client - frontend,. cụ thể là android. Chẳng có tiến độ cụ thể gì cả, vài tuần đầu tiên sếp và mình gục đầu vào viết để cho ra 1 cái protocol giao tiếp thống nhất giữa client và server. Sau khi việc lên xuống gửi lệnh giữa server và client đã nhịp nhàng mới bắt đầu bắt tay vào làm các tính năng. Khi này lại phát sinh các tính năng gì sẽ được ưu tiên phát triển đầu tiên. Và sau khi thảo luận, cuối tuần quyết định mồi và lôi kéo được 1 bạn ở team sản phẩm của dự án hiện tại tham gia vào nhóm, hỗ trợ lên danh sách các tính năng hiện tại của sản phẩm cũ, và sort theo danh sách các tính năng ưu tiên cần có và cho ra là 1 tờ A4 là các tính năng của sản phẩm mới. Tờ này được dán ở chỗ làm việc của mình và sếp. Tờ này đặc biệt là ở chỗ chả có thời gian deadline gì cả, cứ làm thôi. Khi nào xong tính năng thì mình hoặc sếp lại đánh dấu done. Sau khi phát triển được 1 vài tính năng cơ bản, testing hệ thống khá ok thì phát sinh ra vấn đề cần phải có bên tester tham gia vào vì Dev chỉ tập trung phát triển tính năng cũng mệt rồi vì tính năng thì qua nhiều. Vậy là đề xuất tuyển tester và mở rộng thêm dev bên back-end vì dù sao sếp vẫn phải quản lý các team khác, dự án cũ để đảm bảo hoạt động kinh doanh. Tuyển nhân sự tốn nhiều thời gian nên quyết định sẽ mời 1 số bạn back-end đang làm sản phẩm cũ có hứng thú tham gia vào team. Nhưng cũng lúc này thì có vấn đề xảy ra, các bạn backend cũ tham gia vào nhưng không đáp ứng được tiến độ. Không phải là họ không có khả năng và năng lực để thực hiện các task mà là do họ đang làm việc ở các dự án cũ theo phong cách chậm rãi quen nên khi đưa vào thực hiện dự án ở giai đoạn đầu, họ thích làm việc theo các task với mốc deadline rõ ràng và team không đáp ứng được điều đó và sau đó quyết định out, về làm dự án cũ hoặc rời công ty. Sau việc này team quyết định không mời members của dự án cũ nữa mà sẽ tuyển nhân sự mới hoàn toàn. Việc này cho phép team có thể tìm được nhân sự phù hợp với sản phẩm ngay từ đầu, và tất nhiên việc này sẽ tốn thời gian vì team phải chấp nhận việc nhân sự ra vào dự án là bình thường, nhưng sẽ tìm được nhân sự phù hợp cho dự án. Sau khi build được team toàn các nhân sự phù hợp, mọi chuyện sẽ nhanh hơn rất nhiều. Cuối cùng team cũng build được nhân sự khá ổn. 2 back-end, 2 front-end(android, ios), 1 testing, và sếp sẽ quản lý. Vậy là cũng build được 1 team chiến thực sự. Và lúc này công việc mới thực sự trôi chảy và đi.
BẢN BETA ĐẦU TIÊN....

Cơ hội bất ngờ

Như đã nói, sau khi nghỉ việc ở công ty 60 ngày, mình cũng chưa nghĩ đến sẽ làm ở đâu. Bây giờ là đầu tháng 10, cũng nhân cơ hội này nghỉ xả hơi 1 thời gian trước khi quyết định sẽ làm gì tiếp theo. Sau vài ngày dành cho sở thích và các công việc cá nhân thì mình cảm thấy bắt đầu nhớ ‘công việc’. Cũng lúc đấy, mình nhận được letter mời phỏng vấn làm việc của công ty tiếp theo. Đọc CV thì thấy cũng là công ty làm sản phẩm về công nghệ, dự án sắp triển khai khá thú vị và rất mới tại việt nam, team cũng build từ đầu(mình cực thích các dự án từ đầu), và đặc biệt là mình cũng đang muốn đi làm, vậy là nhận lời phỏng vấn ngay. Ngày phỏng vấn, mình đến gặp chị giám đốc nhân sự và trưởng phòng tech. Việc phỏng vấn khá thoải mái và suôn sẻ. Sau đó offer phúc lợi làm việc và quyết định ngày đi làm luôn, nghĩa là không cần thông báo qua email. Đấy là cơ hội để mình được làm việc trong dự án mà hiện tại đang rất nổi bật trong các startup tại Việt Nam. StartUp này hiện tại đang tăng trưởng mạnh và là leader trong ngành này, startup gọi được vốn nhiều nhất Việt Nam năm 2016.
Thời gian đầu mình vào công ty thì công việc chính là phát triển tiếp sản phẩm hiện tại của công ty. Sản phẩm hiện tại khá basic và hiện đang dùng cho khoảng vài trăm người dùng của công ty. Dự án có vẻ boring vì không có nhiều thử thách về công nghệ và sản phẩm đã khá hoàn thiện, chủ yếu duy trì dự án, và tinh chỉnh các chức năng cũ và thêm 1 số tính năng mới theo phòng kinh doanh đề xuất. Sau 1 tháng thì đùng 1 cái công ty quyết định thay đổi chiến lược sản phẩm để đáp ứng và đón đầu xu hướng của thị trường. MỌI THỨ THAY ĐỔI.
Thay đổi toàn diện từ công ty, BOD thay đổi CEO, CEO tuyển và bổ nhiệm CTO mới. CTO bắt đầu cải tổ lại phòng IT và tập trung toàn bộ lực lượng cho phát triển sản phẩm mới. Thực ra nói tập trung lực lượng cho sản phẩm mới nhưng khi bắt đầu chỉ có 2 người là mình và sếp CTO mới về. Anh em trong Trung tâm IT còn lại được phục vụ cho các dự án đang có sẵn. Vậy là dự án làm sản phẩm mới được khởi động ban đầu với 2 người. Mình được chọn là chỉ may mắn vì cả phòng lúc này mỗi mình biết mobile.
DỰ ÁN BẮT ĐẦU....

12 thg 6, 2018

Thất bại liên tiếp

Sau khi thành công với sản phẩm Game giáo dục đầu tiên thì sau đó mình có tham gia làm những sản phẩm tiếp theo nhưng gặp thất bại ê chề. Nó đúng với câu nói mà mình biết “Thánh nhân đãi kẻ khù khờ”. Theo như câu này được hiểu đơn giản như lần đầu bạn đi câu thì luôn câu được nhiều hơn lần tiếp theo. Và nó đúng với mình.
Ở công ty đầu tiên, như đã nói sau khi làm 1 game được ghi nhận và xem như thành công nếu xét ở khía cạnh người dùng, doanh thu, thương hiệu studio việt, bọn mình đẩy nhanh làm game play cho game tiếp theo với 1 sự tin tưởng lớn là sẽ tiếp tục thành công. Vì nghĩ như vậy nên có lẽ nó đã failed rất nhanh. Thành công thì bao gồm nhiều thứ hội tụ lại còn thất bại chỉ cần nghĩ sai 1 thứ thôi. Ở game thứ 2 là game play(cách chơi của game). Mình ko đi phân tích chi tiết hơn về thất bại của game này. Chỉ là sau khi team họp nhiều lần và tìm ra nguyên nhân để so sánh với game trước thì thống nhất nguyên nhân chính là game play. Và đây là thất bại bắt đầu cho thất bại tiếp theo
CÔNG TY TỒN TẠI 60 NGÀY!!!! Sau đó ở công ty thứ 2, mình interview vào 1 công ty StartUp đúng nghĩa. “Lý do tại sao mình nghỉ việc ở công ty đầu tiên thì mình sẽ viết trong 1 post khác về việc chuyển việc”. Trở lại nói 1 chút về công ty, khi mình interview vào công ty thì công ty đã bắt đầu được 1 tháng, team lúc đó khoảng 6 người. Như mình nói công ty này là startup khởi nghiệp đúng nghĩa. Công ty được mở ra là 1 anh Việt kiều úc, anh sinh năm 83 và là doanh nhân khá thành đạt. Bố mẹ là Hoa kiều tại Việt Nam và có tiềm lực về tài chính. Anh về Việt Nam và nhận thấy thời điểm này Game trên Mobile đang rất nổi nên mở công ty. (Hầu như lúc này doanh số bán smartphone chưa nhiều, độ tiếp cận ở Việt Nam chưa cao nhưng các thị trường khác thì đã phổ biến hơn.). Anh về VN và đầu tư xây dựng 1 công ty phát triển game. Anh không tham gia vào điều hành công ty nhiều, tất cả các vấn đề anh giao cho người bạn thân(làm văn phòng pháp lý) phụ trách điều hành. Anh chỉ đến công ty 1 số ngày trong tháng khi cần. Vì là doanh nhân và dân đầu tư nên việc tỉ suất lợi nhuận trên đồng vốn đầu tư là quan trọng nhất nên việc phát triển công ty đều do bạn anh thực hiện. Ngày mình phỏng vấn đầu tiên, mình chỉ gặp team lead của công ty và bạn anh. Mọi việc phỏng vấn đều ok và chỉ còn vướng mắc 1 chút chuyện offer. Sau đấy, bạn anh có gửi offer và mình không đồng ý với offer đó. Và sau đấy nhận được mail và đại lý rằng anh muốn gặp mình để hỏi thêm trước khi quyết định ký hợp đồng hay không. Buổi thứ 2 thì mình gặp anh. Và sau buổi đó thì mọi việc ok và mình bắt đầu vào làm cho công ty ngay thứ 2 tuần sau. Trở lại công việc, vì là team đang bé nên tất cả thành viên công ty đều làm chung sản phẩm. Sản phẩm đang làm là 1 Game bài + 1 App transfer files. Vì mới bắt đầu được 1 tháng nên xem như dự án cũng mới bắt đầu, khung sản phẩm cũng dần ổn định cả phía mobile và server. Về thiết bị và môi trường làm việc thì perfect, tất cả máy tính đều là mac, các thiết bị test đều là điện thoại tốt nhất bấy giờ, server tự mua và setup tự do, đồ uống thoải mái, bàn làm việc rộng và thoải mái. NHƯNG Vì mình đang nói đến thất bại của mình sẽ nói ra những suy nghĩ theo cảm nhận của mình rằng tại sao công ty này lại giải thể sau 60 ngày tồn tại. Thứ nhất về ban điều hành, vì anh là doanh nhân nên khả năng kinh doanh tốt nhưng anh không sát sao điều hành, bạn anh điều hành toàn bộ công việc của công ty nhưng lại không xuất phát từ dân kinh doanh về công nghệ, không hiểu nhiều và sâu sắc về làm sản phẩm, ngành phần mềm. Đây là điểm chính khiến cho quan điểm người người lãnh đạo và nhân viên không thông suốt. khi team còn nhỏ, thành viên họ cần người lãnh đạo hiểu biết nhiều hơn việc chỉ trả tiền lương. Dù sao sẽ có người bảo rằng sao nhiều công ty lớn có sếp là dân kinh doanh vẫn thành công. Mình cũng đồng ý nhưng đã là kinh doanh về làm sản phẩm công nghệ, khi bắt đầu từ lúc còn nhỏ, khởi nghiệp thì người lãnh đạo cần có hiểu biết sâu sắc trong việc làm sản phẩm. Khi công ty đã lớn hơn, cần mở rộng và quan tâm đến nhiều bộ phận khác thì việc mindset của người làm kinh doanh lúc này sẽ tốt hơn. Vì vậy, mình cho rằng lý do đầu tiên là sếp điều hành công ty không có hiểu biết sâu sắc về sản phẩm công ty. Lý do thứ 2 là team thực thi. Mình đánh giá team làm khá tốt và tiến độ có phần nhanh và đáp ứng được yêu cầu. Nhưng văn hoá làm việc của team, mở rộng ra của công ty là chưa có. Các anh em làm việc chưa có sự gắn kết nhiều, điều này cũng đúng vì team cũng mới thành lập mà. Tuy vậy, leader của team là một người khá giỏi về kỹ thuật, thực hiện hầu hết các task khó trong sản phẩm nhưng đổi lại tính khí lại thất thường. Điều này nghe có vẻ bình thường nhưng lại là điểm yếu chết người. Vì không nằm trong ban điều hành, không có nhiều quyền lợi hơn thành viên khác, ban điều hành không hiểu về sản phẩm nên giao cho leader quản lý hết về kỹ thuật, nên khi xảy ra mâu thuẫn với ban điều hành thì tiến độ phát triển có vấn đề ngay và sau đó mâu thuẫn quá lớn nên anh này đã xin nghỉ, đến bây giờ cả team vẫn không hiểu nổi lý do đằng sau của việc này là gì. Sau đó, anh này có bàn giao hết công việc lại cho mình, vì mình mới vào được vài tuần nhưng khi đó vị trí là sub team lead nên được team lead có bàn giao lại. Lúc này mình mới nhận ra công ty đã để team lead nắm quá nhiều và sâu về sản phẩm. Sau đó 2 ngày thì sếp có họp toàn bộ nhân viên công ty là quyết định off công ty khá bất ngờ dù sản phẩm đã có thể release và bắt đầu launching. Đây là 2 lý do chính. Sự việc thì quá bất người với anh em trong công ty nhưng bản thân mình lúc đó cho việc này là bình thường. Động viên anh em đừng quá bi quan về startup trong lĩnh vực công nghệ. Đến bây giờ khi startup ở Việt nam đang nổi lên, mình cũng luôn bảo lưu quan điểm này, đừng quá bất ngờ, khi sự việc tệ đi tệ đi thì rất nhanh. Tất nhiên, công ty có trả cho nhân viên 2 tháng tiền lương tiếp theo như là tiền trong lúc tìm công việc mới. Vì vậy nên mình nghĩ đây là 2 nguyên nhân chính dẫn đến việc công ty này chỉ tồn tại trong vòng 60 ngày dù có rất nhiều ưu thế khác như vốn khởi đầu nhiều, dự án tiềm năng lớn, năng lực của team rất ổn. Đúng là để thành công thì cần rất nhiều yếu tố, nhưng thất bại thì chỉ cần 1 vài yếu tố không tốt.
Trên đây là vài thất bại quan trọng trong quá trình làm sản phẩm mà mình trải qua. Thất bại nào cũng cay đắng và mang lại nhiều thứ thay đổi. Chỉ khi thất bại đau đớn, bạn mới nhìn nhận lại sự việc và tạo ra sự thay đổi. Nhưng mình luôn tâm niệm rằng như câu nói khi một cánh cửa đóng lại, cánh cửa tốt hơn lại mở ra và chờ đón mình ở phía trước.

Trở thành người làm sản phẩm?

Năm 3, khi còn ngồi trong trường đại học, mình đã rất may mắn khi được 1 anh khoá trên đã ra trường giới thiệu cho công việc full time đầu tiên. Công việc đến rất tình cờ và đến bây giờ mình cũng chưa biết tại sao anh đó biết biết rằng mình biết ngôn ngữ lập trình đó mà giới thiệu công việc cho vì trước đó cũng chưa đụng chạm người anh gặp đó lần nào. Sau này biết được rằng bác đó khá giỏi trong việc học tập, là 1 trong 2 người tốt nghiệp nhất khoa của trường mình, vào làm cho 1 công ty Game lớn nhất tại thị trường Việt nam và bây giờ hiện là người làm sản phẩm ‘best of the best’ của Grab, công ty gọi xe lớn nhất thị trường Đông Nam Á. Người anh mà mình được gặp đúng 1 lần cũng trong buổi phỏng vấn đầu tiên trong đời.
Đại ý là thế này. Anh này làm Developer ở công ty. Sếp của anh này làm cố vấn cho 1 công ty startup mới thành lập đang cần tìm nhân sự cho 1 mảng mới nên nhờ nhân viên cấp dưới giới thiệu cho các bạn sinh viên đã biết. Và mình may mắn đúng target của anh. Một hôm mình nhận được tin nhắn ”Em muốn đi làm không? Có công ty này hay lắm.” Ban đầu cũng hơi bất ngờ và hoài nghi. Sau thì cũng nhận vì đằng nào cũng đang rảnh, đồ án thì đã xong mà gia đình thì ở xa, thế là nhận lời phỏng vấn. Buổi phỏng vấn đầu tiên trong sự nghiệp là ở 1 quán cafe gần nhà của người sếp này(Sau này anh boss này giúp đỡ mình rất nhiều trong công việc). Hôm đó chạy con Wave Alpha đến gặp vào buổi chiều, buổi phỏng vấn mà không phải phỏng vấn. Boss chỉ hỏi về các đồ án từng làm trong trường, bảng điểm thế nào, đã thích đi làm chưa. Và sau đó có giới thiệu qua về công ty như sau. Công ty này là công ty chuyên outsource nghĩa là làm các dự án cho công ty, tổ chức bên ngoài và thu tiền công thực hiện dự án đó. Và nếu vào thời điểm phỏng vấn khác thì mình đã làm outsource rồi và có khi page này nên đặt là người làm outsourcing. Cơ duyên là công ty này đang muốn mở 1 mảng product làm 1 số sản phẩm nội bộ do công ty phát triển và phát hành. Lĩnh vực được chọn là làm game. Sau đó boss này hỏi mình thích không? Mình ok và deal done. Buổi phỏng vấn đầu tiên kết thúc. Sau buổi đó mình có mặt ở công ty gặp boss trực tiếp vài lần, chủ yếu để làm hợp đồng và xem nơi làm việc.
Đấy là câu trả lời tại sao mình trở thành người làm sản phẩm. Câu trả lời chỉ gồm 2 chữ May mắn và việc chọn người.

Lời mở đầu

Trước khi viết về những câu chuyện, xin nói rõ hơn về mục đích ra đời của page là muốn mọi người có cảm nhận và nhìn nhận về công việc của việc phát triển sản phẩm trong các công ty công nghệ, từ lúc sơ khai ý tưởng, ra đời, thực hiện ý tưởng cho đến lúc sản phẩm cất cánh được hàng triệu người biết đến. Hàng loạt các câu chuyện gặp phải trong quá trình này.
Để bắt đầu xin nói về câu hỏi mà gây nhiều tranh cãi “Người chọn việc hay việc chọn người?”, nó giống như “Con gà có trước hay quả trứng có trước”. Dù bạn ở trường phái nào, chọn phương án nào thì cũng chúc mừng bạn vì bạn đã có quyết định của riêng mình. Còn riêng, tôi trong trường hợp của tôi, “Việc đã chọn người”. Tôi bắt đầu được tham gia vào làm các sản phẩm một cách tình cờ, không như dự định ban đầu đề ra. Khi còn đang thực tập tốt nghiệp cho đến khi ra trường tôi không có ý định sẽ đầu quân cho 1 công ty startup làm về sản phẩm nghĩa là công ty này có ý tưởng về một sản phẩm nào đó có khả năng đáp ứng nhu cầu nào đó, sau đó tự lên kế hoạch phát triển và phát hành ra thị trường. Nó khá giống với việc bạn kết hôn và sinh ra 1 baby vậy. Bạn có trách nghiệm và nghĩa vụ nuôi baby đó lớn lên. Nó khác hoàn toàn với các công ty outsourcing. Các phần sau sẽ nói rõ hơn về sự khác biệt giữa các công ty làm sản phẩm ‘product’ và các công ty gia công ‘outsourcing’. Việc may mắn được tham gia vào các công ty startup chuyên làm sản phẩm và các công việc này đã chọn tôi đã mang lại cho tôi rất nhiều trải nghiệm sâu sắc, khác biệt về công việc của việc phát triển sản phẩm, sau này gọi là mindset của người làm sản phẩm.
Nếu xem sản phẩm của công ty như một MV thì những người tham qua vào quá trình làm ra đều được gọi là người làm sản phẩm. Đó có thể là người lên ý tưởng, người biên tập, quay phim, sản xuất, tất tần tật để cho ra đời MV đó. Điều khác biệt MV thành công hay không chỉ là kết quả của MV đó đạt được mục đích đề ra hay không như ý nghĩa truyền đạt, lượt xem, tầm ảnh hưởng của sản phẩm đến công chúng, doanh thu... Việc phát triển một sản phẩm công nghệ cũng như vậy.
Với người dùng họ nghĩ rằng việc thành công nhất của một sản phẩm là tiền nghĩa là sản phẩm mang lại giá trị lớn, tầm ảnh hưởng rộng là thành công. Còn với chính người làm sản phẩm đó, thành công chính là sự ghi nhận những nỗ lực được đền đáp xứng đáng trong quá trình làm sản phẩm đó. Những cảm xúc trong quá trình làm từ lúc Product in development, first user, cho đến khi được mọi người biết đến. Đó là cảm xúc khi sản phẩm của mình được hiện diện ở mọi nơi từ poster ở rạp phim, decan trên xe buýt, hay chính trên banner quảng cáo trong cái điện thoại của thằng bạn đang chơi game bên cạnh. Đó là sự ghi nhận lớn nhất mà người làm sản phẩm cảm nhận và tự hào.
Bài viết này sẽ là các câu chuyện mà bạn gặp phải trong quá trình làm sản phẩm. Nếu bạn làm ở ngành nghề khác, bạn có thể hình dung được việc phát triển 1 sản phẩm công nghệ mà bạn đang dùng như Zalo, Facebook, Instagram,... là như thế nào, tại sao những sản phẩm đó có mặt trên thế giới này và nó ra đời như thế nào... Còn nếu bạn đang làm việc trong ngành tech, trong các công ty công nghệ bạn sẽ bắt gặp đâu đó là hình ảnh của chính mình, là công việc đang từng thực hiện, là cảm xúc thật bạn đã trải nghiệm qua.
Xin nhắc lại, những câu chuyện này luôn là sự thật, ghi lại những khoảnh khắc thật từ những con người thật. Đó chính là sứ mệnh của Page!

25 thg 5, 2012

Làm việc với Service trong Android.

Bài viết nhằm mục đích hiểu về gọi đến 1 service theo con đường gọi phương thức bindService() trong lập trình Android.
Mục tiêu : Tạo 1 service có chức năng tính toán và trả về kết quả của phương thức cộng 2 số nguyên.

Màn hình chương trình khi gọi phương thức cong2so(5,5) từ 1 service như sau :

Hàm onCreate(bundle) : nhận các đối tượng về từ giao diện :

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.tv);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }

Trước hết, tạo 1 lớp có tên là MyService mở rộng từ lớp Service như sau :
public class MyService extends Service {

    // Binder cho cac client
    private final IBinder mBinder = new LocalBinder();
   
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return mBinder;
    }
    //phương thức cho các client có thể gọi.
    public int cong2So(int a, int b){
        return a + b ;
    }
   
    public class LocalBinder extends Binder {
        // Trả về đối tượng MyService để cho client có thể gọi public method
        MyService getService(){
            return MyService.this;
           
        }       
    }
}

Trở lại Activity chính của ứng dụng :

Trong hàm OnStart() chúng ta dùng phương thức bindService(parameter) để gọi đến MyService thông qua đối tượng Intent .
 
@Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        // Bind to MyService
        Intent i = new Intent(this, MyService.class);
        bindService(i, mConnection, Context.BIND_AUTO_CREATE) 
    }

Trong hàm onStop() : Ngắt kết nối đến MyService
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        //Unbind from Service
        if(mBound){
            mService.unbindService(mConnection);
            mBound = false ;
           
        }
    }

Tạo 1 biến mConnection từ lớp ServiceConnection nhằm Overide 2 phương thức sau nhằm bound đến MyService.
private ServiceConnection mConnection = new ServiceConnection() {
       
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBound = false;
        }
       
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // Bound to MyService.
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }
    };;;

Cuối cùng trong phương thức onClick của button ta gọi đến hàm cong2so(int,int) và hiển thị kết quả của phương thức ra 1 textview như sau :
@Override
    public void onClick(View v) {
        if(v.getId() == R.id.button){
            if(mBound){
                int result = mService.cong2So(5, 5);
                tv.setText(new String().valueOf(result));
            }
        }
    }

Trong Android manifesh.xml thêm dòng này :  <service android:name="MyService"></service> trong thẻ <application>

file main.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>



23 thg 5, 2012

Souce code client server trên Android qua tcp socket programing

Mục tiêu :
- Demo cách thức hoạt động của client server qua giao thức TCP.
- Gửi nhận dữ liệu giữa Server và Client.
- Xây dựng các ứng dụng client/server trên các thiết bị chạy android độc lập, không phụ thuộc vào pc.

Ý tưởng :
- Gửi dữ liệu từ client lên server.
- Hiển thị dữ liệu ra editText.
- Thông báo toast notification khi dữ liệu được gửi đến.

Cần biết :
- Socket và SocketServer.
- Toast Notification.
- Telnet Client.

 Code :
- Cài đặt dịch vụ telnet client trên máy tính.
- Khởi động 2 máy ảo emulator.
- Vào cdm gõ lệnh sau : telnet localhost 5554 .
- Tiếp tục gõ lệnh :  redir add tcp:9999:999 để cấu hình ánh xạ port giữa local port và server port cho máy ảo 5554 qua port 9999.

Làm đúng sẽ có hình như sau :

Bây giờ chúng ta chạy ứng dụng server trên máy ảo 5554, client trên máy ảo 5556.
Kết nối giữa client và server qua port 9999 và ip : 10.0.2.2 . 

Thực hiện đúng chúng ta sẽ có hình minh họa sau : 

 
 Bên trái là server, bên phải là client. Chú ý các phần được bôi khung vàng. Chúc vui.









14 thg 5, 2012

QuickAction UI Android


Hiện thực được QuickAction UI chúng ta sẽ có hình như sau :
Bài này mình kham khảo từ trang web sau : http://www.edumobile.org/android/android-apps/quick-action-demo/ 


Sourcode Code được cung cấp bởi trang web đó. 
Nếu bạn nào có thắc mắc điều gì, thì để lại comment mình sẽ giải thích nếu có thể.
Bạn nào muốn lấy source code thì để lại email nhé. Chúc vui. 
QuickAction là 1 UI Control không có sẵn trong Android SDK nhé. 

Một loại hiển thị khác của QuickAction 3D.


Một số phương thức vẽ các hình thông dụng


Khi nhấp vào các button thì ứng dụng sẽ vẽ các hình trên các View.
Thứ tự như sau :






Source code ứng dụng :   http://and-sungha-blog.googlecode.com/files/Draw.rar

Multi Choice ListView

Cách sử dụng ListView với nhiều sự lựa chọn. Sử dụng với layout ListView đã được hỗ trợ sẵn.
Các bạn hoàn toàn có thể custom lại ListView với nhiều sự lựa chọn tùy vào ngữ cảnh của ứng dụng.
Dễ dàng nhất là chúng ta sử dụng các tài nguyên đã được xây dựng sẵn.

Code :

public class MutilChoiseListViewActivity extends Activity {
    private ListView choiceLV;
    private String[] choice = { "String A", "String B", "String C", "String D" };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        choiceLV = (ListView) findViewById(R.id.list);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_multiple_choice, choice);
        choiceLV.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        choiceLV.setAdapter(adapter);
       

    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</LinearLayout>

21 thg 4, 2012

[Lập Trình Bada] Làm quen với Bada

Làm quen với bada. Các tạo môi trường làm việc trên hệ điều hành bada của Samsung. 
Ngôn ngữ sử dụng để phát triển trên hệ điều hành này là C++ .
Tuy nhiên Bada IDE có hỗ trợ giao diện trực quan kéo thả và sinh code tự động. 

Download IDE lập trình bada os tại đây : http://developer.bada.com/devtools/sdk
IDE có giao diện nguồn mở, các tính năng và cách sử dụng hoàn toàn giống eclipse. Một điều mà mình ưng ý nhất.
Bada là 1 hệ điều hành còn ít người biết đến, các lập trình viên ít chú ý, tuy rằng Samsung cũng đã có lần tổ chức cuộc thi viết ứng dụng trên hệ điều hành này. 

Dưới đây là source code đơn giản làm quen với bada os . download tại đây .



Bada OS có phát triển hay không, cũng như các OS khác. Một phần nhờ vào sự khám phá của LTV. Hi vọng các bạn sẽ thích thú với OS này. 

[Lập trình BlackBerry Mobile] Làm việc với các UI Control đơn giản


Cách làm việc với các control giao diện đơn giản trong lập trình trên các thiết bị chạy hệ điều hành Black Berry.
Đầu tiên có thể chia làm 3 loại sau :
1. Field: như LabelField, CheckboxField ...
2. Manager.
3. Screen.
Như trên hình các bạn thấy, có các button, checkbox, bitmapField, editField là các thực thể chúng ta cần xử lý.
Đoạn code dưới đây sẽ cho bạn biết cách thực hiện tạo các đối tượng, xử lý các sự kiện trên đối tượng đó.
Mình dùng IDE: Blackberry java Plug-in 1.5 và emulator : BlackBerry 9930.
Code tạo ra các đối tượng và thêm các đối tượng vào Screen :


Bitmap bitmap = Bitmap.getBitmapResource("img/ic_logo.png");
BitmapField bitmapField = new BitmapField(bitmap, Field.FIELD_HCENTER);
add(bitmapField);

add(new SeparatorField());
add(new LabelField("Please enter your infomation ?"));

usernameField = new EditField("Username", "");
passwordField = new EditField("Password", "");
add(usernameField);
add(passwordField);

domainField = new ObjectChoiceField("Domain :", new String[] { "Home",
"Work" });
add(domainField);

rememberChechBox = new CheckboxField("Remember password ?", false);
add(rememberChechBox);

add(new SeparatorField());
clearButton = new ButtonField("Clear", ButtonField.CONSUME_CLICK);
loginButton = new ButtonField("Login", ButtonField.CONSUME_CLICK);

HorizontalFieldManager buttonManager = new HorizontalFieldManager(
Field.FIELD_RIGHT);
buttonManager.add(clearButton);
buttonManager.add(loginButton);
add(buttonManager);

Đăng ký xử lý sự kiện cho 2 button clear and login button như sau :
trước hết chúng ta implements interface : FieldChangeListener.
đăng ký sự kiện :


clearButton.setChangeListener(this);
loginButton.setChangeListener(this);

Và xử lý sự kiện trong phương thức  :   fieldChanged



public void fieldChanged(Field field, int context) {
// TODO Auto-generated method stub
if (field == clearButton) {
// Dialog.inform("clear button clicked!!!");
clearTextFields();
}
if (field == loginButton) {
// Dialog.inform("login button clicked!!!");
login();
}
}



  private void login() {
// TODO Auto-generated method stub
if (usernameField.getTextLength() == 0
|| passwordField.getTextLength() == 0) {
Dialog.inform("Please enter text field!!!");
} else {
String username = usernameField.getText();
String selectedDomain = (String) domainField.getChoice(domainField
.getSelectedIndex());
LoginSuccessScreen loginSuccessScreen = new LoginSuccessScreen(
username, selectedDomain);
UiApplication.getUiApplication().pushScreen(loginSuccessScreen);
}
}




private void clearTextFields() {
// TODO Auto-generated method stub
usernameField.setText("");
passwordField.setText("");
}



Vì BlackBerry thừa hưởng rất nhiều từ nền tảng JavaME nên nếu nắm chắc các điểm quan trọng của ngôn ngữ java bạn sẽ dễ nắm bắt hơn.




Phương thức tạo menu trong lập trình bb :

 protected void makeMenu(Menu menu, int instance) {
// TODO Auto-generated method stub
super.makeMenu(menu, instance);
menu.add(new MenuItem("Login", 20, 10){
public void run() {
// TODO Auto-generated method stub
login();
}
});
menu.add(new MenuItem("Clear", 10, 20){
public void run() {
clearTextFields();
}
});

}



Download project tại đây

Bạn nên thực hành trước khi import project. Nếu có thắc mắc gì, comment ở dưới bài viết này. Thân.






6 thg 4, 2012

Vẽ đường đi giữa 2 tọa độ trên MapView

Đây là 1 bài viết vẽ đường đi giữa 2 tọa độ trên maps sử dụng kml file. 
Bài viết được lấy trên blog của  1 người TQ. Mình đang làm việc với mapview trên android tại thời điểm này.
Đã test thành công.
Link Blog tại đây : http://csie-tw.blogspot.com/2009/06/android-driving-direction-route-path.html.
Bonus hình : 
Bạn nào thắc mắc chỗ nào, có thể để lại thắc mắc dưới đây, mình sẽ giải đáp trong kiến thức cho phép. 
Bạn nào muốn lấy project thì để lại Email. Mình sẽ gửi nếu có thể. Thân mến. 

3 thg 4, 2012

Source code ứng dụng tìm địa điểm trên Android

Đang viết ứng dụng này. Mới xong được phần 1 của ứng dụng.
Up thử lên youtube xem nào. :D
Phần mềm giải quyết các điểm sau :
- Kết nối đến web services của Google Places API.
- Kết nối đến web services tự tạo ra để lấy csdl về client.
- Hiển thị kết quả lên google maps view như : thông tin Atm, bookstore,Gas,....
- Chỉ đường đi từ GPS location hiện tại của thiết bị đến địa điểm đó.
Đây mới chỉ là Ver 1.0


31 thg 3, 2012

Phương thức lấy CSDL SQL SERVER thông qua Web Service



//Phương thức lấy tên thành phố theo mã thành phố được truyền vào.
        public static Model.City GetCityIdOfNameCity(string cityId)
        {


         
            try
            {


                conn = new SqlConnection(cs);
                string sql = "SELECT cityName FROM city WHERE cityId = '" + cityId + "' ";
                SqlCommand cmd = new SqlCommand(sql, conn);
                conn.Open();
                reader = cmd.ExecuteReader();
                reader.Read();


                Model.City city = new Model.City();


            //    city.CityID = reader["cityId"].ToString();
                city.CityName = reader["cityName"].ToString();
            //    city.CityDescript = reader["cityDescription"].ToString();
                return city;
            }
            catch (Exception exp)
            {
                //Adding logging
                HttpContext.Current.Trace.Warn("Error", "Error in GetCityIdOfNameCity", exp);
            }
            finally
            {
                if (reader != null) reader.Close();
                if (conn != null && conn.State != ConnectionState.Closed) conn.Close();
            }
            return null;
        }



        //Phương thức lấy tất cả tên thành phố trong bảng "city"
        // Kết quả trả về là 1 List
        public static List<string> GetAllCity()
        {


            try
            {
                conn = new SqlConnection(cs);
                string sql = "SELECT cityName FROM city";
                SqlCommand command = new SqlCommand(sql, conn);
                conn.Open();
                reader = command.ExecuteReader();
                 List<string> _allCity = new List<string>();
                while (reader.Read())
                {
                    _allCity.Add(reader.GetString(0));
                }
                return _allCity;


            }
            catch (Exception)
            {
                HttpContext.Current.Trace.Warn("Error", "Error at GetAllCity !!!!");
            }
            finally
            {
                if (reader != null) reader.Close();
                if (conn != null && conn.State != ConnectionState.Closed) conn.Close();
            }
            return null;
        }


        //Phương thức lấy tất cả tên ngân hàng trong bảng "bank"
        // Kết quả trả về là 1 List

        public static List<string> GetAllBank()
        {


            try
            {
                conn = new SqlConnection(cs);
                string sql = "SELECT bankName FROM bank";
                SqlCommand command = new SqlCommand(sql, conn);
                conn.Open();
                reader = command.ExecuteReader();
                List<string> _allBank = new List<string>();
                while (reader.Read())
                {
                    _allBank.Add(reader.GetString(0));
                }
                return _allBank;


            }
            catch (Exception)
            {
                HttpContext.Current.Trace.Warn("Error", "Error at GetAllBank !!!!");
            }
            finally
            {
                if (reader != null) reader.Close();
                if (conn != null && conn.State != ConnectionState.Closed) conn.Close();
            }
            return null;




        }



        //Lấy các quận theo tên mã thành phố truyền vào
        public static List<string> GetDistrictOfCity(string cityId){

            try
            {
             
             
                conn = new SqlConnection(cs);
                string sql = "SELECT distrctName FROM district WHERE cityId = '" + cityId + "' ";
                SqlCommand command = new SqlCommand(sql, conn);
                conn.Open();
                reader = command.ExecuteReader();
                List<string> _allDist = new List<string>();
                while (reader.Read())
                {
                    _allDist.Add(reader.GetString(0));
                }
                return _allDist;
            }
            catch (Exception)
            {
                HttpContext.Current.Trace.Warn("Error", "Error at GetDistrict !!!!");
            }
            finally
            {
                if (reader != null) reader.Close();
                if (conn != null && conn.State != ConnectionState.Closed) conn.Close();
            }
            return null;


      }

     
        //Lấy các cây atm theo ngân hàng và quận trong thành phố
        public static List<string> getAtms(string bankId, string districtId)
        {
            try
            {




                conn = new SqlConnection(cs);
                string sql = "SELECT atmName FROM atm WHERE districtId = '" + districtId + "' AND  bankId = '" + bankId + "'";
                SqlCommand command = new SqlCommand(sql, conn);
                conn.Open();
                reader = command.ExecuteReader();
                List<string> _allAtms = new List<string>();
                while (reader.Read())
                {
                    _allAtms.Add(reader.GetString(0));
                }
                return _allAtms;
            }
            catch (Exception)
            {
                HttpContext.Current.Trace.Warn("Error", "Error at GetDistrict !!!!");
            }
            finally
            {
                if (reader != null) reader.Close();
                if (conn != null && conn.State != ConnectionState.Closed) conn.Close();
            }
            return null;


        }


database download tại đây : http://code.google.com/p/and-project-lbd/downloads/detail?name=data.rar&can=2&q=#makechanges

30 thg 3, 2012

Web Service kết nối đến CSDL SQL Server.

Hôm nay tôi sẽ trình này cách dùng Web service để kết nối đến CSDL. nhằm giúp các ứng dụng client có thể dễ dàng dùng CSDL cần thiết đang cần dùng.
cây thư mục của Project mà chúng ta sẽ thực hiện :



Ý tưởng : Ta có Database DBAtm.mdf có chứa 1 table với tên là city và các thuộc tính như cityId, cityName, cityDescription. Mục đính của chúng ta là sẽ viết 1 web service có thể gọi tìm kiếm theo cityId.

Đầu tiên các bạn tạo ra 1 class City.cs với nội dung sau :
Các phương thức set/get của các thuộc tính trong lớp này nhằm hiện thực các cột trong bảng city.





Sau đó các bạn vào Web.config thêm vào  thẻ <connectionString/> 1 thẻ <add/> với nội dung như sau :

<connectionStrings>
    <add name ="connStr" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=D:\ATMsService\ATMsService\data\DBAtm.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"/>
  </connectionStrings>

Chú ý đến đoạn bôi dấu đỏ : đó chính là đường dẫn tuyệt đối đến thư mục data chứ CSDL của bạn.

Tiếp theo bạn tao 1 lớp DAL có mục đính nhằm kết nối đến CSDL và truy vấn nó.
Phương thức truy vấn của tôi như sau :


public static Model.City GetCity(string cityId)
        {
            SqlDataReader reader = null;
            SqlConnection conn = null;
            string cs = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            try
            {

                conn = new SqlConnection(cs);
                string sql = "SELECT cityId, cityName, cityDescription FROM city WHERE cityId = '" + cityId + "' ";
                SqlCommand cmd = new SqlCommand(sql, conn);
                conn.Open();
                reader = cmd.ExecuteReader();
                reader.Read();

                Model.City city = new Model.City();
                city.CityID = reader["cityId"].ToString();
                city.CityName = reader["cityName"].ToString();
                city.CityDescript = reader["cityDescription"].ToString();
                return city;
            }
            catch (Exception exp)
            {
                //Adding logging
                HttpContext.Current.Trace.Warn("Error", "Error in GetCity", exp);
            }
            finally
            {
                if (reader != null) reader.Close();
                if (conn != null && conn.State != ConnectionState.Closed) conn.Close();
            }
            return null;
        }




Bạn chỉ cần quan tâm đến những dòng đã được bôi đỏ.

Sau đó bạn tạo tiếp 1 class với tên BAL.cs với mục đính gọi lại phương thức GetCity của class DAL
như sau :

namespace Biz
{
    public class BAL
    {
        public static Model.City GetCity(string cityId)
        {
            Model.City city = DATA.DAL.GetCity(cityId);
            city.CityName = city.CityName + "ACME";
            return city;
        }
    }
}



Cuối cùng trong class ATMsService bạn gọi lại phương thức GetCity của lớp BAL với 1 câu lệnh duy nhất như sau.

[WebMethod]
        public Model.City GetCity(string cityId)
        {
            return Biz.BAL.GetCity(cityId);
        }

kết quả nhận được khi chúng ta chạy web service này như sau :
Trong table city của tôi có 1 bộ : [hcm,Thành phố HCM, Tỉnh thành Hồ Chí Minh, Việt Nam].
Tôi sẽ tìm kiếm bộ này theo tên : hcm.
kết quả như sau :


Bonus : phương thức lấy tất cả tên thành phố trong table city như sau :


   public static List<string> GetAllCity()
        {
            SqlDataReader reader = null;
            SqlConnection conn = null;
            string cs = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            try
            {
                 conn = new SqlConnection(cs);
                 string sql = "SELECT cityName FROM city" ;
                 SqlCommand command = new SqlCommand(sql,conn);
                 conn.Open();
                 reader = command.ExecuteReader();
                 List<string> _allCity = new List<string>();
                while (reader.Read())
           {
                _allCity.Add(reader.GetString(0));
               }
                return _allCity;
 
            }
            catch (Exception)
            {
                HttpContext.Current.Trace.Warn("Error", "Error at GetAllCity !!!!");
            }finally{
                if(reader != null) reader.Close();
                if(conn != null && conn.State != ConnectionState.Closed) conn.Close();
            }
            return null;
        }
    }




Như vậy chúng ta đã có thể dùng web service truy xuất đến csdl sql server trên nền tàng .Net.
Bài sau mình sẽ dùng KSoap2 trên android để truy xuất CSDL từ Webservice này.

Download project tại đây : http://code.google.com/p/and-sungha-blog/downloads/detail?name=ATMsService.rar&can=2&q=#makechanges




25 thg 3, 2012

Học lập trình nhanh hơn.

Học lập trình không phải là chuyện mà ta có thể làm trong một sớm, một chiều, nhưng nó không phải là quá khó khăn. Có rất nhiều điều bạn có thể làm cho nó dễ dàng hơn khi bạn học lập trình. Bài viết sau đây được tham khảo từ trang web cprogramming.com sẽ có thể giúp ích cho chúng ta khám phá được những bí quyết để học lập trình tốt hơn và nhanh hơn.
Một trong những chủ đề được nói đến rất nhiều về mẹo học lập trình là:
Đừng đi quá nhanh, hãy nắm bắt nó trước khi đi tiếp. (Don’t go too fast, get it right before move on)


Chúng ta thường thắc mắc tại sao trong lớp học của mình, có một số bạn của chúng ta biết trước về một số ngôn ngữ lập trình. Trong những tuần đầu tiên học thường nắm bắt kiến thức rất nhanh, nhưng càng về sau họ lại bị bỏ ở đằng sau bởi những sinh viên khác. Tại sao họ lại bị bỏ xa trong khi nền tảng của họ tốt hơn.???
Đó chính là việc họ đã đi quá nhanh, và lối mòn của họ là tưởng rằng mình biết tất cả nhưng thực sự họ hiếm khi thực hiện công việc lập trình. Có thể họ biết một số cái nâng cao hơn so với những sinh viên foundationkhác, nhưng bấy nhiêu đó là không đủ để nắm vững các nguyên tắc cơ bản. Cũng giống như khi chúng ta làm bài kiểm tra môn toán thường có 8 điểm là có một người có học lực khá có thể đạt được, nhưng có một số sinh viên làm được bài 2 điểm khó kia và có một số bài tập cơ bản vẫn chưa hoàn thành, nên kết quả không bằng một sinh viên nắm vững các kiến thức cơ bản có thể làm được.
Do đó, trước tiên chúng ta cần tạo cho mình một nền tản (Foundation) tốt bằng cách thường xuyên luyện tập thực hành cái bài tập lập trình. Trong quá trình luyện tập như vậy bạn sẽ thấy được những vấn đề cơ bản mà các lập trình viên thường mắc phải. Và tạo cho mình một thoái quen tốt để giải quyết vấn đề.
Đồng thời bạn đừng bao giờ ngừng tiến trình luyện tập của mình, cũng không nên đi quá nhanh hay quá chậm. Đừng tránh một chủ đề nào sau khi bạn đã nắm vững tất cả những gì dẫn đến nó. Bằng cách đối mặc với nhiều ý tưởng và thách thức, bạn sẽ có một chất men giúp bạn nhanh chóng nắm bắt được những vấn đề cơ bản. Sau đây là 5 cách để bạn định hướng được việc học lập trình nhanh hơn.
1. Xem các code ví dụ (Look at the Example Code):
- Khi đọc sách chúng ta thường đọc các từ trên trang sách đó, nhưng học lập trình thì đó là code. Khi bạn mới bắt đầu học lập trình, bạn nên xem xét kỹ lưỡng và cố gắng hiểu từng ví dụ. Trước khi đọc các lời giải thích về chương trình trong sách, bạn nên cố gắng đọc và hiểu các đoạn code màread code tác giả đã viết dùng để làm gì. Tuy các ví dụ đó không phải khi nào đánh vào máy cũng chạy, nhưng nó tập cho chúng ta một thoái quen xem code cẩn thận và góp phần giúp chúng ta viết code rõ ràng hơn.
- Chúng ta phải viết code làm sao để cho các lập trình viên khác có thể đọc và hiểu nó, và để khi chính mình nhìn lại cũng nắm được. Do đó cần phải tuân thủ những nguyên tắc, và cú pháp khi viết code để đảm bảo kiểm tra lỗi đơn giản hơn, các phần hướng dẫn viết code theo một mẫu chuẩn thường được viết ở đầu các cuốn sách lập trình, nhưng ít người học lập trình để ý đến vấn đề này
2. Đừng chỉ đọc các code ví dụ -  hãy chạy thử nó (Don’t just Read exam code – Run It)
- Khi bạn đọc một chương trình hướng dẫn (hay một cuốn sách), bạn thường xem các code ví dụ của nó và nói “Tôi đã nắm được nó, tôi đã hiểu được nó….”. Tất nhiên là bạn có thể nắm được nó, nhưng bạn thực sự chưa hiểu được nó hoạt động như thế nào, cho kết quả ra sao.f5
Do đó trước khi đọc một cuốn sách về lập trình, bạn nên cài trình biên dịch của ngôn ngữ mà bạn đang học vào máy (ví dụ học C++ thì bạn cài Dev C++ hay visual c++). Để sẵn sàng chạy thử tất cả các ví dụ trong cuốn sách hay chương trình mà bạn đang đọc.
- Tôi nói chạy thử ở đây không phải là copy rồi paste vào rồi nhấn F5. Tôi khuyên bạn nên tự mình đánh những đoạn code đó vào chương trình biên dịch, vì khi đó bạn thực sự buộc mình phải đi qua tất cả các mã,việc gõ mã lệnh sẽ giúp bạn chú ý đến các chi tiết cú pháp của ngôn ngữ – những sự thiếu soát buồn cười như thiếu đấu chấm phẩy ở cuối mỗi câu lệnh có thể làm bạn hết sức đâu đầu.
- Sau khi gõ mã lệnh vào chương trình, hãy chạy thử nó. Rồi viết thêm một số câu lệnh mới vào chương trình của mình xem nó có hoạt động xem. Điều đó sẽ giúp bạn hiểu nhanh hơn mỗi câu lệnh có ý nghĩa như thế nào.
3. Hãy viết mã riêng của bạn  càng sớm càng tốt (Write your own code as soon as possible).
- Khi bắt đầu viết một chương trình bạn không biết phải bắt đầu từ đâu, sử dụng cấu trúc dữ liệu gì? Việc phân bổ viết code như thế nào? Xử lý các phương thức ra sao?… Điều đầu tiên là bạn sử dụng các công cụ tìm kiếm ở google hoặc các công cụ tìm kiếm khác để tìm kiếm đoạn mã mình cần. Đây là một điều có thể làm cho tư duy lập trình của bạn ngày càng giảm đi và ngày càng bị lệ thuộc vào các công cụ tìm kiếm.
write- Giải pháp được đưa ra trong trường hợp này là bạn hãy tự nghĩ cho mình một thuật toán riêng. Đầu tiên bạn viết nó bằng mã giả, sau đó dùng ngôn ngữ lập trình để viết lại. Tuy việc này rất khó và tốn nhiều thời gian, nhưng nó sẽ giúp bạn có được những kinh nghiệm thực sự hữu ích, khả năng tư duy lập trình ngày càng phát triển. Thay vì lên mạng tìm code về sửa.
- Trường hợp ý tưởng chương trình của bạn lớn, phải viết một lượng lớn code. Khi đó bạn hãy phân nhỏ từng tính năng chương trình của mình ra, tự tập thiết kế cấu trúc của chương trình nhỏ đó, rồi ghép chúng lại với nhau sẽ được một chương trình lớn hoàn chỉnh hơn. Có thể chương trình đó không hoạt động tốt, nhưng cái mà bạn được ở đây chính là kinh nghiệm và một tư duy tự lập trong lập trình.
4.  Tìm hiểu cách sử dụng một công cụ Debug (Learn to use a Debugger)
- Debug là một công cụ rất tốt dùng để gỡ rối chương trình của bạn khi có một lỗi nào đó là chương trình bạn chạy sai. Nó cho bạn theo dõi giá trị của các biến và các thay đổi của chúng qua từng mã lệnh của chương trình. Công cụ debug mạnh nhất có lẽ được tích hợp trong các sản phẩm của Microsoft như Visual Studio (Hiện nay là visual studio 2010). Công cụ debug giúp chúng ta hiểu chương trình của mình hơn, và là thứ chúng ta cần phải biết khi viết chương trình.
-  Một chương trình debug có thể giúp bạn nhanh chóng trả lời những gì mà bạn đang làm như ví dụ bên dưới.
int main() { int x; int y; if( x > 4 ) // <— Giá trị của X ở đây là bao nhiêu? { y = 5; // <— Dòng code này thực thi như thế nào? } }
- Và lời khuyên cuối cùng về debug là: khi bạn lần đầu tìm hiểu về debuger, có thể nó sẽ làm bạn mất khá nhiều thời gian khi bạn sửa lỗi chương trình của mình. Nhưng khi bạn nắm được các kiến thức về debug nó sẽ đem lại cho bạn một lợi ích lớn trong việc tiết kiệm thời gian khi sửa lỗi chương trìdebugsnh. Tôi tin rằng mỗi bạn đều có thể tìm ra cho mình một cách debug chương trình hiệu quả, bởi nó sẽ theo suốt sự nghiệp lập trình của bạn.
- Tôi thường thấy các sinh viên khác không muốn sử dụng công cụ debug (có thể là không biết giống như tôi lúc trước). Những sinh viên đã tự làm khó mình trong việc tìm kiếm lỗi sai trong chương trình. Do đó khi bạn đã xác định theo con đường lập trình, hãy học cách sử dụng một công cụ debug, nó sẽ mang lại cho bạn nhiều lợi ích thiết thực hơn bạn nghĩ.
5. Tìm kiếm thêm những nguồn tài tài liệu khác (Seek our more sources)
- Khi bạn không hiểu một điều gì đó, internet là một nơi với lượng thông tin khổng lồ mà bạn tìm đến. Thế nhưng có những bài viết về đề tài mà bạn muốn tìm thì lại được tác giả viết sơ sài, hoặc có thể sai. Do đó bạn phải hết sức thận trọng khi sử dụng các thông tin từ internet vào chương trình của mình.
- Ngoài ra việc tìm kiếm một cuốn sách với những giải thích chi tiết sẽ giúp bạn nhanh chóng nắm được vấn đề hơn.knowlege
- Bạn cũng có thể tham gia vào các diễn đàn về lập trình (ví dụ lập trình c, c++, c# thì có diễn đàn Congdongcviet.com), khi không hiểu một vấn đề gì đó bạn có thể post bài để các thành viên trong diễn đàn giúp đỡ cho bạn. Nếu có khả năng về tiến anh thì bạn lên các diễn đàn nước ngoài sẽ có nhiều thành viên xuất sắc ở đó tìm kiếm thông tin và trả lời giúp (codeproject.com, cprogramming.com, cplusplus.com…). Lưu ý khi hỏi trên các diễn đàn bạn phải đặt câu hỏi ngắn gọn, tập trung vào mô tả nội dung vấn đề mà bạn đang gặp vướng mắc thì bạn sẽ nhận được câu trả lời tốt hơn.
- Việc trước mỗi buổi học nên chuẩn bị một danh sách các câu hỏi về những vướng mắc mà bạn gặp phải vào một cuốn sổ tay nhỏ để lên hỏi giáo viên hoặc bạn bè là một việc rất có ích, nó sẽ giúp bạn tiếp thu hơn, và nó cho thấy rằng bạn là một con người cầu tiến, ham học hỏi.
- Cuối cùng là việc hết sức quan trọng, Học Nhóm. Học nhóm sẽ giúp bạn tiến bộ nhanh hơn, tăng cường khả năng giao tiếp với bạn bè và đồng nghiệp sau này. Khi làm việc nhóm bạn sẽ viết ra được những chương trình lớn hơn và có sức thuyết phục người dùng hơn. Tôi khuyên bạn đừng bao giờ ôm hết công việc về mình.
Mong rằng bài viết này có thể giúp chúng ta nắm được những nguyên tắc cơ bản của môt người mới bắt đầu đi vào thế giới lập trình.
(Theo cprogramming.com)







Bản beta đầu tiên

Sau 6 tháng cả team cặm cụi làm việc điên cuồng, bản alpha cũng được giới thiệu ra toàn bộ công ty và được testing nội bộ công ty mà thôi. ...