Tại sao bạn nên chọn PHP để lập trình web?

Bài viết được dịch từ trang web SitePoint

Đó là một câu hỏi phổ biến. Tại sao thực sự nên chọn PHP chứ không phải là một lựa chọn nào khác? Sau tất cả, PHP thường bị xem như là một ngôn ngữ lộn xộnkhông sử dụng được và có thiết kế rất tồi. Tại sao mọi người chọn nó khi bắt đầu một dự án từ đầu?

Thay vì liệt kê những lý do tại sao mọi người chọn nó (cái này có rất nhiều), chúng ta hãy tập trung vào lý do tại sao mọi người nên chọn nó. Tuy nhiên, chúng ta không thể nói về điều đó mà không đề cập đến những trường hợp mà nó không nên được sử dụng.

Khi nào thì bạn KHÔNG nên chọn PHP

Khi viết các ứng dụng dạng command line

Nếu bạn xây dựng một ứng dụng dạng dòng lệnh (command line), PHP không phải là sự lựa chọn đúng. Chắc chắn là cũng có những cách tiếp cận tốt để xây dựng ứng dụng CLI (Command Line Interface) bằng PHP, nhưng chỉ đơn giản là nó không được thiết kế với mục đích làm điều đó. Đầu tiên và trước hết, PHP là một ngôn ngữ web, và một ứng dụng thuần command line tốt hơn là nên được xây dựng bằng một ngôn ngữ khác. Điều đó không phải để nói rằng nó không thể – mà chắc chắn ứng dụng đó sẽ nhanh hơn và dễ dàng hơn khi thực hiện bằng một ngôn ngữ khác. Việc xây dựng các ứng dụng CLI bằng PHP thì tự bản thân nó chính là phép ẩn dụ mà người ta sử dụng khi so sánh PHP với một cái búa có hai đầu dùng để nhổ đinh. Chỉ vì nó không phải là công cụ dành cho việc đó. Ví dụ – Python được cài đặt sẵn trên hầu hết các hệ điều hành họ *nix, vì vậy bạn có thể truy cập ngay lập tức tới nó mà không cần phải vọc vậy chỉnh sửa file php.ini, và có thể bắt đầu làm việc ngay lập tức.

Khi nó có vẻ như dễ dàng nhất

Nếu PHP có vẻ là cách dễ dàng nhất trong các ngôn ngữ và đó là động lực duy nhất của bạn, thì sự lựa chọn đó của bạn là sai lầm. PHP có thể trở nên phức tạp một cách nhanh chóng, và phải thừa nhận rằng việc dễ dàng hơn những ngôn ngữ khác là điều không thực tế. Việc thực hiện những dự án quan trọng thì độ khó cũng tương đương nhau trong bất kỳ ngôn ngữ nào.

Chỉ vì nhà cung cấp hosting của bạn hỗ trợ nó

Nếu bạn đang sử dụng một shared host, và vui sướng với thực tế rằng nó hỗ trợ PHP (thậm chí không phải là phiên bản mới nhất), hãy dừng lại. Nếu bạn đang xem mình là một nhà phát triển phần mềm, thì đừng bao giờ sử dụng các shared host cho bất cứ điều gì ngoại trừ một số thứ lặt vặt như custom webmail, quản lý domain, hoặc những demo hết sức đơn giản. Với những lựa chọn thay thế như DigitalOcean cung cấp các máy chủ riêng ảo (VPS – Virtual Private Server) được lưu trữ trên ổ SSD với chi phí ít nhất là $5 đô-la/tháng, thì việc chọn một shared host không có ý nghĩa gì – vì VPS mang lại cho bạn nhiều quyền kiểm soát hơn. Nếu bạn không hài lòng với đội ngũ DevOps của họ và không thích tự tay thiết lập server (dù vậy bạn thực sự nên tìm hiểu cách làm điều đó), có rất nhiều nhà cung cấp cloud hosting đưa ra các tầng miễn phí được cấu hình sẵn cho bạn. Hãy tránh xa các shared host.

Phần mềm tính toán mạnh

Khi bạn muốn viết phần mềm làm việc rất nhiều với toán học, các tính toán phức tạp, thống kê và những thứ tương tự như vậy, có những lựa chọn tốt hơn – đặc biệt là nếu ứng dụng đó chủ yếu làm công việc này là chính. Thì các ngôn ngữ dạng functional như Scala hoặc ngôn ngữ mới Dart sẽ thực thi tác vụ này tốt hơn nhiều so với PHP, vì nếu làm bằng PHP có thể yêu cầu nhiều nỗ lực hơn để nó có khả năng làm những việc bạn muốn. PHP cũng chậm hơn đáng kể ở những công việc mà các ngôn ngữ khác được thiết kế dành riêng cho chúng.

Đôi khi sẽ đơn giản hơn nếu viết phần nặng về tính toán của các ứng dụng trong ngôn ngữ mà bạn đang làm việc hiện tại, nhưng đó thường là một sự lười biếng. Sự khó chịu khi phải cài đặt một ngôn ngữ helper hoặc máy ảo và xây dựng phần đó như một ứng dụng riêng biệt thường được bù đắp bởi những lợi ích lâu dài, đặc biệt khi lượng traffic bắt đầu đòi hỏi điều đó. Có một lý do mà phần tính toán back-end của mạng xã hội Twitter được viết bằng Scala, mặc dù phần front-end của họ vẫn là Ruby on Rails.

PHP là rất dễ học

Các vấn đề được liệt kê ở trên là những vấn đề của việc thiếu kiến thức và kinh nghiệm, và đương nhiên là khi ai đó sử dụng PHP cho một mục đích như vậy thì kết quả cuối cùng là không được tối ưu – nó sẽ bổ sung thêm những ý kiến xấu đến danh tiếng đã bị hoen ố của PHP. Vậy PHP tốt nhất cho điều gì?, đó là bất kỳ kịch bản hướng web nào cần phát triển nhanh chóng, và cần thực hiện thực sự nhanh.

PHP có một cộng đồng rất lớn. Đúng vậy, đại đa số là các tay lính mới, nhưng một khi bạn đã gạt bỏ những thành phần linh tinh, còn lại là một số ít các chuyên gia có tâm huyết như Phil SturgeonJosh LockhartMike van Riel,Anthony Ferrara và rất nhiều người khác nữa. Một tá chuyên gia có nhiều tâm huyết thừa nhận những nhược điểm của PHP, nhưng cũng làm việc vất vả trong việc hướng dẫn cho cộng đồng và sửa chữa những vấn đề đó, họ có thể cung cấp một kho tàng kiến thức có giá trị. Cùng với những nguồn tài nguyên tuyệt vời như diễn đàn SitePoint,StackOverflow và PTRW, những vấn đề gặp phải trong PHP dễ dàng được giải quyết, và quá trình này thường nhanh chóng và có chất lượng cao. Trừ khi các câu hỏi mà bạn đặt ra là hết sức ngớ ngẩn (và vâng,  những câu hỏi ngớ ngẩn), cộng đồng này luôn luôn sẵn sàng giúp đỡ.

Số lượng các dự án mã nguồn mở cũng như là các cuốn sách và khóa học về PHP là rất dồi dào, với sự kiên nhẫn và tài liệu hướng dẫn thì bạn có thể trở nên rất thông thạo ngôn ngữ này trong một khoảng thời gian tương đối ngắn.

Xua tan những tin xấu

PHP đã trưởng thành hơn nhiều kể từ lần cuối cùng mà người ta tập hợp những điểm tồi của nó, và nó đã kế thừa rất nhiều những tính năng hiện đại của các ngôn ngữ khác. Thành kiến ở đây rất phổ biến, và chúng ta nên học cách để nhận ra điều đó. Như nội dung bài viết tuyệt vời này trên blog MailChimp từ năm 2010 nói rằng, nó không phải là công cụ, mà do cách bạn sử dụng nó như thế nào.

PHP cho phép nhanh chóng tạo nguyên mẫu của tất cả các loại ứng dụng, và có thể giúp bạn dựng lên chạy thử mà không tốn nhiều thời gian. Nó là một ngôn ngữ nhanh và mạnh mẽ, và thậm chí còn nhanh hơn cả Ruby on Rails và Python trong rất nhiều các ứng dụng web phức tạp, cùng với những lợi ích tăng thêm của các dự án nhưHHVM và Phalcon, hiệu suất của PHP là không có đối thủ trong các ngôn ngữ dynamic.

Bây giờ, trước khi bạn hùa theo đám đông và hét toáng lên là “chỉ cần sử dụng NodeJS, nó là tốt nhất!” hay “MailChimp sẽ tốt hơn bằng cách sử dụng NodeJS ngay từ đầu”, thì trước tiên bạn hãy xem xét sự hỗn loạn và phân mảnh của thế giới JavaScript hiện nay. Có tuổi đời trẻ hơn PHP, nhưng các framework của JS nhiều hơn – đó là một điểm mà nhiều kẻ ghét PHP thường đem ra chế diễu. Ngoài ra luôn có sự chênh lệch giữa các giải pháp khác nhau, và mỗi cái đều tuyên bố mình là “đơn giản hơn/ tốt hơn/ nhanh hơn để làm việc X”. Cộng đồng này là rất lớn, nhưng bị phân mảnh khủng khiếp. Điều này được thể hiện qua một tweet vui trên mạng xã hội Twitter như sau:

Trò chơi uống rượu phạt cho các nhà phát triển web:
(1) Bạn hãy nghĩ ra một danh từ
(2) Hãy tìm kiếm trên Google cụm từ “<tên danh từ đó>.js”
(3) Nếu có một thư viện với tên đó đã tồn tại – thì phạt uống một ly rượu
— Shay Friedman (@ironshay)

Ý định của tôi không phải là đi bôi nhọ những ngôn ngữ khác – những người khác có thể làm công việc đó tốt hơn rất nhiều trong việc phân tích nhược điểm của JS hơn tôi – điều mà tôi đang cố gắng chỉ ra đó là thực tế rằng ai cũng có thể soi mói vào những nhược điểm của bất kỳ ngôn ngữ nào. Cũng giống như trong cuộc sống vậy, nếu bạn chỉ tập trung vào những thứ tiêu cực thì bạn sẽ chẳng bao giờ có những trải nghiệm tốt cả – những nhược điểm của PHP đã được chăm sóc bởi các thư viện và framework, và trong khi người ta có thể lập luận rằng một “ngôn ngữ đích thực” thì không cần các bản vá lỗi hoặc sự giúp đỡ của các công ty lớn để làm việc, nhưng ai có thể đếm được chính xác những gì các thư viện và các gói Java, NPM hoặc PUB dùng để vá lỗi và cải tiến ngôn ngữ này, bổ sung thêm những chức năng còn thiếu để người ta có thể sử dụng.

Vì vậy hãy dừng ngay việc tập trung vào bàn về ngôn ngữ X dở như thế nào, mà hãy bắt đầu làm việc trên các dự án chứng tỏ tính ưu việt trong sự lựa chọn của chúng ta. Vâng, có những dự án ngoài kia làm giảm uy tín của nó – WordPress là một trong những dự án như vậy – nhưng nếu chúng ta kiên trì và xây dựng với những thứ tốt nhất, chúng ta có thể xua tan đi những tiếng xấu và bắt đầu xây dựng lại thế giới PHP mà chúng ta yêu quý.

Kết luận

PHP là một lựa chọn tuyệt vời cho các dự án mới bất kể sự phức tạp của chúng. Thế giới PHP đã phát triển với những bước đi thần tốc trong một vài năm gần đây, và một số tính năng mới mang tính cách mạng có thể đưa vào sử dụng ngay hôm nay (tham khảo các liên kết về HHVM và Phalcon ở trên). Theo tôi thì nó nên là công cụ chính trong hộp công cụ của bạn – việc thông thạo nhiều ngôn ngữ lập trình cũng mang lại hữu ích như bạn biết nhiều ngoại ngữ vậy – nhưng chắc chắn sẽ tốt hơn nếu bạn thật tinh thông về một ngôn ngữ. PHP cung cấp cho bạn khả năng đi từ ý tưởng, đến nguyên mẫu, tới sản phẩm trong thời gian rất ngắn – và đó không phải là điều mà nhiều ngôn ngữ làm được. Những tiến bộ gần đây như OpCache built-in và các máy ảo như HHVM đưa ngôn ngữ này đi xa hơn, cho phép bạn giảm đáng kể chi phí cloud hosting, và các trình giám sát hiệu năng như AppDynamics sẽ cho phép bạn sử dụng đến tận cùng giới hạn của nó.

Khi xem xét dự án tiếp theo của bạn – đừng hỏi bản thân “Ai ghét PHP?” hoặc “Mọi người sẽ nghĩ gì?”. Những câu hỏi này tạo ra sự vô nghĩa và bất an. Bạn nghĩ về bất cứ cái gì, chẳng hạn như MailChimp, hệ thống cung cấp sức mạnh để gửi hàng triệu email mỗi ngày, đã được xây dựng bằng PHP trước khi họ “sửa lại”? Thay vì đó, hãy tập trung làm tốt nhất công việc của mình và tạo ra sản phẩm có ích cho xã hội.

Nguồn: http://techmaster.vn/

4 Cấp độ tự do đối với lập trình viên

Bài viết được dịch từ blog Simple Programmer

Cho đến hôm nay, sau một khoảng thời gian khá dài trong nghề phần mềm, tôi mới thử sắp xếp lại trong tâm trí mình về 4 cấp độ khác biệt mà các lập trình viên phần mềm có thể trải qua trong quá trình cố gắng tìm kiếm “tự do” cho bản thân họ.

Đối với phần lớn thời gian trong sự nghiệp phát triển phần mềm của mình, khi tôi là một nhân viên làm việc cho một công ty, tôi có một ước mơ là đến một ngày nào đó mình sẽ được tự do. Tôi muốn có khả năng làm việc cho chính bản thân mình. Đối với tôi, đó mới là tự do tối thượng.

Cấp độ tự do lập trình viên 1

Nhưng tôi thật là ngây thơ và đã không nhận ra rằng thực sự có các cấp độ khác nhau của cái khái niệm “làm việc cho bản thân”. Tôi cũng giả định rằng nếu bạn đã tự làm chủ, bởi vì hầu hết các lập trình viên mà tôi đã nói chuyện về chủ đề này đều có cùng cách nghĩ giống như tôi đã có – trước khi tôi biết nhiều hơn.

Trước đây tôi đã viết một bài về cách làm thế nào để bỏ công việc của bạn, nhưng bài viết này có một chút khác biệt. Bài viết này không thực sự nói về cách làm thế nào để bỏ việc, mà nói về các cấp độ khác nhau của việc tự làm chủ mà bạn có thể đạt được, sau khi bạn thôi việc.

4 Cấp độ tự do trong nghề lập trình viên

Bốn cấp độ mà tôi mô tả dựa trên mức độ tự do mà bạn trải nghiệm trong công việc của mình; chúng không có gì liên quan đến các cấp độ kỹ năng cả. Nhưng nói chung chúng ta luôn tìm cách để tiến lên những cấp độ này và hy vọng thành công trong việc đạt được nhiều tự do hơn. Vì vậy, hầu hết các lập trình viên đều bắt đầu tại cấp độ 1, và lần đầu tiên mà họ trở thành người tự làm chủ thường là cấp độ 3 – mặc dù bạn có thể bỏ qua các cấp độ trước và tiến thẳng lên cấp độ 3 này.

Dưới đây là một định nghĩa nhanh về các cấp độ này (tôi sẽ đề cập chi tiết về mỗi cấp độ trong phần tiếp theo.)

  1. Employed (làm thuê) – bạn làm việc cho một người nào đó
  2. Freelancer (làm tự do) – bạn là ông chủ của chính bạn, nhưng bạn làm việc cho rất nhiều người khác
  3. Product creator (chủ sản phẩm) – bạn là ông chủ của chính bạn, nhưng khách hàng của bạn xác định những gì bạn làm việc trên đó
  4. Financially free (tự do về tài chính) – bạn làm những việc bạn muốn và khi bạn thích; bạn không cần phải kiếm tiền

Tôi đã bắt đầu sự nghiệp của mình tại cấp độ 1 rồi bật đi bật lại giữa cấp độ 2 và cấp độ 1 một thời gian trước khi tôi có thể nhảy sang cấp độ 3. Hiện tại tôi đang làm việc để vươn lên cấp độ 4 – mặc dù, tôi thấy rằng rất dễ để ở lại cấp độ 3 thậm chí bạn có thể chuyển sang cấp độ 4.

Trên con đường đi qua, tôi đã nhận ra rằng tại mỗi cấp độ mà mình đang có, tôi thường cho rằng mình sẽ cảm thấy hoàn toàn tự do khi vươn tới cấp độ cao hơn. Nhưng cứ mỗi lần đó tôi đều nhận ra rằng mình đã sai. Trong khi mỗi cấp độ mang lại cho tôi nhiều tự do hơn, nhưng mỗi cấp độ đó cũng dường như không phải là những gì mà tôi đã tưởng tượng trước đó.

Cấp độ 1: làm thuê

ông chủ

Giống như tôi đã nói, hầu hết các lập trình viên đều bắt đầu ở cấp độ này. Thành thật mà nói, hầu hết các lập trình viên đều ở lại cấp độ này – và bạn đừng hiểu sai ý tôi, vì điều đó không có gì là sai cả – miễn là bạn hạnh phúc.

Ở cấp độ này, bạn không có nhiều tự do, bởi vì về cơ bản bạn phải làm những việc người ta yêu cầu bạn làm và bạn phải làm việc khi người ta yêu cầu bạn làm, và bạn thường gắn chặt với một vị trí địa lý nhất định. (Trong suốt bài này, bạn sẽ nhìn thấy 3 cấp độ của tự do.)

Làm việc cho một người khác không có gì là xấu cả. Bạn có thể có một công việc thực sự tốt với mức lương xứng đáng, nhưng trong hầu hết các trường hợp bạn phải đánh đổi sự an toàn với một sự bó buộc trong công việc. Bạn nhận được khoản tiền lương hàng tháng một cách đều đặn, nhưng bạn phải trả giá là phần lớn sự tự do của mình.

Nhưng điều đó không có nghĩa là bạn không có những mức độ tự do khác nhau trong việc làm kiểu truyền thống. Tôi nghĩ rằng có những cấp độ nhỏ của tự do tồn tại ngay cả khi bạn đang làm thuê cho một ai đó. Ví dụ, bạn có khả năng nhận được nhiều tự do hơn về việc khi nào thì bạn bắt đầu công việc và khi nào thì ra về, bằng cách leo lên những chức vụ và trở thành một người làm việc có thâm niên. Bạn cũng có khả năng được trao quyền tự chủ nhiều hơn một chút về công việc bạn làm – mặc dù các phương pháp Agile có thể sẽ mang chúng ta quay trở lại vấn đề đó.

Thậm chí bạn có thể có được tự do về địa điểm làm việc nếu bạn có khả năng tìm một công việc cho phép bạn làm việc từ xa. Trong quá trình tìm kiếm tự do của mình, tôi thực sự phải đánh đổi một mức lương đáng kể để được chấp nhận một công việc mà tôi có thể được tự do làm việc tại nhà. Tôi đã sai lầm khi tưởng rằng làm việc ở nhà sẽ là tự do tối thượng và tôi sẽ trở thành một người làm việc về nội dung cho một ai đó suốt cả phần còn lại sự nghiệp của mình, miễn là tôi có thể làm việc đó ở nhà. (Đừng hiểu sai ý tôi, làm việc ở nhà có những đặc quyền của nó, nhưng nó cũng có những điểm bất lợi. Khi tôi làm việc ở nhà, tôi cảm thấy có nghĩa vụ nhiều hơn trong việc hoàn thành công việc để chứng tỏ rằng tôi không phải là kẻ làm biếng. Tôi cũng cảm thấy rằng công việc của mình chẳng bao giờ kết thúc.)

Giờ đây, giống như tôi đã nói từ trước, nhiều người sẽ ở lại cấp độ 1 và có lẽ sẽ di chuyển loanh quanh, để đạt được nhiều tự do hơn thông qua những thứ như quyền tự chủ và một lịch trình làm việc linh hoạt, nhưng có những giới hạn nhất định của tự do tại cấp độ này. Không ai sẽ trả tiền cho bạn để làm điều bạn thích và nói với bạn rằng bạn có thể biến mất bất cứ lúc nào bạn muốn. Bạn cũng sẽ có những giới hạn về mức thu nhập. Bạn chỉ có thể làm ra nhiều tiền khi làm việc cho một ai đó và số tiền đó thì hầu như đã cố định trước rồi.

Cấp độ 2: freelancer (làm tự do)

làm tự do

Vì vậy, đây chỉ là một cấp độ khác mà tôi đã thực sự tưởng tượng tồn tại đối với một lập trình viên, trong phần lớn sự nghiệp của mình. Tôi nhớ là mình đã suy nghĩ về sự tuyệt vời khi được làm việc trên các dự án của riêng mình cùng với những khách hàng của mình. Tôi đã tưởng tượng rằng khi là một freelancer thì tôi có thể đấu thầu (bid) các hợp đồng của chính phủ và dành ra một vài năm để thực hiện hợp đồng đó trước khi chuyển sang dự án tiếp theo. Tôi cũng đã tưởng tượng ra một sự luân phiên khi tôi làm việc cho nhiều khách hàng khác nhau, làm việc trên các công việc khác nhau tại các thời điểm khác nhau – tất cả từ những thuận lợi trong các dự án của mình.

Khi hầu hết các lập trình viên nói về việc bỏ công việc của họ và trở thành một người tự làm chủ, tôi nghĩ đây chính là điều mà họ tưởng tượng. Họ nghĩ, giống như tôi đã nghĩ trước đây, rằng đây là cấp độ cuối cùng của tự do.

Tôi đã không mất quá nhiều thời gian khi làm freelancer để nhận ra rằng cấp độ này cũng không có nhiều tự do hơn, tức là làm việc với tư cách là một freelancer thì cũng không tự do hơn là làm thuê cho một người nào đó. Trước tiên, nếu bạn chỉ có một khách hàng lớn, giống như hầu hết tất cả những freelancer mới vào nghề, thì về cơ bản bạn ở vào một tình huống tương tự như là khi bạn đang đi làm thuê – sự khác biệt lớn nhất đó là bây giờ bạn không thể được trả tiền cho những giờ mà bạn làm biếng. Bạn sẽ có thể có nhiều tự do về giờ giấc làm việc của bạn, nhưng bạn sẽ bị ràng buộc vào dự án mà khách hàng đã thuê bạn làm và bạn có thể thậm chí phải đến tận văn phòng của họ để làm việc.

Điều này không có nghĩa là bạn không có nhiều tự do hơn, mặc dù nó chỉ là một hình thức khác. Nếu bạn có nhiều khách hàng, bạn có quyền kiểm soát nhiều hơn đối với cuộc sống của mình và những công việc nào mà bạn làm. Bạn có thể thiết lập tỉ lệ cho riêng mình, bạn có thể thiết lập giờ giấc của riêng bạn và có thể có khả năng từ chối công việc mà bạn không muốn làm – mặc dù, trong thực tế, bạn sẽ không bỏ dự án nào cả – đặc biệt là nếu bạn mới chỉ bắt đầu gia nhập cấp độ freelancer.

Đừng hiểu sai ý tôi, cũng rất tốt khi bạn có công ty của riêng mình và có khả năng gửi hóa đơn cho các khách hàng của bạn, thay vì vị bắt buộc làm việc cho một ông chủ mà có toàn quyền kiểm soát toàn bộ cuộc sống của bạn, nhưng freelancing là bao gồm rất nhiều công việc và các công việc hàng ngày có thể thực sự khó cảm thấy có nhiều tự do hơn là bạn đang làm việc cho một người nào đó.

Nếu được lựa chọn giữa việc làm freelancer hoặc làm việc cho một người nào đó, thì tôi chỉ muốn làm công việc có tiền lương được trả đều đặn hơn. Nếu là 5 năm về trước thì tôi đã không nói như vậy, nhưng giờ đây tôi biết rằng freelancing là công việc rất khó và căng thẳng. Tôi thực sự sẽ không đi theo con đường này trừ khi bạn biết đây là điều bạn muốn làm hoặc bạn đang sử dụng nó như là một bước đệm để tiến đến một nơi nào khác.

Từ góc độ thu nhập, một freelancer có thể kiếm nhiều tiền hơn hầu hết các nhân viên làm thuê. Hiện tại tôi đang làm freelancer và tôi không chấp nhận bất kỳ công việc nào có giá ít hơn $300 đô-la/giờ. Tôi đã không bắt đầu với mức tỉ lệ đó – khi tôi bắt đầu làm freelancer tôi tính phí $100 đô-la/giờ đã là một tỷ lệ đáng kinh ngạc – nhưng, cuối cùng tôi đã làm việc theo cách của mình để nâng lên được mức hiện nay. Một điều đáng suy nghĩ đó là mức thu nhập của bạn không có giới hạn. Bạn càng tính phí cao và số giờ bạn làm việc càng nhiều thì bạn càng kiếm được nhiều tiền. Bạn chỉ bị giới hạn bởi các giới hạn của cả hai yếu tố này kết hợp lại.

Cấp độ 3: tạo ra sản phẩm của riêng mình

tạo ra sản phẩm của riêng mình

Cấp độ này là nơi mà mọi thứ trở nên thú vị. Khi tôi chủ yếu làm công việc freelancing, tôi đã nhận ra rằng sai lầm chính của mình đó là không làm việc cho một người nào đó, mà bằng cách đánh đổi những đồng đô-la cho giờ làm việc của mình. Tôi nhận ra rằng là một freelancer thì cuộc đời mình không đẹp đẽ như là tôi đã tưởng tượng trước đây. Nó không thực sự tự do, bởi vì nếu tôi không làm việc thì tôi sẽ không được trả lương.

Tôi thực sự đã chấm dứt công việc freelancer và quay trở lại làm nhân viên toàn thời gian để suy nghĩ lại chiến lược của mình. Tôi càng vắt óc suy nghĩ, thì tôi càng nhận ra rằng để thực sự đạt được sự tự do mà tôi muốn, tôi sẽ cần phải tạo ra một dạng sản phẩm mà tôi có thể bán hoặc một loại dịch vụ mà sẽ tạo ra thu nhập cho tôi trong tất cả thời gian thậm chí khi tôi không làm việc.

Có rất nhiều cách để đạt đến cấp độ này, nhưng có lẽ cách phổ biến nhất đó là xây dựng một số loại phần mềm hoặc dịch vụ phần mềm (SASS) để sinh ra thu nhập cho bạn. Sau đó bạn có thể kiếm tiền từ việc bán sản phẩm và bạn làm việc trên sản phẩm đó khi nào và theo cách bạn cảm thấy phù hợp.

Bạn cũng có thể đạt đến cấp độ này bằng cách bán các sản phẩm số theo hình thức nào đó. Tôi đã có khả năng vươn tới cấp độ này thông qua một sự kết hợp giữa blog này, các ứng dụng di động mà tôi đã xây dựng, và tạo ra các khóa học có thu phí trên Pluralsight và gói chương trình Làm thế nào để tiếp thị bản thân với tư cách là một lập trình viên.

Bạn có thể khá tự do ở cấp độ này. Bạn không còn có bất kỳ một ông chủ thực sự nào nữa. Không còn một ông chủ đầu hói nào luôn ra lệnh cho bạn phải làm những gì và bạn cũng không có những khách hàng nói với bạn phải làm việc trên các dự án nào nữa. Bạn hầu như có thể làm việc ở bất cứ nơi nào bạn muốn và bất cứ khi nào bạn thích. Thậm chí bạn có thể biến mất trong khoảng vài tháng trời – miễn là bạn tìm ra cách nào đó để có thể xử lý hỗ trợ cho sản phẩm của mình.

Lúc này, điều đó không có nghĩa là mọi thứ trở nên ngon lành cành đào tại cấp độ này. Có một điều là, tôi đã tưởng rằng nếu tôi tạo ra các sản phẩm, thì tôi sẽ có thể làm việc một cách chính xác những gì mà tôi muốn làm. Điều này còn lâu mới thành sự thật. Tôi có một mức độ lớn trong việc kiểm soát những gì tôi lựa chọn để làm và tạo ra, nhưng vì tôi bị ràng buộc bởi nhu cầu kiếm tiền, nên tôi phải dành ra một phần lớn sự kiểm soát đó tới thị trường. Tôi phải xây dựng những thứ mà khách hàng của tôi sẽ trả tiền để mua.

Điều này dường như có vẻ không phải là vấn đề lớn, nhưng thực ra đúng là như vậy. Tôi luôn luôn có ước mơ được viết code và làm việc trên những dự án của riêng mình. Tôi đã mơ ước rằng khi trở thành một người tạo ra sản phẩm và tiền được tạo ra từ các sản phẩm của tôi sẽ mang lại cho tôi sự tự do đó. Ở một mức độ nào đó, nhưng tôi cũng phải chú ý cẩn thận tới mong muốn của các độc giả và khách hàng của mình và tôi phải đặt trọng tâm chính của mình vào việc xây dựng những thứ đó.

Cấp độ này cũng khá là áp lực, bởi vì mọi thứ phụ thuộc vào bạn. Bạn phải thành công mới có thể thu được tiền. Khi bạn là một người làm thuê, tất cả bạn phải làm đó là làm hết công việc được giao. Khi bạn là một freelancer, bạn chỉ phải tìm kiếm khách hàng và làm công việc đã thỏa thuận – bạn nhận được thù lao cho công việc bạn làm chứ không phải là các kết quả. Khi bạn là một người tạo ra sản phẩm, bạn có thể dành ra 3 tháng trời để làm việc trên một cái gì đó mà không nhận được đồng cắc nào cả. Không ai quan tâm về bạn đã làm bao nhiêu khối lượng công việc, chỉ kết quả cuối cùng mới quan trọng.

Về thu nhập tiềm năng thì không có giới hạn ở đây. Bạn có thể phải vật lộn chỉ để kiếm đủ sống, nhưng nếu bạn thành công, thì không có giới hạn nào về số tiền mà bạn kiếm được, vì bạn không bị giới hạn bởi thời gian. Tại cấp độ này bạn không còn phải đổi chác giữa thời gian và những đồng đô-la nữa.

Đối với tôi, việc cố gắng để leo lên cấp độ 2 không quan trọng cho lắm, tốt hơn là chỉ làm việc cho một ai đó cho tới khi bạn có thể vươn tới cấp độ 3, bởi vì ở cấp độ tự do này thì nó mới thực sự tạo ra những khác biệt lớn trong cuộc sống của bạn. Bạn có thể vẫn không có khả năng làm việc trên thứ mà bạn muốn, nhưng ít ra thì tại điểm này – một khi bạn đã thành công – tất cả những mặt khác của cuộc đời bạn bắt đầu trở nên tự do nhiều hơn.

Cấp độ 4: tự do tài chính

tự do tài chính

Tôi không thể tìm ra một cái tên tốt hơn cho cấp độ này, nhưng đây là cấp độ mà bạn không còn phải lo lắng về việc kiếm tiền nữa. Có một điều mà tôi nhận thấy khi tôi cuối cùng cũng đã đạt đến cấp độ 3 đó là phần lớn những yếu tố khiến tôi không thể làm chính xác cái mà tôi muốn đó là sự cần thiết phải tạo ra thu nhập.

Có một sự thật rằng bạn có thể làm việc trên thứ mà bạn muốn, nhưng việc cần phải tạo ra thu nhập có xu hướng ảnh hưởng đến cái bạn làm và cách bạn làm công việc đó như thế nào. Ví dụ, tôi đã thực sự muốn tạo ra một trò video game. Tôi đã luôn luôn mơ ước làm một dự án phát triển game lớn. Nhưng tôi biết rằng nó có thể không có khả năng tạo ra lợi nhuận. Miễn là tôi đang lo lắng về thu nhập, thì sự tự do của tôi sẽ bị giới hạn ở một mức độ nào đó. Nếu tôi không có một khoản thu nhập thụ động đủ để cầm cự, thì tôi không thể bỏ làm các dự án tạo cho tôi thu nhập để bắt đầu viết code cho trò video game đó được – vâng, tôi có thể, nhưng đó không phải là cách thông mình và tôi cảm thấy khá tội lỗi về điều đó.

Vì vậy, theo quan điểm của tôi, hình thức cao nhất của tự do mà một nhà phát triển phần mềm có thể đạt được đó là khi họ được tự do về tài chính. Ý của tôi về tự do tài chính là như thế nào? Về cơ bản nghĩa là bạn không phải lo lắng về tiền bạc nữa. Có lẽ bạn đã bán startup của mình với giá vài triệu đô-la hoặc bạn có một nguồn thu nhập thụ động từ bất động sản hoặc những khoản đầu tư khác mà có thể cung cấp nhiều hơn cho nhu cầu sinh hoạt hàng ngày của bạn. (Để có thông tin tốt về làm thế nào để đạt được điều đó thì tôi đề xuất bạn nên đọc cuốn sách “Cha giàu, Cha nghèo”.)

Ở cấp độ tự do này, về cơ bản bạn có thể làm những gì bạn muốn. Bạn có thể tạo ra các phần mềm gây hứng thú cho bạn, bởi vì bạn thích như vậy – bạn không phải lo lắng về khả năng sinh lời. Nếu muốn tạo ra một ứng dụng Android thì bạn bắt tay vào làm ngay. Muốn học một ngôn ngữ lập trình mới chỉ vì bạn nghĩ nó sẽ mang lại niềm vui, bạn lao vào học ngay.

Đây luôn luôn là cấp độ tự do mà tôi đã thầm ao ước. Tôi chẳng bao giờ muốn ngồi yên mà không làm bất cứ điều gì, tôi luôn luôn muốn làm việc mà tôi cảm thấy thú vị và chỉ những thứ mà tôi quan tâm. Mọi cấp độ khác mà tôi đã nghĩ sẽ mang lại sự tự do này, thì tôi đều nhận ra là chúng không thể đáp ứng được. Tôi đã nhận ra rằng luôn luôn có một cái gì đó sẽ kiểm soát cái mà tôi làm việc trên đó, có thể là ông chủ của tôi, các đối tác hoặc các khách hàng của tôi.

Điều này không có nghĩa rằng bạn không thể kiếm được tiền từ các dự án của mình. Trong thực tế, có một nghịch lý mà tôi luôn tin tưởng, nếu bạn có thể tiến tới giai đoạn này, bạn có tiềm năng kiếm được rất nhiều tiền. Một khi bạn đã bắt đầu làm việc trên thứ mà bạn muốn, bạn sẽ làm công việc đó với một sự đam mê và nó sẽ mang lại một giá trị rất cao. Đây là lúc lập trình giống như một nghệ thuật vậy. Dĩ nhiên tôi không có bất kỳ bằng chứng nào về điều này, nhưng tôi ngờ rằng khi tôi không quan tâm về việc kiếm tiền, bởi vì bạn đang làm công việc mà bạn yêu thích, thì đó là khi bạn làm được nhiều nhất.

Đừng hiểu sai ý tôi, bạn có thể có khả năng tập trung làm những gì bạn yêu thích, thậm chí nếu bạn không tạo ra bất cứ chút tiền bạc nào. Tôi biết rất nhiều nghệ sĩ sống đói kém mà vẫn theo đuổi nghệ thuật – hoặc ít ra là họ cho phép bản thân làm như vậy – nhưng, tôi không thể làm điều đó. Tôi đã cố thử, nhưng tôi luôn luôn cảm thấy tội lỗi và bị áp lực về một thực tế rằng tôi đang làm một công việc mà không sinh ra lợi nhuận. Theo quan điểm của tôi, bạn thực sự có tự do tài chính thì mới có thể trải nghiệm được tự do sáng tạo đích thực.

Tôi thực sự đang làm việc để tiến tới cấp độ này. Về mặt kỹ thuật, tôi có thể nói rằng mình đã ở cấp độ này, nhưng tôi vẫn bị ảnh hưởng lớn bởi lợi nhuận. Mặc dù, giờ đây tôi không lựa chọn các dự án của mình chỉ dựa trên các tiêu chí sẽ tạo ra nhiều tiền nhất. Tôi đang từ chối khá nhiều dự án và cơ hội mà không cảm thấy thích hợp với cái tôi muốn làm, và tôi đang cố gắng chuyển dịch để làm việc chỉ trên những thứ mà tôi quan tâm khi mà mức thu nhập thụ động của mình tăng lên.

Bạn có thể thu được gì từ tất cả những điều này?

Vâng, điều lớn nhất đó là tự do có nhiều cấp độ khác nhau và có lẽ dù gì thì bạn sẽ không muốn trở thành một freelancer. Tôi nghĩ có nhiều lập trình viên cho rằng làm việc cho chính họ bằng cách freelancing sẽ mang lại cho họ sự tự do tối thượng. Họ không nhận ra rằng họ sẽ chỉ có khả năng làm việc chính xác về những gì họ muốn làm chỉ khi họ thực sự tự do về tài chính.

Vì vậy, lời khuyên của tôi dành cho bạn đó là nếu bạn muốn kiểm soát hoàn toàn sự sáng tạo trong cuộc sống của mình và cái mà bạn làm việc, thì bạn phải trở nên tự do về tài chính. Nếu bạn muốn một cấp độ tự trị cao hơn trong hầu hết các lĩnh vực của cuộc sống thì bạn nên cố gắng phát triển và bán các sản phẩm. Nếu bạn hạnh phúc khi trở thành ông chủ của chính mình, thậm chí nếu bạn phải làm theo đơn đặt hàng của khách, thì freelancing có thể là con đường dành cho bạn. Và, nếu tất cả những điều trên dường như là một cái giá quá đắt mà bạn phải trả, bạn có thể chỉ muốn ở lại nơi bạn đang ở và tiếp tục nhận được những khoản lương đều đặn hàng tháng – không có gì là sai trái với điều đó cả.

Nguồn:

HỒ SỸ HÙNG

Hồ Sỹ Hùng thuộc thế hệ 8x, sinh ra ở Nghệ An, học ở Hà Nội, có vài năm làm việc tại Sài Gòn, và Đồng Nai. Anh là lập trình viên có nhiều năm kinh nghiệm trong lĩnh vực: C#, VB.NET, ASP.NET, SQL Server, XML, MVC, Entity Framework… và đồng thời cũng là admin của blog http://vinacode.net/. Bạn có thể liên hệ với anh qua email hungpm2000[at]gmail.com

Hướng dẫn thay đổi background Visual Studio

Khi bạn là một tín đồ của .NET, thường xuyên làm việc với Visual Studio IDE, hẳn bạn sẽ có lúc cảm thấy nhàm chán giao diện của nó. Chỉ có vài Themes đơn giản, nhưng cũng không được nổi bật lắm.

Cũng như Desktop của bạn, lâu lâu chúng ta muốn thay đổi background của nó một chút cho bắt mắt, hay đỡ nhàm chán, đồng thời cũng thể hiện cá nhân hóa của bạn trên màn hình làm việc.

Thật thú vị là chúng ta có một Extension của Visual Studio đó là ClaudiaIDE. Nó cho phép chúng ta thay đổi background làm việc của Visual Studio bằng cách thay đổi hình nền giao diện làm việc. Tải ClaudiaIDE tại đây.
ClaudiaIDE là một mã nguồn mở được chia sẻ tại Github. Nếu bạn có hứng thú có thể tham gia phát triển nó tại: https://github.com/buchizo/ClaudiaIDE

ClaudiaIDE khá thú vị khi cho phép bạn chọn 1 ảnh nền, hay cả 1 thư mục chứa ảnh để thay đổi theo kiểu Slide show. Giống y chang desktop của bạn.

ClaudiaIDE-1
Sau khi cài đặt chúng ta vào mục Tools->Options->ClaudiaIDE để cài đặt lại theo ý thích cá nhân.

ClaudiaIDE-2

Một số thông số cài đặt
###Image
Image background type
– Single: Chỉ chọn 1 ảnh làm nền
– Slideshow: Chọn nhiều ảnh làm nền
– Opacity: Điều chỉnh độ mờ của ảnh nền
###Layout
– Horizontal Alignment: Vị trí của ảnh (Left, Right, Center)
– Vertical Alignment: Vị trí của ảnh (Top, Bottom, Center)
###SingleImage
– File Path: Đường dẫn hình ảnh của bạn
###Slideshow
– Directory Path: Đường dẫn thư mục chứa ảnh
– Image animation interval: Thời gian hiệu ứng chuyển ảnh
– Image extensions: .png, .jpg định dạng ảnh cho phép
– Update interval: Thời gian thay đổi giữa 2 ảnh

Chúc các bạn thành công, và đừng quên chia sẻ giao diện làm việc mới trên Visual Studio của bạn nhé. ?

PHP Upload file

Upload file là một vấn đề quan trọng và cần thiết khi lập trình web. Chúng ta cần tải hình ảnh lên hosting, tải file ….
Đoạn code nhỏ trong php sau đây cho phép bạn làm thực hiện điều đó thật đơn giản.

PHP Upload file
PHP Upload file

Cấu hình file “php.ini”

Đầu tiên, để chắc chắn PHP cho phép upload file, chúng ta cần kiểm tra trong file php.ini. Trong file php.ini tìm đến dòng file_uploads gán = On

file_uploads = On

Thiết kế trang html

<!DOCTYPE html>
<html>
<body>
<h1>PHP - Upload file demo <a href="http://tuanitpro.com">http://tuanitpro.com</a></h1>
<form action="upload2.php" method="post" enctype="multipart/form-data">
    Chọn file upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Tải lên" name="submit">
</form>
<hr/>

</body>
</html>

Có vài quy tắc bạn cần nhớ.

  • Form phải để phương thức POST
  • Bắt buộc phải có thuộc tính
    enctype="multipart/form-data"
  • action của form chỉ đến trang upload2.php, là trang chứa code PHP thực hiện phía server.

Code trang upload2.php

<?php

if(isset($_POST["submit"])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
	// Kiểm tra file upload lên có phải là ảnh không?

    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File có định dạng - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "Chỉ cho phép hình ảnh.";
        $uploadOk = 0;
    }
 
// Kiểm tra file tồn tại hay chưa?
if (file_exists($target_file)) {
    echo "File đã tồn tại.";
    $uploadOk = 0;
}
// Kiểm tra kích thước file 500000 byte
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "File quá lớn.";
    $uploadOk = 0;
}
// Kiểm tra định dạng ảnh hợp lệ không?
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Chỉ cho phép các định dạng sau: JPG, JPEG, PNG & GIF";
    $uploadOk = 0;
}
// Kiểm tra điều kiện trước khi upload?
if ($uploadOk == 0) {
    echo "Upload thất bại.";
// Nếu ok thì cho phép upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo " File ".$target_dir. basename( $_FILES["fileToUpload"]["name"]). " upload thành công.";
        echo '<br/><img src="'.$target_dir. basename( $_FILES["fileToUpload"]["name"]).'" width="160" />';
    } else {
        echo "Upload file thất bại, vui lòng thử lại.";
    }
}
}
?>

Một số giải thích:

  • $target_dir = “uploads/” – thư mục chứa file tải lên. Nằm cùng cấp với upload2.php
  • $target_file đường dẫn tập tin được tải lên
  • $uploadOk=1 để kiểm tra dữ liệu trước khi upload
  • $imageFileType kiểm tra phần mở rộng của tập tin
  • Tiếp theo kiểm tra xem ảnh có thật hay bị giả mạo (vd: social.php => social.png)

Chúc các bạn thành công.

POST & GET trong lập trình web

Trong lập trình web có 2 phương thức rất quan trọng chúng ta thường dùng đó là POST & GET. Nó giống như cốt lỗi khi làm lập trình web. Bởi vì POST và GET cung cấp cho chúng ta cách lấy thông tin đầu vào từ phía client, sau đó gửi lên máy chủ Web Server để xử lý. Không có thông tin chúng ta không thể xử lý gì cả.

Nôm na thì nó như vầy:

POST & GET

GET

Phương thức GET dữ liệu sẽ được hiển thị trên thanh địa chỉ: VD: http://tuanitpro.com/?s=ajax. GET áp dụng khi dữ liệu chỉ đọc, không nên dùng khi ghi xuống CSDL. Bởi vì khi dùng GET thì thông tin quá lộ liễu. Dễ thấy nhất là khi tìm kiếm, lấy mẩu tin theo ID. http://tuanitpro.com/?id=1&categoryid=2&x=3&y=4. Khi dùng GET thì tất cả các field trong form đều hiển thị hết lên thanh địa chỉ.

GET Method

VD chúng ta có form đăng nhập như sau:

<form action="login.php" method="GET"> // Nếu chúng ta không quy định method, mặc định là GET
First name:<br>
<input type="text" name="username" value="tuanitpro">
<br>
Last name:<br>
<input type="password" name="password" value="123">
<br><br>
<input type="submit" value="Submit">
</form>

Khi chúng ta nhấn submit, nó sẽ gửi sang trang login.php như sau:
http://tuanitpro.com/login.php?username=tuanitpro&password=123. Như vậy quá nguy hiểm khi có ai đứng gần bạn.
Cách lấy dữ liệu.

PHP: $_GET["username"]
ASP.NET: Request.QueryString["tuanitpro"]
JAVA: request.getParameter("username");

Và có một điều quan trọng, các hacker rất thích dựa vào GET để khai thác tấn công SQL Injection. Nếu dùng GET các bạn nên mã hóa query string để an toàn hơn.

POST

Khác với GET, phương thức POST cũng gửi dữ liệu lên web server, nhưng nó chạy ngầm bên dưới, hoàn toàn không hiển thị. Các bạn thường thấy khi đăng ký thành viên, đăng nhập, thêm một bài mới. Tức là nó có can thiệp với cơ sở dữ liệu. Tất nhiên chúng ta hoàn toàn có thể dùng GET. Tuy nhiên vì lý do bảo mật (tất nhiên không hoàn toàn tuyệt đối), chúng ta nên dùng POST.

POST Method

Khi dùng POST

<form action="login.php" method="POST">
First name:<br>
<input type="text" name="username" value="tuanitpro"/>
<br>
Last name:<br>
<input type="password" name="password" value="123"/>
<br><br>
<input type="submit" value="Submit">
</form>

Dữ liệu cũng gửi lên Server để trang login.php xử lý, nhưng nó chạy ngầm, và không hiển thị gì cả. An toàn hơn GET rất nhiều. Bạn nào không tin thì login facebook.com thử.

Cách lấy dữ liệu.

PHP: $_POST["username"]
ASP.NET: var username = username.Text
JAVA: request.getParameter("username");

Chúc các bạn thành công.

CRUD using Ajax in ASP.NET MVC

Trong quá trình học và làm lập trình, bạn thường nghe nói nhiều đến Ajax, được khuyên dùng Ajax trong nhiều câu trả lời. Vậy ajax là gì? Ứng dụng ajax vào có khó hay không? Trong video dưới đây mình sẽ hướng dẫn các bạn cách thêm, xóa, sửa, lấy dữ liệu bằng Ajax trong ASP.NET MVC (Các bạn hoàn toàn có thể ứng dụng vào cho ngôn ngữ lập trình khác như PHP chằng hạn…)

Video Demo CRUD using Ajax in ASP.NET MVC

Tóm tắt Video

  • Ajax là gì?
  • Tạo Cơ sở dữ liệu bảng Student (lưu thông tin sinh viên)
  • Tạo dự án ASP.NET MVC mới
  • Tạo class xử lý thêm, xóa sửa
  • Tạo form thêm sinh viên
  • Viết code cho Controller
  • Viết code cho file javascript

Bạn hoàn toàn có thể ứng dụng Ajax trong nhiều trường hợp: đăng nhập, đăng ký, tìm kiếm thông tin, giỏ hàng….
Nếu bạn đã hoàn thành theo hướng dẫn mà vẫn gặp khó khăn, hãy tải mã nguồn ứng dụng tại đây:  Download

Cảm ơn bạn đọc và mình luôn đánh giá cao phản hồi của bạn.

Javascript Popup Window to return value to Parent Window

Chào các bạn.
Khi lập trình, hay thiết kế web chúng ta có nhu cầu lấy dữ liệu từ một trang thứ 2 mà không muốn load lại trang chính. Chúng ta có thể dùng popup windows. Ví dụ như chọn một sản phẩm từ danh sách sản phẩm, chọn một nhân viên từ danh sách…. Tất nhiên cũng ta vẫn còn có nhiều cách khác nhau.

Javascript Popup Window to return value to parent window
Javascript Popup Window to return value to parent window

Hướng dẫn sau cho phép bạn tạo một trang popup và lấy dữ liệu đưa vào form của chúng ta. Đây chỉ là code HTML và Javascript, vậy nên bạn có thể áp dụng bất cứ chỗ nào bạn muốn (PHP, ASP.NETMVC….).

Chúng ta cần 2 file. 1 file chứa form (parent) và 1 file chứa dữ liệu chúng ta muốn lấy (child).

Code trang parent.html

<body>
    <div class="container">
        <h3>Javascript Popup Window to return value to parent Window</h3>
        <table border="0" cellpadding="0" cellspacing="0">
            <tr>
                <td>
                    Họ tên:&nbsp;
                </td>

                <td>
                    <div class="input-group">
                        <input type="text" class="form-control" placeholder="Chọn nhân viên..." id="txtName">
                        <span class="input-group-btn">
                            <button class="btn btn-primary" type="button" onclick="SelectName()">Chọn...</button>
                        </span>
                    </div><!-- /input-group -->
                </td>
            </tr>
        </table>
        <br />
        <p>            
            <a href="http://tuanitpro.comjavascript-popup-window-to-return-value-to-parent-window">Hướng dẫn lấy dữ liệu từ Popup Javascript.</a>
        </p>
        <script type="text/javascript">
            var popup;
            function SelectName() {
                popup = window.open("/Home/Popup", "Popup", "width=400,height=300"); // Thay dường dẫn file bạn muốn mở
                popup.focus();
            }
        </script>
    </div>

Code file child.html

<body>
    <div>
        <h3>Danh sách nhân viên</h3>
        Click vào tên nhân viên để chọn
        <table class="table table-bordered">
            <thead>
                <tr>
                    <th>#</th>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Username</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <th scope="row">1</th>
                    <td><a href="#" onclick="return SetName('Ngọc Trinh');">Ngọc Trinh</a></td>
                    <td>Otto</td>
                    <td>mdo</td>
                </tr>
                <tr>
                    <th scope="row">2</th>
                    <td><a href="#" onclick="return SetName('Phương Trinh');">Phương Trinh</a></td>
                    <td>Thornton</td>
                    <td>fat</td>
                </tr>
                <tr>
                    <th scope="row">3</th>
                    <td><a href="#" onclick="return SetName('Lệ Rơi');">Lệ Rơi</a></td>
                    <td>the Bird</td>
                    <td>twitter</td>
                </tr>
                <tr>
                    <th scope="row">4</th>
                    <td><a href="#" onclick="return SetName('Bà Tưng');">Bà Tưng</a></td>
                    <td>the Bird</td>
                    <td>twitter</td>
                </tr>
                <tr>
                    <th scope="row">5</th>
                    <td><a href="#" onclick="return SetName('Kenny Sang');">Kenny Sang</a></td>
                    <td>the Bird</td>
                    <td>twitter</td>
                </tr>
            </tbody>
        </table>
    </div>
    <script type="text/javascript">
        function SetName(value) {
            if (window.opener != null && !window.opener.closed) {
                var txtName = window.opener.document.getElementById("txtName"); // ID này là của parent form
                txtName.value = value;
            }
            window.close();
        }
    </script>
</body>

Chúc các bạn thành công.

Multiple file upload in ASP.NET MVC

Khi lập trình web với ASP.NET MVC hay bất kỳ ngôn ngữ nào khác như PHP chẳng hạn, chúng ta đều gặp những tình huống liên quan đến Upload file lên hosting, dễ thấy nhất là upload hình sản phẩm cho một sản phẩm nào đó.

Với ASP.NET MVC chúng ta dễ dàng làm được điều đó, bạn có thể upload 1 file hoặc upload nhiều file (Multiple file upload) trong ASP.NET MVC cùng lúc. Nó cực kỳ hữu ích trong nhiều trường hợp. Đoạn code nhỏ sau đây sẽ minh họa cho vấn đề này.

Multiple file upload in ASP.NET MVC
Multiple file upload in ASP.NET MVC

Code HTML

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Upload file trong ASP.NET MVC</title>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            var max_fields = 10; //maximum input boxes allowed
            var wrapper = $(".myinput"); //Fields wrapper
            var add_button = $(".btnAddNew"); //Add button ID

            var x = 0; //initlal text box count
            $(add_button).click(function (e) { //on add input button click
                e.preventDefault();
                if (x < max_fields) { //max input box allowed
                    x++; //text box increment
                    $(wrapper).append('<div>   <input type="file" name="uploadFile['+x+']" /><a href="#" class="btnRemove">Xóa</a></div>'); //add input box
                }
            });

            $(wrapper).on("click", ".btnRemove", function (e) { //user click on remove text
                e.preventDefault(); $(this).parent('div').remove(); x--;
            })
        });
    </script>
</head>
<body>
    <div>
        <h2>Upload file trong ASP.NET MVC</h2>
        <div style="color:red">
            @Html.Raw(TempData["Msg"])
        </div>
        <fieldset>
            <legend>Upload file</legend>
            @using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
            {

                <label>Chọn file: </label>
                <br />
                <input type="file" name="uploadFile" required /><br />

                <input type="submit" value="Upload" />

            }
        </fieldset>
        <hr />
        <h3>Upload nhiều file trong ASP.NET MVC</h3>
        <fieldset>
            <legend>Upload multi file</legend>
            @using (Html.BeginForm("UploadMulti", "Upload", FormMethod.Post, new { enctype = "multipart/form-data" }))
            {

                <label>Chọn file: </label><br />
                <a class="btnAddNew" href="#">Thêm</a>
                <br />
                <div id="myinput" class="myinput">
                    <input type="file" name="uploadFile[0]" required /><br />
                </div>
                <br />
                <input type="submit" value="Upload" />

            }
        </fieldset>

Code cs

/**   FileName: UploadController.cs 
          Project Name: DateTime Ajax
          Date Created: 12/17/2014 11:30:58 PM 
          Description:  File Upload trong ASP.NET MVC
          Version: 0.0.0.0 
          Author: Lê Thanh Tuấn - Khoa CNTT
          Author Email: [email protected] 
          Author Mobile: 0976060432
          Author URI: https://tuanitpro.com 
          License: 
     */

    public class UploadController : Controller
    {
        // GET: Upload
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Upload(HttpPostedFileBase uploadFile)
        {
            if (ModelState.IsValid)
            {
                string filePath = Path.Combine(HttpContext.Server.MapPath("/Uploads/demo"),
                                               Path.GetFileName(uploadFile.FileName));
                uploadFile.SaveAs(filePath);
                TempData["Msg"] = string.Format("Upload file {0} thành công", uploadFile.FileName);
            }
            return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult UploadMulti(List<HttpPostedFileBase> uploadFile)
        {
            string abc = "";
            string def = "";
            foreach (var item in uploadFile)
            {

                string filePath = Path.Combine(HttpContext.Server.MapPath("/Uploads/demo"),
                                               Path.GetFileName(item.FileName));
                item.SaveAs(filePath);

                abc = string.Format("Upload {0} file thành công", uploadFile.Count);

                def += item.FileName + "; ";


            }
            TempData["Msg"] = abc + "</br>" + def;
            return RedirectToAction("Index");
        }
    }

Live demo

Chúc các bạn thành công.

Vừa gà vừa chó, bó lại cho tròn, ba mươi sáu con, một trăm chân chẵn. Hỏi mấy gà, mấy chó?

Có một bài toán dân gian khá thú vị như sau:

Vừa gà vừa chó
Bó lại cho tròn
Ba mươi sáu(36) con
Một trăm(100) chân chẵn
Hỏi mấy gà, mấy chó?

Đây là bài toán vui, từ khi học tiểu học mình đã biết, lên trung học, học giải phương trình cũng gặp lại nó. Và bây giờ, làm lập trình, tự dưng nhớ tới nó, nên viết ra đây, coi như chia sẻ cho các bạn mới học lập trình có thêm hào hứng, giải quyết các bài tập nho nhỏ, vui vẻ tương tự.

Cách giải nó như sau:

Gọi x là số gà
Số chó là: 36 – x
Số chân gà: 2x
Số chân chó: 4(36-x)
theo đề bài ta có:
2x + 4(36 – x) =100
2x + 144 – 4x = 100
2x = 144 – 100
2x = 44
x = 22
Vậy số gà là 22 con
Số chó : 36 – 22 = 14

Bạn bảo mấy con chó đặt 2 chân trước lên ghế,tổng số chân dưới đất sẽ là 36 x 2  = 72 chân. Suy ra số chân trên ghế là 28 chân.
Vậy có 14 con chó ….

Dùng hệ phương trình
Gọi x là gà, y là chó
Ta có hệ pt:
x + y = 36
2x + 4y = 100
Giải hệ pt
x = 22,y = 14
Vậy gà có 22 con, chó có 14 con. Mời các bạn chia sẻ thêm cách giải hay, thú vị khác nữa nhé.

Vậy thì làm sao để giải nó bằng cách lập trình. Đây không phải vấn đề khó với nhiều bạn, tuy nhiên mình thấy vui vẻ, nên vẫn viết ra đây.

Sau đây là cách giải trong một số ngôn ngữ lập trình như Pascal, C++, C#, Java, PHP, ASP.NET, Javascript. Trường hợp máy bạn không cài sẵn IDE, bạn có thể sử dụng trang web http://ideone.com để chạy thử code.

Vì số con là 36 và số chân là 100. Giả sử tất cả là chó, thì số con tối đa là 100/4 = 25 (con). Tối thiểu là 36 / 4 = 9 (con). Như vậy chúng ta chỉ cần sử dụng vòng lặp for từ 9->25. Tối ưu hơn so với từ 0 -> 36

Pascal


program HelloWorld;
var i :Integer;
begin
   writeln('Giai bai toan dan gian bang Pascal');
writeln('Vua ga vua cho');
writeln('Bo lai cho tron');
writeln('Ba muoi sau(36) con');
writeln('Mot tram(100) chan chan');
writeln('Hoi may ga, may cho?');
for i:= 9 to 25 do
if((i * 2 + (36 - i) * 4) = 100) then
writeln('So ga la: ', i);
writeln('So cho la: ', 36 - i);
end.

C++

#include 
#include;
#include;
using namespace std;
int main(){
cout << "Gia bai toan dan gian trong C++\n";
cout << "Vua ga vua cho\n";
cout << "Bo lai cho tron\n";
cout << "Ba muoi sau(36) con\n";
cout << "Mot tram(100) chan chan\n";
cout << "Hoi may ga, may cho?\n";
cout << "\n";
for (int i = 9; i < 25; i++)
{
if ((i * 2 + (36 - i) * 4) == 100){
cout << "So ga la: " << i << "\n";
cout << "So cho la: " << (36 - i) << "\n";
                        break;
}
}
}

Java

public class Main {
public Main() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Giải bài toán dân gian trong Java");
System.out.println("Vừa gà vừa chó");
System.out.println("Bó lại cho tròn");
System.out.println("Ba mươi sáu(36) con");
System.out.println("Một trăm(100) chân chẵn");
System.out.println("Hỏi mấy gà, mấy chó?\n");
for(int i = 9; i < 25; i++){
if((i*2+(36-i)*4)==100){
System.out.println("Số gà là: " + i);
System.out.println("Số chó là: " + i);
}
}
}
}

C#

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Gia bai toan dan gian trong C#");
            Console.Write("Vua ga vua cho\n");
            Console.Write("Bo lai cho tron\n");
            Console.Write("Ba muoi sau(36) con\n");
            Console.Write("Mot tram(100) chan chan\n");
            Console.WriteLine("Hoi may ga, may cho?\n");
            for (int i = 9; i <= 25; i++)
            {
                if ((2 * i + (36 - i) * 4) == 100)
                {
                    Console.WriteLine("So ga la: " + i);
                    Console.WriteLine("So cho la: " + (36 - i));
                    break;
                }
            }
            Console.ReadKey();
        }
    }

ASP.NET

void GiaiBaiToanDanGian()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 9; i < 25; i++)
        {
            if ((i * 2 + (36 - i) * 4) == 100)
            {
                sb.AppendLine("Số gà là: " + i);
                sb.AppendLine("Số chó là: " + (36 - i));
            }
        }
        Label1.Text = sb.ToString();
    }

PHP




Bài toán dân gian


Giải bài toán dân gian trong PHP
Vừa gà vừa chó 
Bó lại cho tròn 
Ba mươi sáu(36) con 
Một trăm(100) chân chẵn
Hỏi mấy gà, mấy chó?

'; echo 'Số chó là: '.(36 - $i); } } ?>

Javascript



alert('Giai bai toan dan gian');
for(i = 9; i < 25; i++)
{
if((i * 2 + (36-i)*4) === 100){
alert('Số gà là: ' + i + '; Số chó là: '+(36-i));
}
}


Chúc các bạn học lập trình vui vẻ

Từng bước để trở thành một lập trình viên giỏi

Thời gian gần đây tôi có nhận được một số email mà về cơ bản đều hỏi rằng “làm thế nào để có thể trở thành một lập trình viên giỏi/ xuất sắc?”
Những dạng email kiểu này nói chung thường làm tôi cảm thấy buồn lòng, bởi vì tôi cảm thấy dường như khi bạn hỏi dạng câu hỏi này, thì bạn đang tìm kiếm một liều thuốc thần diệu nào đó khiến bạn có thể sẽ đột nhiên trở thành một lập trình viên tài ba.

Tôi nghi ngờ rằng có rất ít người trong số đã gửi email để hỏi tôi về câu hỏi này thực sự muốn biết làm thế nào để trở thành một lập trình viên xuất sắc, nhưng có lẽ họ đang chỉ muốn tìm kiếm cho mình một giải pháp nhanh chóng hoặc một câu trả lời dễ dàng.

Một mặt khác, tôi nghĩ rằng có thể có một số lập trình viên chân thật, và chỉ là họ không biết làm thế nào để đặt ra những câu hỏi cần thiết để định hướng cho tương lai của họ. Tôi nghĩ những lập trình viên này – đặc biệt là những người vừa mới vào nghề – có lẽ đang tìm kiếm cho mình một hướng dẫn từng bước để trở thành một lập trình viên xuất sắc.

Vì vậy, tôi cũng cố gắng từ chính kinh nghiệm của bản thân và những kiến thức tốt nhất mà mình có, để đưa ra một chỉ dẫn kiểu từng bước step-by-step dành cho bạn.

Lúc này đây, dĩ nhiên là tôi nhận ra rằng không có một công thức thần kỳ nào ở đây cả và rằng có rất nhiều con đường có thể dẫn đến thành công, nhưng tôi nghĩ rằng nếu làm theo những bước hợp lý được phác thảo ra sau đây thì một bạn trẻ mới vào nghề có thể vươn tới một mức trình độ khá cao và sẽ có khả năng trở thành một lập trình viên giỏi hoặc thậm chí là xuất sắc.

Bước 1: Hãy chọn lấy một ngôn ngữ lập trình, và học từ những thứ căn bản nhất

Trước khi có thể chạy, thì chúng ta phải học cách để đi trước đã. Bạn đi bằng cách học làm thế nào để lập trình trong một ngôn ngữ lập trình nào đó. Bạn đừng có học đi bằng cách cố gắng học 50 triệu thứ cùng một lúc, vì bạn không thể có phép phân thân ra như Tôn Ngộ Không được phải không nào.

Có rất nhiều lập trình viên bắt đầu bằng cách thử và nhảy vào tất cả mọi thứ một lần và không có đủ kiên nhẫn để học chỉ một ngôn ngữ lập trình duy nhất trước khi tiến lên phía trước. Họ nghĩ rằng họ phải biết tất cả những công nghệ mới đang “hot” thì mới có thể kiếm được một công việc lập trình. Trong khi đúng ra thì bạn cần biết nhiều hơn chỉ những kiến thức cơ bản của một ngôn ngữ lập trình duy nhất, bạn phải bắt đầu từ đây, vì như vậy thì bạn mới có thể tập trung được tốt nhất.

Chọn lấy một ngôn ngữ lập trình mà bạn nghĩ rằng sự nghiệp của mình về cơ bản sẽ xoay quanh nó. Ngôn ngữ lập trình đó tự bản thân nó thì không quan trọng nhiều lắm, nhưng bạn nên tính toán cả về lâu về dài nữa. Ý tôi muốn nói là bạn đừng nên thử và học một ngôn ngữ lập trình “dễ” khi bắt đầu. Hãy học bất cứ ngôn ngữ nào mà bạn cảm thấy thích thú và có thể nhìn thấy tương lai lập trình của mình trong một vài năm sắp tới. Bạn muốn chọn một cái gì đó mà sẽ mang lại giá trị lâu dài.

Một khi bạn đã chọn lấy ngôn ngữ lập trình nào đó thì bạn sẽ thử học và tìm một số cuốn sách hoặc bài thực hành mà chỉ liên quan đến ngôn ngữ lập trình đó thôi. Ý tôi muốn nói là bạn đừng tìm học các tài liệu mà dạy bạn quá nhiều thứ một lúc. Bạn nên tìm những tài liệu dành cho người mới bắt đầu mà chỉ tập trung vào ngôn ngữ đó, chứ không phải là rất nhiều công nghệ liên quan.

Khi bạn đọc xuyên suốt các tài liệu đó hoặc duyệt qua các bài thực hành mà bạn đã lựa chọn, thì hãy chắc chắn rằng bạn có thực hành viết code. Hãy làm thật nhiều bài tập có thể. Hãy thử nghiệm tất cả những gì bạn đã học được. Hãy thử gom các thứ lại với nhau và sử dụng tất cả các khái niệm mà bạn đã học được về nó. Vâng, điều này thì khá là “đau khổ”. Việc đọc hùng hục một cuốn sách từ trang đầu đến trang cuối thì rất dễ dàng, nhưng nếu bạn thực sự muốn học thực sự thì bạn cần phải thực hành.

Khi bạn đang viết code, hãy cố chắc chắn rằng bạn hiểu tất cả dòng code mà mình viết ra. Điều tương tự cũng cần làm cho bất kỳ dòng code nào mà bạn đọc. Khi viết ra những đoạn code, hãy làm chậm rãi và đảm bảo rằng bạn hiểu nó. Bất cứ điều gì mà bạn không hiểu, thì hãy tìm hiểu và làm rõ nó. Hãy dành thời gian làm điều này thì bạn sẽ không bị hổng kiến thức và mơ hồ về sau này.

Cuối cùng, hãy chuẩn bị tư tưởng là phải đọc qua một cuốn sách hoặc một hướng dẫn thực hành ít nhất 3 lần trước khi bạn có thể hiểu hết nó. Bạn sẽ không thu được phần “lập trình” trong lần thử đầu tiên – không ai từng làm được điều đó cả. Bạn cần lặp lại để bóc trần nó trước khi bạn bắt đầu có thể hiểu và thu nhận kiến thức từ nó và bạn hiểu được điều gì thực sự đang diễn ra. Cho tới một lúc bạn sẽ cảm thấy như bị lạc lối, điều đó là tốt, đó là một phần của quá trình phát triển. Chỉ việc chấp nhận nó và tiến lên phía trước.

Bước 2: Xây dựng một cái gì đó nhỏ thôi

Lúc này thì bạn đã có một hiểu biết cơ bản về một ngôn ngữ lập trình nào đó rồi, và đây là lúc để đưa những kiến thức đó vào làm việc và để nhận ra bạn đang thiếu hụt những gì. Cách tốt nhất để làm điều này là thử xây dựng một cái gì đó.

Đừng quá tham vọng tại thời điểm này – nhưng bạn cũng đừng quá nhút nhát. Hãy tìm kiếm ý tưởng tạo ra một ứng dụng mà đủ đơn giản để bạn có thể hoàn thành nó với một số nỗ lực, nhưng không phải là sẽ làm bạn mất vài tháng để hoàn thành. Cố gắng hạn chế nó chỉ trong ngôn ngữ lập trình bạn đã học nhiều nhất có thể. Đừng cố gắng để làm một cái gì đó mà phải áp dụng nhiều công nghệ khác nhau (nghĩa là, sử dụng tất cả những công nghệ từ giao diện người dùng cho đến database) – mặc dù bạn sẽ có thể cần sử dụng một vài framework hoặc API có sẵn.

Đối với ứng dụng đầu tay thì bạn có thể chọn giải pháp sao chép một cái gì đó đơn giản mà đã tồn tại rồi. Hãy tìm kiếm một ứng dụng đơn giản, kiểu như một ứng dụng dạng To-Do List, chương trình hẹn giờ tắt máy tính chẳng hạn và cố gắng mô phỏng nó. Đừng cho phép các kỹ năng thiết kế của bạn cản trở việc học lập trình.

Tạo ra những ứng dụng đơn giản trước.Tôi đề xuất bạn nên tạo ra một ứng dụng nào đó dành cho thiết bị di động, bởi vì hầu hết các ứng dụng di động thì thưởng nhỏ và khá dễ làm. Thêm nữa, việc học các kỹ năng phát triển cho di động thì rất có ích vì có rất nhiều các công ty đang bắt đầu cần các ứng dụng di động. Ngày nay, bạn có thể xây dựng một ứng dụng di động trong hầu như bất kỳ ngôn ngữ lập trình nào. Có rất nhiều giải pháp mà cho phép bạn xây dựng một ứng dụng cho các hệ điều hành di động khác nhau sử dụng rất nhiều các ngôn ngữ lập trình.

Bạn cũng có thể xây dựng một ứng dụng web nhỏ, nhưng cố gắng không nhảy quá sâu vào nhiều công nghệ phát triển web phức tạp. Về cơ bản tôi đề xuất bạn nên bắt đầu bằng một ứng dụng di động, bởi vì phát triển web thì có vẻ rắc rối hơn một chút cho người mới bắt đầu. Để phát triển một ứng dụng web thì bạn sẽ phải cần biết ít nhất là một số kiến thức về HTML, có thể một vài framework back-end và JavaScript.

Cho dù là bạn chọn cái gì để xây dựng, thì bạn có thể phải học chút ít về một vài framework – điều này thì rất tốt, chỉ đừng có quá sa lầy vào những chi tiết. Ví dụ, bạn có thể viết một ứng dụng Android khá đơn giản mà không cần phải thực sự biết nhiều về tất cả các hàm API của Android và làm thế nào Android hoạt động, chỉ bằng cách làm theo một số bài hướng dẫn đơn giản. Chỉ đừng tốn quá nhiều thời gian để cố gắng học mọi thứ về một framework nào đó. Hãy học cái mà bạn cần biết để phục vụ hoàn thành dự án của mình. Bạn có thể học về các chi tiết sau này.

Oh, và điều này có vẻ là hơi khó. Nhưng đó chính là cách bạn học như thế nào. Bạn phải vật lộn để nhận ra làm thế nào để làm một điều gì đó, sau đó bạn sẽ tìm thấy câu trả lời. Đừng bỏ qua bước này. Bạn sẽ chẳng bao giờ vươn tới đẳng cấp là một nhà phát triển phần mềm chuyên nghiệp nếu bạn không học những thứ khó khăn và nhận ra nhiều điều thú vị trong quá trình nghiên cứu. Đây là một khóa huấn luyện tốt cho tương lai của bạn.

Bước 3: Nghiên cứu về một framework

Lúc này là thời điểm để thực sự tập trung vào một framework. Vì lúc này bạn đã nắm được một lượng kiến thức kha khá về ít nhất là một ngôn ngữ lập trình rồi và đã có một số kinh nghiệm để có thể làm việc cùng một framework cho các ứng dụng di động hoặc web.

Hãy chọn một framework nào đó để học và nó sẽ cho phép bạn làm việc hiệu quả hơn trong một số môi trường. Dạng framework mà bạn lựa chọn để học sẽ được dựa trên kiểu nhà phát triển phần mềm nào mà bạn muốn trở thành trong tương lai. Nếu bạn muốn trở thành một nhà phát triển web, thì bạn sẽ muốn học một web framework cho bất cứ ngôn ngữ lập trình nào mà bạn đang làm việc trên nó. Nếu bạn muốn trở thành một nhà phát triển ứng dụng di động, thì bạn sẽ cần học về một hệ điều hành di động và framework đi kèm với nó.

Cố gắng đào sâu kiến thức của bạn về framework đó. Điều này sẽ khá mất thời gian, nhưng đầu tư thời gian để học bất cứ thứ gì về framework mà bạn đang sử dụng thì rất tốt. Đừng cố học nhiều framework vào lúc này – nó sẽ chỉ khiến phân tán sự tập trung của bạn mà thôi. Hãy nghĩ về việc học các kỹ năng bạn cần cho một công việc xác định mà bạn muốn nhận, có sử dụng framework và chính ngôn ngữ lập trình mà bạn đang học. Bạn có thể luôn luôn mở rộng tập kỹ năng của mình sau này.

Bước 4: Học về một công nghệ cơ sở dữ liệu

Hầu hết các nhà phát triển phần mềm sẽ cần phải biết về một số công nghệ cơ sở dữ liệu vì rất nhiều các ứng dụng phải có một database back-end. Vì vậy, hãy chắc chắn rằng bạn không bỏ bê việc đầu tư vào lĩnh vực này.

Bạn sẽ có khả năng nhìn thấy lợi ích lớn nhất nếu bạn học về SQL – thậm chí nếu bạn lên kế hoạch sẽ làm việc cùng cơ sở dữ liệu NoSQL như MongoDB hoặc Raven, thì việc học SQL sẽ mang lại cho bạn một nền tảng tốt hơn để làm việc sau này. Có rất nhiều công việc tuyển dụng ngoài kia mà yêu cầu kiến thức về SQL nhiều hơn là NoSQL.

Đừng quá lo lắng về nhiều loại cơ sở dữ liệu SQL. Những công nghệ SQL khác nhau thì thực ra chúng có rất nhiều điểm giống nhau và bạn sẽ không gặp phải vấn đề gì trong việc chuyển đổi qua lại giữa chúng nếu bạn biết những kiến thức cơ bản về một công nghệ SQL nào đó. Chỉ chắc chắn rằng bạn hãy học về những thứ căn bản như table, queries, và những thao tác phổ biến về database khác.

Tôi khuyến khích bạn nên chọn một cuốn sách tốt về công nghệ SQL phù hợp và tạo ra một vài dự án nhỏ, vì vậy bạn có thể thực hành cái mà bạn đang học – luôn luôn thực hành những kiến thức mà bạn đang học.

Bạn phải có đủ kiến thức về SQL để có thể:

Ngoài ra, bạn sẽ muốn học một số dạng của công nghệ object relational mapping (ORM). Cái mà bạn học sẽ phụ thuộc vào công nghệ nào mà bạn đang làm việc trên đó. Tìm kiếm những công nghệ ORM phù hợp với framework mà bạn đã học. Có thể có một vài lựa chọn ở đây, vì vậy cách tốt nhất là bạn hãy chọn lấy cái phổ biến nhất.

Bước 5: Nhận một công việc hỗ trợ một hệ thống đang tồn tại

Ok, bây giờ bạn đã có đủ các kỹ năng và kiến thức để nhận được một công việc cơ bản như là một nhà phát triển phần mềm. Nếu bạn có thể chỉ cho tôi rằng bạn hiểu những kiến thức cơ bản của một ngôn ngữ lập trình, có thể làm việc cùng một framework, hiểu về cơ sở dữ liệu và đã xây dựng được ứng dụng của riêng bạn, thì tôi chắc chắn sẽ muốn thuê bạn – cũng như nhiều nhà tuyển dụng khác.

Bảo trì một hệ thống đang tồn tại.Điểm mấu chốt ở đây là không quá nhắm vào một công việc nào đó yêu cầu trình độ cao. Đừng cố thử tìm một công việc trong mơ của bạn ngay lúc này – vì bạn vẫn chưa đủ trình độ. Thay vì đó, cố gắng tìm một công việc dạng bảo trì một hệ thống phần mềm đang tồn tại mà được xây dựng sử dụng ngôn ngữ lập trình và framework mà bạn đã học.

Bạn có thể không tìm thấy chính xác một công việc như vậy, nhưng nhiều khả năng là bạn có thể tìm thấy một công việc tốt hơn. Cố gắng ứng tuyển vào những công việc phù hợp chính xác với những công nghệ mà bạn đã được học.

Thậm chí với sự thiếu hụt nhiều kinh nghiệm, nếu bạn phù hợp chính xác với một tập kỹ năng và bạn lại sẵn lòng trở thành một lập trình viên bảo trì, thì bạn sẽ có thể tìm thấy một công việc.

Vâng, dạng công việc này có thể hơi tẻ nhạt một chút. Nó không được hứng thú như là việc tạo ra một cái gì đó mới mẻ, nhưng mục đích của công việc này không phải là mang lại niềm vui hoặc để kiếm tiền, nó là để học hỏi và thu được nhiều kinh nghiệm nhiều nhất có thể.

Làm việc trên một ứng dụng đang tồn tại, cùng với một nhóm các nhà phát triển khác, sẽ giúp bạn mở rộng các kỹ năng của mình và biết được một hệ thống phần mềm lớn thường được cấu trúc như thế nào. Bạn có thể sửa các lỗi và bổ sung thêm các đặc trưng nhỏ khác, ngoài ra bạn cũng sẽ học và đưa những kỹ năng của bạn vào hành động.

Dồn hết tâm trí của bạn vào công việc này. Học mọi thứ bạn có thể. Làm công việc ở mức tốt nhất bạn có thể. Đừng nghĩ về tiền bạc, đảm nhiệm nhiều vai trò khác nhau trong dự án này – tất cả sẽ đến sau đó – còn lúc này, bạn hãy chỉ tập trung vào để làm cho công việc hoàn thành một cách hiệu quả nhất có thể và mở rộng các kỹ năng của bạn.

Bước 6: Học những bài thực hành tốt nhất về cấu trúc (structural)

Bây giờ là lúc để bạn bắt đầu nâng cao chất lượng trong việc viết code. Đừng lo lắng quá nhiều về vấn đề thiết kế phần mềm tại thời điểm này. Bạn cần học làm thế nào để viết những đoạn “code sạch” (clean code) mà dễ dàng để hiểu và bảo trì. Để làm được điều này, bạn sẽ cần phải đọc rất nhiều và xem nhiều ví dụ về một số đoạn code tốt (good code).

Hãy bổ sung vào giá sách của bạn với những cuốn sách sau đây:

Các cuốn sách về cấu trúc ngôn ngữ xác định như:

Tại thời điểm này bạn thực sự muốn tập trung việc học của mình vào xử lý cấu trúc để viết ra những đoạn code hay và làm việc trên nhiều hệ thống đang tồn tại. Bạn sẽ cố gắng để dễ dàng thực thi một thuật toán trong ngôn ngữ lập trình của bạn đã chọn và làm nó theo cách dễ dàng để đọc và hiểu nhất.

Bước 7: Học một ngôn ngữ lập trình thứ hai

Tại thời điểm này bạn nên phát triển khả năng bằng cách học một ngôn ngữ lập trình thứ hai thực sự tốt. Bạn nên chọn một ngôn ngữ lập trình mà khác hẳn ngôn ngữ mà bạn đã biết.

Điều này có vẻ như là hơi kỳ quặc, nhưng hãy để tôi giải thích lý do tại sao việc này là rất quan trọng. Khi bạn biết một ngôn ngữ lập trình thật giỏi, thì bạn chỉ hiểu các khái niệm của phát triển phần mềm trong ngôn ngữ lập trình đó, mà việc phát triển phầm mềm thì lại vượt quá một ngôn ngữ hoặc công nghệ riêng rẽ nào. Nếu bạn dành thời gian trong một môi trường hoặc ngôn ngữ lập trình mới, thì bạn sẽ bắt đầu nhìn thấy mọi thứ theo một cách mới. Bạn sẽ bắt đầu để học một cách thực tiễn hơn là theo cách bắt chước.

Là một lập trình viên mới, bạn thường rất thích làm mọi thứ theo một cách đặc biệt nào đó mà không cần biết lý do tại sao bạn lại đang làm chúng theo cách đó. Một khi bạn đã học một ngôn ngữ lập trình thứ hai và nắm vững công nghệ, thì bạn sẽ bắt đầu tìm hiểu xem về lý do tại sao. Tin tôi đi, bạn sẽ phát triển nếu bạn thực hiện điều này. Đặc biệt là nếu bạn chọn lấy một ngôn ngữ lập trình mà bạn ghét.

Chắc chắn rằng bạn xây dựng một thứ gì đó cùng với ngôn ngữ mới này. Không cần phải hoành tráng, nhưng một cái gì đó đủ phức tạp để bắt bạn phải suy nghĩ động não thật nhiều và có thể thậm chí phải đập đầu vào tường – nhè nhẹ.

Bước 8: Xây dựng một cái gì đó có giá trị

Tốt rồi, bây giờ tiến đến việc kiểm tra thực sự để chứng tỏ khả năng phát triển phần mềm của bạn. Liệu bạn có thể thực sự xây dựng một cái gì đó quan trọng cho chính mình?

Nếu bạn tiếp tục tiến lên và tự tin để nhận một công việc xây dựng một cái gì đó, và có lẽ thậm chí thiết kế một cái gì đó cho một ông chủ của mình, bạn biết là bạn có thể làm nó. Không có cách nào tốt hơn để biết nó hơn là bắt tay vào làm nó.

Chọn một dự án mà sẽ sử dụng được toàn bộ các kỹ năng của bạn. Chắc chắn rằng bạn kết hợp cả cơ sở dữ liệu, framework và mọi thứ khác mà bạn cần để xây dựng một ứng dụng hoàn chỉnh. Dự án này nên là một cái gì đó mà sẽ chiếm của bạn nhiều hơn một tuần làm việc và yêu cầu một số suy nghĩ nghiêm túc và thiết kế. Thử làm một cái gì đó mà bạn có thể kiếm được tiền từ nó để bạn có một vài động lực làm việc.

Nên chắc chắn rằng bạn không phát triển nó ra quá lớn. Bạn vẫn không muốn mang quá nhiều tham vọng vào đây. Chọn một dự án mà sẽ thách thức bạn, nhưng không phải là một dự án mà bạn sẽ chẳng bao giờ hoàn thành được. Đây là một bước ngoặt quan trọng trong sự nghiệp của bạn. Nếu bạn có sự cam kết để theo và hoàn thành dự án này, thì bạn sẽ đi được rất xa, còn nếu bạn không thể… vâng, thì tôi không thể nói trước được điều gì.

Bước 9: Kiếm một công việc tạo một hệ thống mới

Ok, bây giờ là lúc để bạn lại tiếp tục đi tìm công việc tiếp theo. Bởi vào thời điểm này, bạn đã đạt được lợi ích lớn nhất từ công việc hiện tại – đặc biệt là nếu nó vẫn chỉ là công việc bảo trì.

Tham gia tạo ra một hệ thống phần mềm mới.Đây là thời điểm để tìm kiếm một công việc mà sẽ thách thức bạn – nhưng đừng quá nhiều. Bạn vẫn sẽ phải học rất nhiều, vì vậy bạn không muốn nhận một công việc mà quá phức tạp so với bạn. Lý tưởng là bạn nên tìm một công việc nơi mà bạn sẽ có cơ hội để làm việc trong một nhóm đang xây dựng một sản phẩm gì đó mới mẻ.

Có thể bạn không phải là người kiến trúc ra hệ thống đó, nhưng việc tham gia tạo ra một ứng dụng sẽ giúp bạn mở rộng các kỹ năng của mình và thách thức bạn trong nhiều cách khác nhau hơn là chỉ ngồi bảo trì một hệ thống phần mềm đang tồn tại.

Bạn đã có một sự tự tin trong việc tạo ra một hệ thống mới rồi, bạn vừa kết thúc việc tạo ra một hệ thống quan trọng cho riêng mình, vì vậy bạn có thể bước vào buổi phỏng vấn mà không cảm thấy quá hồi hộp và cùng với niềm tin rằng bạn có thể làm được công việc đó. Sự tự tin này sẽ giúp bạn có thể nhận được bất cứ công việc nào mà bạn ứng tuyển vào.

Hãy chắc chắn rằng bạn khiến cho nhà tuyển dụng được tập trung. Hãy nêu bật lên tập các kỹ năng xác định mà bạn đã đạt được. Đừng cố gây ấn tượng với bất kỳ ai bằng một danh sách dài dằng dặc của những kỹ năng chả liên quan gì. Tập trung vào những kỹ năng quan trọng nhất và tìm kiếm những công việc mà phù hợp chính xác với chúng – hoặc ít ra thì cũng phù hợp nhất có thể.

Bước 10: Học những bài thực hành tốt nhất về thiết kế phần mềm

Bây giờ là thời điểm để bạn đi từ một junior (ít kinh nghiệm) thành một senior developer (lập trình viên lão luyện). Các junior developer thường bảo trì các hệ thống, còn senior developer thì thiết kế và xây dựng các hệ thống của họ. (Thường là vậy, dĩ nhiên là cũng có một số senior developer chuyên đi bảo trì các hệ thống.)

Bạn đã sẵn sàng để xây dựng các hệ thống ngay lúc này, nhưng bây giờ bạn cần phải học cách làm thế nào để thiết kế ra chúng.

Bạn nên tập trung vào việc nghiên cứu vào các bài thực hành thiết kế tốt nhất và một số chủ đề nâng cao kiểu như:

Danh sách này có thể sẽ còn dài ra rất nhiều – bạn sẽ chẳng bao giờ có thể kết thúc việc học và phát triển các kỹ năng của bạn trong lĩnh vực này. Chỉ nên chắc chắn rằng hãy bắt đầu cùng với những thứ quan trọng nhất trước tiên – điều này sẽ phụ thuộc vào cái mà bạn cảm thấy thú vị và nơi mà bạn muốn đến trong sự nghiệp của mình.

Mục tiêu của bạn ở đây là có khả năng không chỉ là xây dựng một hệ thống mà một ai đó đã thiết kế ra, mà nó phải hình thành dựa trên quan điểm của chính bạn về phần mềm nên được thiết kế ra làm sao và những dạng kiến trúc nào thì phù hợp cho những loại vấn đề này.

Bước 11: Tiếp tục học

Tại thời điểm này thì bạn đã làm ra sản phẩm phần mềm, nhưng bạn cần phải tiếp tục phát triển để trở thành một lập trình viên giỏi, thậm chí có thể trở nên “xuất sắc”. Luôn tâm niệm rằng bạn sẽ luôn có một cái gì đó để học thêm.

Phải mất bao lâu thì bạn mới có thể tới được điểm này? Tôi cũng không biết chắc. Nó có thể mất ít nhất một số năm, nhưng có thể phải đến 10 năm hoặc hơn – nó còn tùy thuộc vào việc bạn cống hiến nhiều như thế nào và những cơ hội nào xuất hiện với bạn nữa.

Có một con đường tắt khá tốt đó là cố gắng và luôn luôn bao quanh bạn bởi những lập trình viên giởi hơn bạn để có thể học hỏi từ họ.

Một số điều cần làm trong suốt quá trình thực hiện các bước trên

Có một số điều mà bạn nên làm trong suốt quá trình mà bạn đang làm theo 10 bước nói trên. Nó sẽ rất khó để liệt kê chúng trong mỗi bước, vì vậy tôi sẽ liệt kê chúng một cách tóm tắt ở đây:

Dạy – Toàn bộ thời gian trong quá trình bạn đang học các thứ nói trên, bạn cũng nên dạy chúng cho những người khác. Không quan trọng là liệu bạn là một người mới bắt đầu hay là một chuyên gia, bạn sẽ có một cái gì đó có giá trị để dạy, dạy người khác thì cũng là một cách tốt nhất để học. Ghi lại tài liệu tất cả quá trình và chuyến hành trình của bạn, và giúp đỡ những người khác trên suốt con đường mà bạn đi.

Tiếp thị bản thân bạn – Tôi nghĩ rằng đây là một điều rất quan trọng đến mức tôi đã xây dựng một khóa học hoàn chỉnh về ý tưởng này. Học cách làm thế nào để tiếp thị bản thân và tiếp tục làm nó trong suốt sự nghiệp của bạn. Nhận ra cách làm thế nào để có thể tạo ra thương hiệu cá nhân cho chính bạn, xây dựng một danh tiếng cho riêng mình trong ngành công nghiệp phần mềm và bạn sẽ chẳng bao giờ sợ thiếu việc làm cả. Bạn sẽ quyết định về tương lai của chính mình nếu bạn học được cách tiếp thị bản thân. Có rất nhiều công việc phải làm, nhưng nó cũng mang lại giá trị xứng đáng. Bạn đang đọc bài viết này từ chính nỗ lực của tôi cho mục đích đó.

Đọc – Đừng bao giờ ngừng học. Đừng bao giờ ngừng đọc. Luôn luôn làm việc theo cách của bạn thông qua những cuốn sách. Luôn luôn phát triển bản thân. Chuyến hành trình tìm kiếm tri thức của bạn sẽ chẳng bao giờ kết thúc, vì việc học là chuyện của cả đời. Bạn có thể sẽ không biết được tất cả. Nếu bạn tiếp tục học trong suốt sự nghiệp của mình, thì bạn sẽ luôn luôn vượt trội hơn so với những đồng nghiệp khác.

Làm – Với mỗi điểm dừng chân trên chuyến hành trình đó, đừng chỉ học mà hãy làm. Hãy đặt mọi thứ mà bạn học được vào hành động. Thiết lập một quỹ thời gian bên cạnh để luyện tập các kỹ năng của bạn và viết code và xây dựng một số thứ. Cũng giống như việc bạn có thể đọc tất cả các cuốn sách về hướng dẫn chơi golf mà bạn muốn, nhưng bạn sẽ chẳng bao giờ trở thành tay golf số 1 thế giới như Tiger Woods nếu bạn không vác gậy đi đánh golf thực sự.

Nguồn bài viết: Hồ Sỹ Hùng, blog công nghệ vinacode.net. Bài viết đã được sự cho phép chia sẻ của tác giả bằng email.

Anh Hồ Sỹ Hùng, một developer thế hệ 8x, blog của anh có nhiều bài dịch từ các trang nước ngoài, rất phù hợp với những bạn khả năng Tiếng Anh còn yếu. Đây là blog hay cho các bạn là lập trình viên, các bạn quan tâm có thể đọc nhiều bài viết hay của anh tại vinacode.net