Lối thoát nào cho lập trình viên Việt Nam?

Tuần rồi có gặp lại mấy người bạn cũ, nghe họ than thở sao đi làm lập trình viên áp lực và đòi hỏi suy nghĩ nhiều vậy mà lương lại không tăng được bao nhiêu. Nghe vậy tôi cũng không biết nói sao, chỉ cười thầm trong bụng "Ôi, làm ngành này mà không ...nhảy công ty thì bao giờ lương mới lên nhanh ;))"

Với tôi thì đây quả thật là một vấn đề cần tính đến bởi có lẽ hiếm có nghề nào lại ...."bạc bẽo" như lập trình viên. Nếu các ngành khác như giáo viên, bác sĩ, bán hàng... càng làm lâu càng có quan hệ và kinh nghiệm thì ngược lại khả năng tư duy của các lập trình viên sẽ ngày một chậm đi do tuổi tác. Đứng ở tư cách một chủ doanh nghiệp, rõ ràng bạn sẽ thích thuê những lập trình viên trẻ trung, vừa nhanh nhẹn, chi phí phải chăng hơn là thuê các lão tướng lương cao mà lại ngày một chậm chạp hơn.

Và rõ ràng trước tình hình như thế, người lập trình viên cần tính cho mình một lối thoát trước khi chạm đến ngưỡng không còn khả năng lập trình được nữa :)

1. Thăng tiến theo con đường lập trình

Với một lập trình viên thuộc loại khá, hiện nay sau khi ra trường sẽ được trả mức lương trung bình vào khoảng 400-500$ (Theo số liệu các công ty gia công ở TPHCM, ở Hà Nội có thể thấp hơn). Sau khoảng 2 năm con số này sẽ tăng lên khoảng 1000$, và 2-3 năm nữa có thể lên đến 2000$. Tuy nhiên đến đây có thể xem là đã chạm ngưỡng. Sở dĩ nói vậy vì theo tôi được biết một số công ty nước ngoài trả tiền gia công cho các công ty Việt Nam theo đầu người khoảng 2000$/người, trừ đi các chi phí điện nước, thuế má... thì có lẽ mức lương trung bình cho mỗi người sẽ chỉ có thể khoảng 1000-1500$ mà thôi, trả cho tôi 2000$ tức là phải bù lỗ từ các lập trình viên trung bình khác. Tất nhiên con số này có thể sẽ cao hơn ở những công ty gia công tầm cao không trả theo đầu người, tuy nhiên chỉ là thiểu số.

Để có thể leo đến mức này thì không chỉ đòi hỏi tôi phải có năng lực thật tốt mà còn phải khéo léo trong việc đàm phán, cũng như phải chọn đúng những công ty đủ triển vọng có hầu bao tốt sẵn sàng chi trả mức trên. Và đến khi đạt được, tất nhiên tôi cũng sẽ nhận được những áp lực cho "tương xứng" với mức lương đó cũng như sẽ là mục tiêu sa thải đầu tiên trong các thời kì kinh tế khó khăn. Một khi bị sa thải, sẽ rất khó để có thể tìm được công việc mới với mức lương như cũ.

Tuy nhiên nếu leo lên tới được mức ở trên thì theo tôi cũng đã đủ sống ở Việt Nam. Với giá một căn hộ dành cho người thu nhập trung bình vào khoảng 600 triệu hiện nay, thì tôi nhẩm tính với mức lương 1000$ mỗi tháng để dành 10 triệu là chỉ cần 5 năm là có thể trả hết. Với mức lương 2000$ thì chỉ cần 2.5 năm. Như vậy thì tôi cũng có thể tập trung vào công nghệ, từng bước trau dồi để leo lên các vị trí quản lý công nghệ cao hơn.

Tuy nhiên phần lớn số lượng lập trình viên Việt Nam sẽ không nằm trong tốp này, cũng như các công việc gia công ở Việt Nam chỉ quanh quẩn ở tầm thấp nên đến một lúc nào đó những người có năng lực cũng sẽ từng bước tách ra tìm cho mình một con đường triển vọng hơn.

2. Tìm một nghề mới triển vọng hơn

Vậy nếu không làm lập trình viên thì sẽ làm gì? Nhìn vào số lượng những người bạn xung quanh, tôi thấy phổ biến nhất là chọn một ngành triển vọng hơn nhưng có liên quan đến IT

- Làm IT trong các ngân hàng, công ty chứng khoán: Các công ty này cũng cần rất nhiều đến IT, đôi lúc cả những công việc lập trình. Làm trong những công ty này có thể dễ dàng tiếp cận được với những nguồn thông tin khá tốt, cộng với khả năng xử lý thông tin thế mạnh của các lập trình viên thì có lẽ sớm muộn cũng tìm được một hướng đi triển vọng như một nghề tay trái bên cạnh nghề lập trình hiện tại. Tôi còn biết có vài đại ca ngành này làm một hồi còn chuẩn bị có ý định tách ra lập ngân hàng nữa chứ ;)

- Đi Sale IT: Với một thị trường khá tiềm năng thì Việt Nam đang là đích đến của rất nhiều công ty sales như Microsoft, IBM, Cisco, Oracle, HP... Làm nghề này thì đòi hỏi khả năng giao tiếp cũng nhiều mối quan hệ. Với mức lương khá cao cũng như hưởng huê hồng theo doanh số thì đến một lúc nào đó hoàn toàn có thể bứt xa so với mức lương lập trình viên ở trên. Ngoài ra làm nghề này được thêm cái dễ nhảy, không làm cho Microsoft thì sang làm cho IBM, Cisco... Nói chung với một thị trường đông dân và còn tăng trưởng cao như Việt Nam hiện nay thì không thiếu cơ hội.

- Đi buôn Bất Động Sản: Đi buôn BĐS cũng vui, chỉ có điều là nó không liên quan tới IT lắm và đòi hỏi vốn cũng phải kha khá. Nhưng nếu quyết tâm theo đuổi trong thời gian dài thì sớm hay muộn cũng sẽ đạt được những thành tựu, thậm chí là rất lớn. Nhìn quanh quẩn thấy đa phần tầng lớp giàu có ở Việt Nam đều giàu lên từ ngành này (Theo thống kê không chính thức là 50%). Do đó với khả năng của suy luận của lập trình viên cộng thêm giao tiếp khéo léo và từng bước mở rộng quan hệ, thì đây cũng là một hướng đi triển vọng có thể cân nhắc

- Đi làm nhà giáo: Suy nghĩ này có vẻ hơi "điên" bởi đa phần mọi người nghĩ lương nhà giáo ba cọc ba đồng, làm sao mà sống. Tôi cũng nghĩ vậy cho đến khi nghe một anh bạn nói trung bình mỗi buổi anh đó đi dạy được 1 triệu, Sau vài giây tính toán, tôi nhẩm tính như vậy là một tháng anh cũng kiếm được 30-40 triệu, với những người có tiếng tăm có lẽ còn cao hơn nữa. Ngoài ra làm ngành này được thêm lợi thế là xã hội trọng vọng, cũng như tích lũy được rất nhiều mối quan hệ để làm vô số điều khác sau này. Có lẽ đây là một trong những lối thoát rất tốt và tôi sẽ còn đề cập trong một bài viết khác ;))

3. Lập công ty tự xây dựng sự nghiệp cho mình

Bên cạnh hướng tìm một nghề triển vọng hơn ở trên, với những người với cá tính mạnh thì họ lại muốn tự lập công ty để khẳng định mình. Nhưng nếu làm một công ty IT thì nên đi hướng nào?

- Gia công: Đây là một trong những hướng mà tôi thấy khá nhiều các công ty phía Nam ưa chuộng. Xuất phát từ một số hợp đồng có được, họ tuyển nhân công vào làm rồi cứ thế từng bước mở rộng. Tuy nhiên làm nghề này có cái bấp bênh là nhân sự không ổn định, bởi rõ ràng với hướng này thì chỉ có thể mở rộng theo quy mô số lượng nhân viên mà thôi. Điều này thì buộc công ty phải luôn tìm kiếm những hợp đồng mới và việc này hoàn toàn không đơn giản bởi đòi hỏi những doanh nhân trẻ phải có nhiều mối quan hệ quốc tế. Ngoài ra, đến một lúc nào đó quy mô lớn thì chỉ cần không có hợp đồng trong vài tháng thì công ty cũng đi luôn. Nhiều công ty ở gia công ở VN đã rơi vào tình trạng như vậy.

- Làm giải pháp cho thị trường trong nước: Các công ty theo hướng này thi đa phần tôi nhận thấy họ thường có một khách hàng ban đầu với nhu cầu về một sản phẩm nào đó. Và họ từng bước làm sản phẩm để đáp ứng nhu cầu của khách hàng này rồi kì vọng sẽ bán được cho các khách hàng tiếp theo. Tuy nhiên phần lớn các công ty theo lĩnh vực này không ổn định và doanh số bấp bênh. Câu hỏi đặt ra là liệu thị trường sản phẩm họ đang làm có đủ để nuôi họ, cũng như việc các hợp đồng có quy mô ở Việt Nam đa phần đều dựa trên quan hệ. Việc họ có được hợp đồng ban đầu không chắc là họ sẽ kiếm được những hợp đồng tiếp theo. Có lẽ các công ty dù thành công trong lĩnh vực này cũng đều hiểu đây không phải là hướng đi lâu dài, họ cần phải có những sản phẩm chủ lực và bền vững hơn.

- Làm các dịch vụ dot-com: Có lẽ đây là một trong những lối thoát tốt nhất cho các công ty CNTT. Một sản phẩm thành công và doanh số ổn định sẽ là một nguồn đảm bảo rất lớn cho sự phát triển của công ty trong tương lai. Nhiều quỹ đầu tư lớn như IDG, DFJ Vinacapital... cũng đã vào Việt Nam để hỗ trợ cho những sản phẩm như vậy. Tuy nhiên thị trường này đang chịu một sức ì rất lớn, ngoài những sản phẩm đánh trúng mục tiêu vào thị trường game online, SMS... thì hầu hết các công ty còn lại đều đăng nằm trong tình trạng chờ thời và nỗ lực tìm kiếm đầu ra. Nhưng dẫu sao theo tôi đây vẫn là một hướng đi triển vọng, đặc biệt trong trường hợp sản phẩm mang một số yếu tố mới thì khi thành công ở Việt Nam sẽ có thể từng bước vươn ra thị trường bên ngoài, có thể chỉ dưới dạng gia công như ở trên nhưng sẽ ở một cấp độ cao hơn và đem lại giá trị gia tăng hơn rất nhiều.

Tổng kết lại thì trên đây là một số hướng đi theo quan điểm của riêng tôi mà những lập trình viên có thể cân nhắc cho sự nghiệp tương lai của mình. Khó có một cá nhân nào có thể gắn bó với nghề lập trình mãi mãi. Tất nhiên việc chọn hướng đi nào sẽ phụ thuộc vào tính cách của từng người khác nhau. Với riêng bản thân, thì tôi vẫn đang trên đường tự đào tạo để trở thành một trong những "nhân vật chủ chốt" góp phần xây dựng một công ty IT hùng mạnh của Việt Nam trong tương lai và từng bước vươn ra bên ngoài. Có thể bạn sẽ cho tôi là người "mơ mộng" nhưng đôi lúc tôi nghĩ nếu cả cuộc đời mình có thể sống với những lý tưởng cá nhân thì không phải tôi đã là một người rất hạnh phúc à, dẫu cho những lý tưởng đó là ...không tưởng ;)). Tất nhiên cũng có thể đến một lúc nào đó tôi nhận ra sự thật phũ phàng đó, nếu vậy thì thôi đành an phận làm một leader bình thường hướng dẫn thế hệ đàn em đi sau hay chuyển sang nghề nhà giáo, nếu được như ở trên thì cũng triển vọng phết nhỉ ^_^. Vậy còn với bạn, nếu bạn là lập trình viên thì bạn sẽ tính sao?

(
Nguồn Ngôn Phạm's blog)

“Cha đẻ” của 10 công nghệ nổi tiếng

Họ là những người phát minh ra một sản phẩm hay khởi đầu cho một xu hướng công nghệ. Họ là những người đã tạo tiền đề cho công nghệ phát triển như ngày nay. Hãy cùng nhìn lại 10 gương mặt được báo PC World bình chọn.

Marty Cooper - cha đẻ của điện thoại di động

Ông là người đầu tiên sáng lập hệ thống điện thoại radio vào năm 1973 khi đang làm việc tại Motorola và là người đầu tiên thực hiện cuộc gọi qua thiết bị này. Ông cho biết cảm hứng để chế tạo sản phẩm này chính là từ cuộc nói chuyện trên một chiếc điện thoại. Hiện ông là giám đốc điều hành cũng như là nhà sáng lập ra ArrayComm.

Mike Lazaridis - cha đẻ của BlackBerry

Sinh ra ở Thổ Nhĩ Kỳ, đến năm 5 tuổi, ông theo chân cha mẹ sang Canada sinh sống. Ở tuổi 12, ông đoạt được một giải thưởng dành cho các độc giả sách khoa học trong thư viện của trường đang học. Đến năm 1984, ông bỏ học thành lập Công ty Research in Motion (RIM) và phát triển điện thoại kiêm thiết bị e-mail BlackBerry. Năm 2000, ông đầu tư 100 triệu USD dành riêng cho các nghiên cứu lý thuyết về vật lý.

Tony Fadell - cha đẻ của iPod

Ông bắt đầu công việc của mình là một nhà tư vấn bên ngoài của Apple, sau đó trở thành thành viên đầu tiên trong đội ngũ kỹ thuật viên phần cứng của Apple iPod vào năm 2001. Cho đến nay ông đã trở thành nhân viên cao cấp của iPod Division.

John Backus - cha đẻ của ngôn ngữ Fortran

Cựu nhân viên của IBM này đã sáng lập ngôn ngữ lập trình Fortran (Formula Translator) vào những năm 1950, đây được xem là ngôn ngữ lập trình máy tính đầu tiên trên thế giới. Ông đã qua đời vào năm ngoái ở tuổi 82.

Jack Nilles - cha đẻ của telecommuting

Thuật ngữ telecommuting (làm việc từ xa) được Jack Nilles nêu ra vào năm 1970 khi ông đang làm việc tại Đại học miền Nam California để phát triển dự án giúp nhân viên không còn phải hối hả trong giờ cao điểm mà có thể làm việc tại nhà qua các phương tiện viễn thông. Ông từng thiết kế phương tiện và hệ thống liên lạc cho lực lượng không quân Mỹ và NASA.

Doug Engelbart - cha đẻ của chuột máy tính

Ông là người cho ra mắt chuột máy tính đầu tiên vào năm 1964 với vỏ bọc bằng gỗ, nhưng mãi đến năm 1970 ông mới được cấp bằng sáng chế và bằng này hết hạn vào năm 1987 trước khi cuộc cách mạng về máy tính cá nhân bắt đầu nở rộ. Vào năm 1969, ông chuyển sang làm việc tại phòng thí nghiệm của Stanford. Đến nay ông đã bước sang tuổi 83 và đang là người đứng đầu của Viện Bootstrap.

Gary Thuerk - cha đẻ của Spam

Vào năm 1978, ông là người đầu tiên gửi hàng trăm thư rác (hay còn gọi là spam) đến hòm mail của mạng ARPANET. Động thái này của ông đã bị nhiều người chỉ trích. Thế nhưng ông tuyên bố: “Tôi là người đầu tiên làm ra điều đó và tôi tự hào về nó”.

Đến nay spam được xem là mối đe dọa rất lớn đối với người sử dụng email khi 80-90% trong số email là thư rác và dường như không ai biết được nó đến từ đâu cũng như làm thế nào để có thể chặn nó.

John Cioffi - cha đẻ của DSL

Vị giáo sư tại Đại học Stanford này là người đầu tiên triển khai công nghệ Digital Subscriber Line (gọi tắt là DSL) sử dụng đường dây dẫn bằng đồng truyền dữ liệu trên băng thông rộng.

James Gosling - cha đẻ của Java

Ông được sinh ra tại Canada và là người đầu tiên viết ra nền tảng UNIX. Tại Sun, ông được ghi nhận là người đầu tiên sáng lập các ngôn ngữ lập trình Java vào năm 1991.

Vic Hayes - cha đẻ của Wi-Fi

Ông là một kỹ sư điện được sinh ra tại Hà Lan với công việc đầu tiên là ở NCR Corp và sau đó là Agere. Ông đứng đầu nhóm phát triển mạng LAN không dây IEEE 802.11 và giúp mạng Wi-Fi thành công như hôm nay. Hiện nay ông đang làm ủy viên cao cấp của Trường đại học Công nghệ Delft, Hà Lan.

Theo Tuổi Trẻ Online/PC World.

Làm CNTT ở Việt Nam khó giàu?

Đua nhau thi vào ngành IT, rồi trở thành những nhân viên bình thường, yếu về khả năng giao tiếp, gần như tách biệt với thế giới bên ngoài và đều đặn hàng tháng lãnh một mức lương không tệ nhưng so với một số ngành tiềm năng khác thì có thể nói là ba cọc ba đồng. Blogger Ngôn Phạm chia sẻ nỗi niềm cùng Blog Quanh Ta.

Dạo này có thời gian rảnh rỗi nên tôi có cơ hội đi đây đi đó, gặp gỡ nhiều bạn bè trong giới công nghệ thông tin (CNTT - IT) cũng như bạn bè cũ đã từng có thời gian học chung trước đây. Nhìn lại mới đó mà đã bảy năm kể từ ngày tôi chính thức bước vào con đường Công nghệ thông tin. Suốt thời gian đó, tôi gần như bị cuốn vào cuộc đua công nghệ mà quên hết mọi thứ xung quanh. Giờ có thời gian rảnh ngồi chiêm nghiệm lại mới ngẫm ra được nhiều điều. Có nhiều thứ rất đỗi bình thường trong cuộc sống nhưng lại bắt đầu trở nên lạ lẫm đối với những con người công nghệ như tôi.

Sự chênh lệch "giàu nghèo"

Tôi vẫn nhớ hồi đó, những người học trong lĩnh vực tự nhiên như Toán, Lý, Tin... như chúng tôi đều là những ứng cử viên sáng giá nhất trong mắt mọi người, đều nhận được nhiều sự quan tâm hỗ trợ. Rồi đa phần đều thi vào những ngành triển vọng như CNTT, viễn thông... Nhưng rồi bây giờ lại trở thành những nhân viên bình thường, yếu về khả năng giao tiếp, suốt ngày ngồi làm việc trong phòng kín gần như tách biệt với thế giới bên ngoài và đều đặn hàng tháng lãnh một mức lương không tệ nhưng so với một số ngành tiềm năng khác thì có thể nói là ba cọc ba đồng.

Trong khi những người học trong những ngành xã hội thường được xem là những ngành ít quan trọng hơn (mỗi lần cứ tới kiểm tra môn tự nhiên là phải tới lui "nhờ vả" những người như chúng tôi), sau này cũng thi vào những ngành bình thường như kinh tế, ngoại thương...

Sau khi ra trường xuất phát điểm họ cũng thấp hơn, nhưng với một số người khéo léo biết trau chuốt kinh nghiệm sống và từng bước tăng cường khả năng giao tiếp với bên ngoài, chỉ trong một thời gian ngắn họ đã đi lên rất nhanh...

Một số người đã đạt mức lương cao ngang ngửa với chứ danh trưởng dự án (PM) trong các công ty gia công phần mềm, còn những người siêu hơn trong lĩnh vực ngoại thương xuất nhập khẩu thì họ đã có đủ tiền để mua nhà và xe hơi.

Tất nhiên nói như vậy không có nghĩa là tôi "bất mãn" với ngành CNTT hiện tại mình đang theo đuổi, bởi tôi hiểu mỗi ngành đều có giá trị của riêng nó. Nhưng thực sự tôi nghĩ một người làm trong lĩnh vực CNTT chỉ thực sự có giá trị khi anh ta phải quên đi qua ánh hào quang CNTT mà những người trong ngành vẫn hay ảo tưởng, hòa nhập với cuộc sống để hiểu cuộc sống xung quanh thực sự đang mong muốn điều gì, giao tiếp với những con người trong thế giới thật để hiểu được sứ mệnh của mình nằm ở đâu trong chuỗi mắt xích phát triển của nền kinh tế Việt Nam. Còn không thì những con người CNTT như chúng tôi vẫn sẽ mãi chìm trong thế giới ảo và dần sẽ có một cảm giác lạc lõng như bị bỏ rơi trong sự phát triển như vũ bão của xã hội VN ngày nay.

Làm giàu thì phải "con buôn"?

Trước một viễn cảnh khá u ám của các dot-com Việt Nam hiện nay, tôi cũng đã quyết định đi "thỉnh giáo" một số sư huynh thành đạt ở Việt Nam bên các lĩnh vực khác để xem liệu có những lối ra nào cho lĩnh vực này. Cũng có khá nhiều ý kiến được đưa ra, nhưng tựu trung lại thì có vẻ như là: "Em muốn làm giàu ở Việt Nam thì đôi lúc cũng phải ... con buôn một tí". Tôi cũng chả biết giải thích từ "con buôn" thế nào nên nêu một số ví dụ minh họa hơi liên quan:

1. Công ty tôi làm ra một ứng dụng Internet giáo dục rất tốt và với sản phẩm này mọi học sinh, sinh viên Việt Nam đều có thể cơ hội học tập bình đẳng, tiếp xúc với một kho dữ liệu tri thức ngang nhau. Nghe thì ai cũng đồng ý rất hữu ích, nhưng rốt cục nó cũng chỉ đóng vai trò phụ trợ. Người dùng Việt Nam vẫn thích một môi trường học thật và quan trọng là học xong phải có "bằng cấp" và cơ hội. Và rõ ràng bài toán này là một bài toán thực tế cuộc sống, cách giải quyết đòi hỏi phải khéo léo từ kinh nghiệm từng trải, không thể trông đợi vào công nghệ.

2. Công ty tôi làm một site thương mại điện tử, bảo đảm mọi người tham gia sẽ giao dịch dễ dàng và thuận tiện. Nghe cũng có vẻ hay nhưng với thực tế xã hôi Việt Nam hầu hết đều là buôn bán nhỏ lẻ và tìm cách lách thuế thì rất ít người muốn minh bạch công khai. Giao dịch trực tiếp vẫn là cách tốt nhất, không phải tốn phí giao dịch, đôi khi gặp mặt trực tiếp nói chuyện tình cảm còn mặc cả bớt được thêm chút đỉnh.

3. Công ty tôi làm một ứng dụng Internet rất hay, mọi ý tưởng đều hoàn hảo và kỳ vọng sẽ bán được hàng. Nhưng có thể đó chỉ mới là chúng tôi nghĩ và thực tế khả năng thất bại là rất cao. Trong khi đó cũng với công sức đó, chúng tôi làm một ứng dụng demo không tốn nhiều sức lực, rồi dựa trên mối quan hệ đi tìm cách ..."gạ" một đại gia lắm tiền trong lĩnh vực đó đầu tư. Lý lẽ thuyết phục là nếu đầu tư tiền vào đây thì với kinh nghiệm của anh, cộng với năng lực của em thì khả năng thành công là rất cao. Mọi việc có vẻ rất bất ổn nhưng đôi lúc giả lại thành thật. Không ít công ty ở VN đã thành công bằng cách này.

Tựu trung lại, làm giàu ở Việt Nam dù trong bất kì lĩnh vực nào có lẽ cũng đòi hỏi rất nhiều kinh nghiệm thực tế từ cuộc sống cũng như các mối quan hệ khác nhau, cộng với tính "con buôn" nữa. Điều này có vẻ khá sốc đối với một người thuần túy về công nghệ như tôi trước đây, nhưng thực sự chúng ta không thể nhìn theo mô hình thành công của các công ty như như Google, Microsoft..., nơi có những văn hóa rất khác biệt so với chúng ta. Ở Việt Nam thì phải "chơi kiểu" Việt Nam. Nghĩ tới đây có vẻ tôi cũng đã bắt đầu "con buôn" hơn rồi nhỉ ^_^

(Nguồn: blog Ngôn Phạm - PHẠM HỮU NGÔN)

Top 20+ MySQL Best Practices

Database operations often tend to be the main bottleneck for most web applications today. It's not only the DBA's (database administrators) that have to worry about these performance issues. We as programmers need to do our part by structuring tables properly, writing optimized queries and better code. Here are some MySQL optimization techniques for programmers.

1. Optimize Your Queries For the Query Cache

Most MySQL servers have query caching enabled. It's one of the most effective methods of improving performance, that is quietly handled by the database engine. When the same query is executed multiple times, the result is fetched from the cache, which is quite fast.

The main problem is, it is so easy and hidden from the programmer, most of us tend to ignore it. Some things we do can actually prevent the query cache from performing its task.

// query cache does NOT work
$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");

// query cache works!
$today = date("Y-m-d");
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");


The reason query cache does not work in the first line is the usage of the CURDATE() function. This applies to all non-deterministic functions like NOW() and RAND() etc... Since the return result of the function can change, MySQL decides to disable query caching for that query. All we needed to do is to add an extra line of PHP before the query to prevent this from happening.

2. EXPLAIN Your SELECT Queries

Using the EXPLAIN keyword can give you insight on what MySQL is doing to execute your query. This can help you spot the bottlenecks and other problems with your query or table structures.

The results of an EXPLAIN query will show you which indexes are being utilized, how the table is being scanned and sorted etc...

Take a SELECT query (preferably a complex one, with joins), and add the keyword EXPLAIN in front of it. You can just use phpmyadmin for this. It will show you the results in a nice table. For example, let's say I forgot to add an index to a column, which I perform joins on:

After adding the index to the group_id field:

Now instead of scanning 7883 rows, it will only scan 9 and 16 rows from the 2 tables. A good rule of thumb is to multiply all numbers under the "rows" column, and your query performance will be somewhat proportional to the resulting number.

3. LIMIT 1 When Getting a Unique Row

Sometimes when you are querying your tables, you already know you are looking for just one row. You might be fetching a unique record, or you might just be just checking the existence of any number of records that satisfy your WHERE clause.

In such cases, adding LIMIT 1 to your query can increase performance. This way the database engine will stop scanning for records after it finds just 1, instead of going thru the whole table or index.

// do I have any users from Alabama?

// what NOT to do:
$r = mysql_query("SELECT * FROM user WHERE state = 'Alabama'");
if (mysql_num_rows($r) > 0) {
// ...
}



// much better:
$r = mysql_query("SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1");
if (mysql_num_rows($r) > 0) {
// ...
}


4. Index the Search Fields

Indexes are not just for the primary keys or the unique keys. If there are any columns in your table that you will search by, you should almost always index them.

As you can see, this rule also applies on a partial string search like "last_name LIKE 'a%'". When searching from the beginning of the string, MySQL is able to utilize the index on that column.

You should also understand which kinds of searches can not use the regular indexes. For instance, when searching for a word (e.g. "WHERE post_content LIKE '%apple%'"), you will not see a benefit from a normal index. You will be better off using mysql fulltext search or building your own indexing solution.

5. Index and Use Same Column Types for Joins

If your application contains many JOIN queries, you need to make sure that the columns you join by are indexed on both tables. This affects how MySQL internally optimizes the join operation.

Also, the columns that are joined, need to be the same type. For instance, if you join a DECIMAL column, to an INT column from another table, MySQL will be unable to use at least one of the indexes. Even the character encodings need to be the same type for string type columns.

// looking for companies in my state
$r = mysql_query("SELECT company_name FROM users
LEFT JOIN companies ON (users.state = companies.state)
WHERE users.id = $user_id");

// both state columns should be indexed
// and they both should be the same type and character encoding
// or MySQL might do full table scans


6. Do Not ORDER BY RAND()

This is one of those tricks that sound cool at first, and many rookie programmers fall for this trap. You may not realize what kind of terrible bottleneck you can create once you start using this in your queries.

If you really need random rows out of your results, there are much better ways of doing it. Granted it takes additional code, but you will prevent a bottleneck that gets exponentially worse as your data grows. The problem is, MySQL will have to perform RAND() operation (which takes processing power) for every single row in the table before sorting it and giving you just 1 row.

// what NOT to do:
$r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");


// much better:

$r = mysql_query("SELECT count(*) FROM user");
$d = mysql_fetch_row($r);
$rand = mt_rand(0,$d[0] - 1);

$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");

So you pick a random number less than the number of results and use that as the offset in your LIMIT clause.

7. Avoid SELECT *

The more data is read from the tables, the slower the query will become. It increases the time it takes for the disk operations. Also when the database server is separate from the web server, you will have longer network delays due to the data having to be transferred between the servers.

It is a good habit to always specify which columns you need when you are doing your SELECT's.

// not preferred
$r = mysql_query("SELECT * FROM user WHERE user_id = 1");
$d = mysql_fetch_assoc($r);
echo "Welcome {$d['username']}";

// better:
$r = mysql_query("SELECT username FROM user WHERE user_id = 1");
$d = mysql_fetch_assoc($r);
echo "Welcome {$d['username']}";

// the differences are more significant with bigger result sets


8. Almost Always Have an id Field

In every table have an id column that is the PRIMARY KEY, AUTO_INCREMENT and one of the flavors of INT. Also preferably UNSIGNED, since the value can not be negative.

Even if you have a users table that has a unique username field, do not make that your primary key. VARCHAR fields as primary keys are slower. And you will have a better structure in your code by referring to all users with their id's internally.

There are also behind the scenes operations done by the MySQL engine itself, that uses the primary key field internally. Which become even more important, the more complicated the database setup is. (clusters, partitioning etc...).

One possible exception to the rule are the "association tables", used for the many-to-many type of associations between 2 tables. For example a "posts_tags" table that contains 2 columns: post_id, tag_id, that is used for the relations between two tables named "post" and "tags". These tables can have a PRIMARY key that contains both id fields.

9. Use ENUM over VARCHAR

ENUM type columns are very fast and compact. Internally they are stored like TINYINT, yet they can contain and display string values. This makes them a perfect candidate for certain fields.

If you have a field, which will contain only a few different kinds of values, use ENUM instead of VARCHAR. For example, it could be a column named "status", and only contain values such as "active", "inactive", "pending", "expired" etc...

There is even a way to get a "suggestion" from MySQL itself on how to restructure your table. When you do have a VARCHAR field, it can actually suggest you to change that column type to ENUM instead. This done using the PROCEDURE ANALYSE() call. Which brings us to:

10. Get Suggestions with PROCEDURE ANALYSE()

PROCEDURE ANALYSE() will let MySQL analyze the columns structures and the actual data in your table to come up with certain suggestions for you. It is only useful if there is actual data in your tables because that plays a big role in the decision making.

For example, if you created an INT field for your primary key, however do not have too many rows, it might suggest you to use a MEDIUMINT instead. Or if you are using a VARCHAR field, you might get a suggestion to convert it to ENUM, if there are only few unique values.

You can also run this by clicking the "Propose table structure" link in phpmyadmin, in one of your table views.

Keep in mind these are only suggestions. And if your table is going to grow bigger, they may not even be the right suggestions to follow. The decision is ultimately yours.

11. Use NOT NULL If You Can

Unless you have a very specific reason to use a NULL value, you should always set your columns as NOT NULL.

First of all, ask yourself if there is any difference between having an empty string value vs. a NULL value (for INT fields: 0 vs. NULL). If there is no reason to have both, you do not need a NULL field. (Did you know that Oracle considers NULL and empty string as being the same?)

NULL columns require additional space and they can add complexity to your comparison statements. Just avoid them when you can. However, I understand some people might have very specific reasons to have NULL values, which is not always a bad thing.

From MySQL docs:

"NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte."

12. Prepared Statements

There are multiple benefits to using prepared statements, both for performance and security reasons.

Prepared Statements will filter the variables you bind to them by default, which is great for protecting your application against SQL injection attacks. You can of course filter your variables manually too, but those methods are more prone to human error and forgetfulness by the programmer. This is less of an issue when using some kind of framework or ORM.

Since our focus is on performance, I should also mention the benefits in that area. These benefits are more significant when the same query is being used multiple times in your application. You can assign different values to the same prepared statement, yet MySQL will only have to parse it once.

Also latest versions of MySQL transmits prepared statements in a native binary form, which are more efficient and can also help reduce network delays.

There was a time when many programmers used to avoid prepared statements on purpose, for a single important reason. They were not being cached by the MySQL query cache. But since sometime around version 5.1, query caching is supported too.

To use prepared statements in PHP you check out the mysqli extension or use a database abstraction layer like PDO.

// create a prepared statement
if ($stmt = $mysqli->prepare("SELECT username FROM user WHERE state=?")) {

// bind parameters
$stmt->bind_param("s", $state);

// execute
$stmt->execute();

// bind result variables
$stmt->bind_result($username);

// fetch value
$stmt->fetch();

printf("%s is from %s\n", $username, $state);

$stmt->close();
}


13. Unbuffered Queries

Normally when you perform a query from a script, it will wait for the execution of that query to finish before it can continue. You can change that by using unbuffered queries.

There is a great explanation in the PHP docs for the mysql_unbuffered_query() function:

"mysql_unbuffered_query() sends the SQL query query to MySQL without automatically fetching and buffering the result rows as mysql_query() does. This saves a considerable amount of memory with SQL queries that produce large result sets, and you can start working on the result set immediately after the first row has been retrieved as you don't have to wait until the complete SQL query has been performed."

However, it comes with certain limitations. You have to either read all the rows or call mysql_free_result() before you can perform another query. Also you are not allowed to use mysql_num_rows() or mysql_data_seek() on the result set.

14. Store IP Addresses as UNSIGNED INT

Many programmers will create a VARCHAR(15) field without realizing they can actually store IP addresses as integer values. With an INT you go down to only 4 bytes of space, and have a fixed size field instead.

You have to make sure your column is an UNSIGNED INT, because IP Addresses use the whole range of a 32 bit unsigned integer.

In your queries you can use the INET_ATON() to convert and IP to an integer, and INET_NTOA() for vice versa. There are also similar functions in PHP called ip2long() and long2ip().

$r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";

15. Fixed-length (Static) Tables are Faster

When every single column in a table is "fixed-length", the table is also considered "static" or "fixed-length". Examples of column types that are NOT fixed-length are: VARCHAR, TEXT, BLOB. If you include even just 1 of these types of columns, the table ceases to be fixed-length and has to be handled differently by the MySQL engine.

Fixed-length tables can improve performance because it is faster for MySQL engine to seek through the records. When it wants to read a specific row in a table, it can quickly calculate the position of it. If the row size is not fixed, every time it needs to do a seek, it has to consult the primary key index.

They are also easier to cache and easier to reconstruct after a crash. But they also can take more space. For instance, if you convert a VARCHAR(20) field to a CHAR(20) field, it will always take 20 bytes of space regardless of what is it in.

By using "Vertical Partitioning" techniques, you can separate the variable-length columns to a separate table. Which brings us to:

16. Vertical Partitioning

Vertical Partitioning is the act of splitting your table structure in a vertical manner for optimization reasons.

Example 1: You might have a users table that contains home addresses, that do not get read often. You can choose to split your table and store the address info on a separate table. This way your main users table will shrink in size. As you know, smaller tables perform faster.

Example 2: You have a "last_login" field in your table. It updates every time a user logs in to the website. But every update on a table causes the query cache for that table to be flushed. You can put that field into another table to keep updates to your users table to a minimum.

But you also need to make sure you don't constantly need to join these 2 tables after the partitioning or you might actually suffer performance decline.

17. Split the Big DELETE or INSERT Queries

If you need to perform a big DELETE or INSERT query on a live website, you need to be careful not to disturb the web traffic. When a big query like that is performed, it can lock your tables and bring your web application to a halt.

Apache runs many parallel processes/threads. Therefore it works most efficiently when scripts finish executing as soon as possible, so the servers do not experience too many open connections and processes at once that consume resources, especially the memory.

If you end up locking your tables for any extended period of time (like 30 seconds or more), on a high traffic web site, you will cause a process and query pileup, which might take a long time to clear or even crash your web server.

If you have some kind of maintenance script that needs to delete large numbers of rows, just use the LIMIT clause to do it in smaller batches to avoid this congestion.

while (1) {
mysql_query("DELETE FROM logs WHERE log_date <= '2009-10-01' LIMIT 10000");
if (mysql_affected_rows() == 0) {
// done deleting
break;
}
// you can even pause a bit
usleep(50000);
}


18. Smaller Columns Are Faster

With database engines, disk is perhaps the most significant bottleneck. Keeping things smaller and more compact is usually helpful in terms of performance, to reduce the amount of disk transfer.

MySQL docs have a list of Storage Requirements for all data types.

If a table is expected to have very few rows, there is no reason to make the primary key an INT, instead of MEDIUMINT, SMALLINT or even in some cases TINYINT. If you do not need the time component, use DATE instead of DATETIME.

Just make sure you leave reasonable room to grow or you might end up like Slashdot.

19. Choose the Right Storage Engine

The two main storage engines in MySQL are MyISAM and InnoDB. Each have their own pros and cons.

MyISAM is good for read-heavy applications, but it doesn't scale very well when there are a lot of writes. Even if you are updating one field of one row, the whole table gets locked, and no other process can even read from it until that query is finished. MyISAM is very fast at calculating SELECT COUNT(*) types of queries.

InnoDB tends to be a more complicated storage engine and can be slower than MyISAM for most small applications. But it supports row-based locking, which scales better. It also supports some more advanced features such as transactions.


20. Use an Object Relational Mapper By using

An ORM (Object Relational Mapper), you can gain certain performance benefits. Everything an ORM can do, can be coded manually too. But this can mean too much extra work and require a high level of expertise.

ORM's are great for "Lazy Loading". It means that they can fetch values only as they are needed. But you need to be careful with them or you can end up creating to many mini-queries that can reduce performance.

ORM's can also batch your queries into transactions, which operate much faster than sending individual queries to the database.

Currently my favorite ORM for PHP is Doctrine. I wrote an article on how to install Doctrine with CodeIgniter.

21. Be Careful with Persistent Connections

Persistent Connections are meant to reduce the overhead of recreating connections to MySQL. When a persistent connection is created, it will stay open even after the script finishes running. Since Apache reuses it's child processes, next time the process runs for a new script, it will reuse the same MySQL connection.

It sounds great in theory. But from my personal experience (and many others), this features turns out to be not worth the trouble. You can have serious problems with connection limits, memory issues and so on.

Apache runs extremely parallel, and creates many child processes. This is the main reason that persistent connections do not work very well in this environment. Before you consider using the mysql_pconnect() function, consult your system admin.

(From net.tutsplus.com)

Nhân lực IT “tháo chạy”

Khi cuộc khủng hoảng kinh tế đang lùi xa dần, các doanh nghiệp CNTT sẽ phải đối mặt với một cuộc “bỏ đi” ồ ạt của nguồn nhân lực.

5.jpg
Ảnh minh họa.

Chết trước bình minh?

Hơn hai năm ngụp lặn trong cuộc khủng hoảng kinh tế đã buộc rất nhiều hãng CNTT phải thực thi các chính sách “cấp cứu” để tồn tại như cắt giảm nhân lực, cắt giảm lương thưởng và các quyền lợi khác của người lao động nhằm tiết kiệm một cách tối đa chi phí hoạt động. Các nhân viên IT được giữ lại phải làm việc nhiều hơn, áp lực lớn hơn nhưng lại được hưởng một mức lương thấp hơn trước rất nhiều chưa kể đến những mối đe dọa “bị sa thải” luôn luôn lơ lửng trên đầu họ… Tất cả những thực tế đó khiến không ít người cho rằng họ đang bị đối xử tệ bạc và đánh giá thấp những gì họ đã đóng góp cho công ty.

Và khi nền kinh tế đang dần dần hồi phục, khi các hãng CNTT bắt đầu mở rộng hoạt động trở lại cũng là lúc nhu cầu về nguồn nhân lực gia tăng, số cơ hội “nhảy việc” nhiều lên, một cơn sóng ngầm mang tên “Chuyển công ty” đang lớn dần và có nguy cơ nhấn chìm không ít doanh nghiệp. Giới chuyên gia quản lý nhân lực CNTT gọi hiện tượng này bằng một cái tên rất mỹ miều: Cái chết trước bình minh.

Theo kết quả khảo sát do hãng tư vấn và cung ứng nhân lực trong lĩnh vực CNTT Robert Half Technology vừa công bố: 43% trong số hơn 1.400 giám đốc CNTT (CIO) được hỏi cho biết việc thực hiện các chương trình nhằm “giữ chân” nhân viên sẽ là nhiệm vụ được ưu tiên hàng đầu của họ trong năm 2010 và khoảng 21% số CIO cho biết họ đã trình lên cấp lãnh đạo của doanh nghiệp các kế hoạch đào tạo và phát triển nghề nghiệp cho các nhân viên trong thời gian tới.

“Các nhà quản lý sẽ phải chú trọng hơn nữa đến việc ngăn chặn vấn nạn thiếu hụt nhân lực, chảy máu chất xám và phải giữ lại bằng được những nhân viên tốt nhất của mình. Đây sẽ là một việc khó bởi trong thời gian qua, những cuộc sa thải, cắt giảm thu nhập khiến rất nhiều người cảm thấy họ đã bị ngược đãi và đây là lúc để ra đi tìm cơ hội mới tốt hơn”, Dave Willmer, giám đốc điều hành của Robert Half Technology nói

Đã quá muộn?

Có lẽ lời thuyết phục ở lại để ngăn chặn các cuộc tháo chạy ồ ạt vào thời điểm này đã là quá muộno. Hồi tháng 9/2009, hãng tư vấn Deloitte Consulting (Mỹ) đã đưa ra một bản báo cáo cảnh báo về tình trạng di chuyển ồ ạt một lượng lớn nhân lực trong lĩnh vực CNTT và cho rằng: Có một trận “sóng thần” đã chuẩn bị đổ bộ vào lĩnh vực công nghệ của thế giới khi những nhân viên tài năng nhất sẽ lặng lẽ rời bỏ doanh nghiệp khi mối đe dọa bị sa thải không còn nữa và họ được chào mời rất ráo riết từ các công ty khác.

Jeff Schwartz, Giám đốc mảng nhân lực của Deloitte Consulting còn khẳng định kể cả khi nền kinh tế đã hồi phục, gánh nặng và mối đe dọa suy sụp, phá sản đối với các hãng CNTT cũng không hề nhẹ hơn so với thời kỳ suy thoái. Số liệu từ các công trình nghiên cứu của hãng Gartner cũng cho thấy lời cảnh báo tương tự và tình hình thậm chí còn nguy hiểm hơn bởi chính những nhân viên đã ở lại trong thời kỳ khủng hoảng đã được giao nhiều việc hơn nên tất nhiên họ cũng nắm giữ nhiều thông tin về công ty cũ. “Khi họ quyết định ra đi sau khủng hoảng, họ sẽ trở thành một “sát thủ” tiềm tàng với ông chủ cũ”, Lily Mok – Phó chủ tịch Gartner nói.

IG Jobs (theo ICTnews/ CIO, Network World)

Google trình diễn HĐH Chrome OS

Ngày hôm qua 19/11, Google đã chính thức phát hành bộ mã nguồn của Chrome OS, hệ điều hành hướng tới các máy tính siêu di động và máy tính tất cả trong một. Dự kiến, Google sẽ tung ra HĐH này trong năm sau, 2010. Hiện tại, qua những gì Google giới thiệu đến mọi người thì giao diện của Chrome OS được thiết kế mang nhiều nét tương đồng với trình duyệt web Chrome. "Trong Chrome OS, các ứng dụng đều là ứng dụng nền web. Người dùng không nhất thiết phải cài đặt bất cứ một ứng dụng hay phần mềm quản lý nào cả" - Sundar Pichai, Phó chủ tịch bộ phận phát triển sản phẩm của Google cho biết.

Bạn có thể xem qua 2 video clip dưới đây để có cái nhìn khái quát hơn về HĐH này.



Kỹ năng thiết lập mục tiêu?

Đã bao giờ bạn tự hỏi: Mục tiêu của cuộc đời mình là gì chưa?

Mình có cần phải đặt ra mục tiêu cho tương lai không?

Đây là câu hỏi không mới nhưng luôn là câu hỏi thử thách với tất cả các bạn trẻ. Bấy lâu nay xã hội vẫn bàn luận về vấn đề bạn trẻ ngày nay sống thiếu định hướng và chưa có mục tiêu rõ ràng. Bản thân tôi tự thấy mình cũng là “một người mông lung giữa muôn trùng vậy, cũng đang đi tìm đích đến cho mình...

Bạn đã nghe câu nói này chưa? “Nếu không biết mình đang đi đâu thì mọi ngọn gió đưa đẩy con thuyền đều là ngọn gió đúng và nếu bạn cứ đi theo mọi hướng gió thì thuyền của bạn sẽ chạy lòng vòng”. Đây là lời khuyên của Ken Loughnan, Chủ tịch Hội đồng Quản trị Đại học Victoria, Melbourne. Và 8X Hor Samnang, từng là lãnh đạo chương trình “Tàu thanh niên Đông Nam Á” đã chia sẻ với rằng: “If you can’t prepare the future for youself, you can prepare yourself for future”. ( Nếu bạn không thể chuẩn bị tương lai cho mình thì hãy rèn luyện cho mình để có một tương lai mong muốn).


Mục tiêu là gì?

Sẽ có nhiều cách trả lời khác nhau. Nhưng ta có thể hiểu đơn giản:

Mục tiêu là kết quả cuối cùng mà chúng ta mong muốn để thực hiện một mục đích trong thời hạn xác định.

Hoặc đơn giản hoá thành công thức:

Mục tiêu = kết quả mong muốn của một mục đích + thời hạn để thực hiện.

Hiện tại nếu các bạn thử hỏi một anh sinh viên nào đấy về mục tiêu của anh ta trong tương lai, thường câu trả lời là “kiếm một công việc tốt”. Vậy “kiếm một công việc tốt “có phải là một mục tiêu? Tôi cho rằng đó là “một sự mơ hồ” thì đúng hơn, thử so sánh với câu trả lời sau: “Tôi sẽ mở một shop hoa sau 5 năm nữa”. Rõ ràng là câu trả lời thứ nhất thiếu thời hạn xác định và đồng thời kết quả cuối cùng thì rất mơ hồ vì “công việc tốt” là một khái niệm chung chung. Với câu trả lời thứ 2 thì mọi việc rõ ràng: mục tiêu = mở một shop hoa + 5 năm sau.


Mục tiêu cuộc đời là gì?

Trước khi thử trả lời câu hỏi này, tôi muốn nói đến mục đích sống của mỗi người chúng ta. Bởi lẽ mục tiêu là kết quả cuối cùng của một mục đích cho nên muốn trả lời mục tiêu cuộc đời thì chúng ta cần xác định xem mục đích sống hay mục đích cuộc đời của chúng ta là gì?

Theo Sevent Habits of Highly Effective People - Bảy thói quen của người thành đạt thì : Mỗi ngày thức dậy bạn hãy dành 1 tiếng để suy nghĩ về mục tiêu sống của bạn. Hãy thử tưởng tưởng nếu bạn…tham dự đám tang của chính bản thân mình thì bạn muốn nghe gia đình bạn, bạn bè của bạn, đồng nghiệp bạn…nói gì về bạn? Những gì mà bạn muốn mọi người nhắc đến trong thời điểm này chính là mục đích sống của bạn. Bạn muốn nghe cha mẹ, anh chị em nói gì về mình? Bạn bè bạn, đồng nghiệp của bạn nghĩ sao về bạn..?

Đây là một cách hiệu quả để trả lời xem thử mình sống vì cái gì? Nếu bạn cũng thử làm theo cách này, có thể bạn sẽ tìm thấy nhiều điều thú vị cho cuộc sống. Nhiều người đã làm cách này và sống rất hạnh phúc, thành công. Tôi tin là tôi và các bạn cũng vậy. Khi bạn đã tìm ra mục đích sống của mình, khi đó bạn mới có thể đạt mục tiêu cho cuộc đời mình đúng với những gì bạn mong muốn. Bạn không thể đạt mục tiêu làm bác sĩ tại một bệnh viện lớn sau 5 năm nữa trong khi trong thâm tâm, bạn chẳng đam mê gì cái việc kê toa cả. Hãy suy nghĩ cận thận và trách nhiệm với chính bạn, nếu bạn không xác định mục đích sống của mình, bạn sẽ luôn đề sai mục tiêu và sống với sai lầm của mình.

Quay lại câu hỏi mục tiêu cuộc đời là gì. Sau khi chúng ta đã tìm được mục đích sống của mình thì việc tìm mục tiêu cuộc đời mình sẽ trở nên hấp dẫn và đáng để làm hơn bao giờ hết. Tôi không phải là một người đã thành công với việc xác định mục tiêu cuộc đời mình, cũng chẳng phải là một chuyên gia về huấn luyện kỹ năng này, nhưng với một số kinh nghiệm (từ khi tôi nhận thức ra tầm quan trọng của vấn đề này) đi tìm và thực hành các phương pháp để tìm mục đích sống và mục tiêu cuộc đời mình. Tôi có niềm tin rất lớn với những kinh nghiệm mà tôi đã thu được, rất có thể nó sẽ có ích cho bạn:

+ Mục tiêu cuộc đời là thành quả cao nhất của mục đích sống mà bạn muốn đạt được trong cả cuộc đời bạn. Hay còn có công thức: Mục tiêu cuộc đời = thành quả tốt nhất của mục đích sống của bạn + toàn bộ cuộc đời bạn. Như vậy có thể thấy với mục tiêu ngắn hạn, thời gian có thể là 1 năm, hai năm hoặc 5 năm. Dài hạn hơn thì 20 hay 30 năm. Và mục tiêu cuộc đời thì đó là cả cuộc đời bạn. Tôi thường nhắc đi nhắc lại “cả cuộc đời” để nhắc nhở bản thân mình đang đem cả cuộc sống bản thân vào mục tiêu cuộc đời. Do đó, đó phải là mục tiêu có ý nghĩa nhất mà tôi có thể làm cho bản thân mình. Rõ ràng, nếu đặt ra một mục tiêu không có ý nghĩa cho bản thân bạn thì liệu có cần phải có mục tiêu, và đặc biệt đó lại là mục tiêu cuộc đời bạn. Hãy có trách nhiệm!

+ Điều tối quan trọng là bạn đặt ra mục tiêu cao nhất mà bạn muốn thực hiện chứ không phải mục tiêu của người khác. Do bị ảnh hưởng của môi trường giáo dục thụ động, phần lớn chúng ta chịu ảnh hưởng tâm lý từ gia đình và xã hội. Do đó khi đặt ra mục tiêu của mình, rất nhiều bạn lo sợ mục tiêu của mình không phù hợp với quan điểm của người khác. Nếu bạn cảm thấy mình như vậy, bạn có thể hỏi chính mình xem bản thân bạn có muốn suốt cuộc đời này “sống thuê” cho người khác hay không?

+ Đề ra những mục tiêu ngắn hạn và dài hạn cho bản thân là một cách hay để bạn có niềm tin vào khả năng thành công của mục tiêu cuộc đời bạn. Việc đạt mục tiêu không phải đơn giản và việc có thể đặt mục tiêu cho các mốc thời gian khác nhau của cuộc đời cũng là một bài toán hóc búa. Do vậy chúng ta cần làm càng rõ điều chúng ta muốn càng tốt, quan trọng là cân đo đong đếm được. Và đây là một công việc mà bạn nên làm hàng ngày: thức dậy sớm và dành 30 phút đến 1 tiếng để suy nghĩ về mục tiêu cuộc đời mình. Tôi đã làm vậy và cảm thấy tinh thần cũng như thái độ của mình trở nên minh mẫn và lạc quan hơn bao giờ hết.

+ Hãy luôn trò chuyện với gia đình, người thân, bạn bè và những người bạn có thể nói chuyện về mục tiêu của bạn và họ trong cuộc sống. Tôi thấy rất nhiều bạn khi nói chuyện về mục tiêu sống thì có thái độ lảng tránh hoặc ái ngại. Bản thân tôi cũng từng như vậy và nhận thất rằng để có niềm tin vào thứ mà chúng ta muốn thì cách luôn nghĩ về nó, nói về nó là cách hiệu quả để tăng niềm tin. Nếu như cứ cố lảng tránh hoặc khó khăn khi chia sẻ, tôi nghĩ bạn sẽ tự tạo cho mình một rào cản lớn để đạt đến mục đích của mình. Trong khi chúng ta sử dụng các buổi nói chuyện để phê phán mọi thứ xung quanh hoặc những chuyện vô bỏ, thì tại sao lại không thể dành thời gian đó để tìm hiểu về mục tiêu của mình và mọi người xung quanh. Tôi cam đoan bạn sẽ tìm được nhiểu điểu thú vị…

+ Một số cách để bạn tự động viên và tạo niềm tin cho chính mình: Hãy đọc các câu chuyện về những gương thành công điển hình và tìm hiểu xem họ đã làm như thế nào, liệu bạn có thể áp dụng được. Bên cạnh đó đọc các câu mang tính động viên (hay còn gọi là quote) của những người nổi tiếng, các chính trị gia, nhà tâm lý học…cũng là một cách hay để tự động viên mình. Tôi có đăng ký maillinglist của Brian Tracy, tác giả của cuốn “Những nguyên tắc thành công trong cuộc sống” và là chuyên gia về phát triển bản thân để hàng ngày được nhận 1 câu quote và 1 bài viết về những bí quyết thành công. Cứ mỗi sáng check email tôi bắt đầu đọc câu quote, dành 2 phút suy ngẫm rồi sau đó đọc về bài viết những bí quyết thành công. Cách làm này giúp tôi luôn nhớ rằng mình đang tiến đến đạt được những mục tiêu của mình, tự động viên tinh thần khi gặp những vấn đề khó khăn…

Và dĩ nhiên còn nhiều cách khác mà chúng ta có thể áp dụng để đi tìm mục tiêu cuộc đời mình, tìm thấy niềm tin trong cuộc sống. Tôi thấy đây là công việc thú vị và hay ho nhất mà tôi có thể làm không bao giờ chán bởi việc thay đổi từng ngày tốt hơn và đi tìm mục tiêu cuộc đời chẳng phải là một việc quá đáng giá để “xài” thời gian có giới hạn của chúng ta hay sao?


Sống có mục tiêu?

Mục tiêu là thứ giúp chúng ta tồn tại và đi mãi trên những đoạn đường đời. Một khi chúng ta mất mục tiêu, mất phương hướng thì chúng ta trở nên bồn chồn, lo âu. Bạn có bao giờ để ý thấy bạn chỉ thật sự sung sướng hạnh phúc khi đang thực hiện một điều gì đó chứ không phải là khi bạn đã hoàn thành nó không?

"Đề ra mục tiêu là việc hiển nhiên con người phải làm". Chúng ta không thể sống mà không có mục tiêu hoặc ít nhất là không có trong một thời gian dài. Bạn nhất thiết phải có một mục tiêu nếu bây giờ bạn chưa đề ra cho mình một danh sách các mục tiêu cần phải thực hiện.

"Mục tiêu gì là không quan trọng, điều quan trọng là bạn phải có mục tiêu". Có người cứ tìm cách trì hoãn thực hiện những gì họ nghĩ là có liên quan đến cuộc đời họ. Họ không chắc mục tiêu họ đề ra là hoàn toàn có lợi cho họ hay không, và vì thế họ chẳng bao giờ làm được điều gì cả.

Ví dụ như bạn luôn mong muốn trở lại trường Đại học để học lấy mảnh bằng, thế nhưng bạn không chắc rằng mục tiêu này có hợp lý hay không. Và rồi bạn cứ chần chừ, cứ mong muốn, cứ tính toán như thế mãi. Hai mươi, ba mươi năm sau, khi bạn già rồi thì bạn vẫn còn lưỡng lự, mà thời gian thì hết mất rồi.

Bạn đã không thấy được rằng nếu bạn quyết định quay lại học, và rồi bạn thấy rằng điều đó không cần thiết với bạn nữa thì điều mà bạn có được là: bạn đã hiểu ra vấn đề. Bạn đã biết rõ hơn rằng việc gì sẽ có lợi hay không có lợi cho bạn. Những người thành công là những người cho rằng "Thất bại là mẹ của thành công"; những người không thành công lại là những người cho rằng "Thất bại làm cho ta thêm nhụt chí".

Như ví dụ ở trên, khi bạn quay trở lại trường Đại học để học tiếp thì đích đến là mảnh bằng Đại học chẳng phải là điều quan trọng nhất mà quan trọng hơn tất cả chính là đoạn đường mà bạn đã đi qua. Một quãng thời gian mà bạn sẽ gặp gỡ thêm được nhiều người, tiếp xúc với nhiều người, học hỏi thêm nhiều điều, hiểu rõ bản thân mình hơn và có thêm nhiều kinh nghiệm.

Nếu như bạn định đi bộ vượt qua Châu Âu hoặc tạo một chiếc xe thể thao đời mới nhất, hay bắt đầu lập một công ty kinh doanh thì điều quan trọng không phải là việc đi bộ, chiếc xe hơi hay công ty kinh doanh mà là bạn phải trở thành một người như thế nào để đạt được mục tiêu đó.

Trong quá trình đi đến mục tiêu, bạn dần dần trở nên can đảm hơn, quyết đoán hơn, phát huy được những thế mạnh của mình, hiểu được nguyên tắc của bản thân, biết chịu đựng hơn, tự tin hơn,…

Những gì bạn thu nhặt được trong quá trình theo đuổi mục tiêu sẽ giúp bạn xem xét việc "Bạn sẽ trở nên như thế nào?".

Khi bạn bắt đầu thực hiện mục tiêu thì bạn nên nhớ một điều là không phải mọi việc đều xảy ra một cách suôn sẻ. Mục tiêu nào cũng đầy trở ngại khó khăn.


Khi thủy triều dâng lên, nó dâng lên một chút và rút xuống một chút, và nó dần dần dâng lên theo một lộ trình như vậy. Khi một cái cây phát triển, lá rụng đi một ít và lá mới mọc ra nhiều hơn và kết quả là cây dần dần lớn hơn, to ra… Các sự vật diễn biến, phát triển trên hành tinh này đều theo một đồ thị gấp khúc đi lên, là một tiến trình bất di bất dịch.

Ví dụ như bạn bắt đầu một chương trình giảm cân và có lúc thấy mình có lúc giảm cân, có lúc lại tăng cân, thế là bạn cho rằng việc giảm cân khó mà thực hiện được, và thế là bạn đành chấp nhận mình là một người… hơi bị tròn trịa. Hoặc như bạn bắt đầu một kế hoạch tiết kiệm tiền, và sau vài lần chi tiêu ngoài dự tính, bạn thấy không thể tiết kiệm được và dẹp luôn chuyện sống cần kiệm.

Hãy nhớ rằng, những người thành công không hẳn là những người thông minh kiệt xuất. Đơn giản là họ nắm bắt được quy luật phát triển của sự vật và nhận thấy rằng sự phát triển của họ phải tuân theo quy luật của các sự vật diễn ra xung quanh họ. Họ thấy rằng người ta đạt được đến mục tiêu bằng một quá trình điều chỉnh liên tục. Chúng ta đi sai đường (lệch hướng) thì điều chỉnh lại cho đúng hướng, điều chỉnh, điều chỉnh, và điều chỉnh.


"Hãy viết ra mục tiêu của chính mình".


Có một điều mà bạn cần làm khi đề ra mục tiêu cho mình là hãy viết ra mục tiêu của mình.

Bạn hãy bỏ đi suy nghĩ "Tất cả mục tiêu đều nằm trong đầu tôi, và cứ thế mà làm thôi" mà lấy ra một tờ giấy, cây viết và làm cho mình một bảng danh sách những mục tiêu cần thực hiện. Bảng danh sách chẳng phải là việc duy nhất cần làm để đạt đến mục tiêu, nhưng có nó sẽ giúp ta định ra hướng đi để đạt được mục tiêu mà chúng ta muốn trong cuộc sống.


Mục tiêu là cỗ xe chuyên chở chúng ta qua những đoạn đường chứa nhiều khó khăn thử thách, mà qua đó ta trưởng thành hơn. Chúng ta cần phải có mục tiêu không phải vì kết quả cuối cùng mà ta đạt được mà vì những gì thu nhặt được trong quá trình thực hiện mục tiêu đó.

Chúc các bạn cuối tuần vui vẻ! :)

5S là gì?

I. 5S là gì?

5S là một phương pháp quản lý nhằm mục đích cải tiến môi trường làm việc, một chương trình hoạt động thường trực trong một doanh nghiệp hoặc ở một đơn vị hành chính. 5S là một phương pháp cải tiến rất đơn giản nhưng lại rất hiệu quả trong thực tế.

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-G9Rs8pesk6dj2-Q1zvIFohilLFgQUqXZbbU8i-QdVfxxziwkHstGcU3uruwyH4DpDHE_B3Bv1BirW3ac7l84N0q0eMS5Nan_2Fo4dsFHBwxBcg9vbbDboRhDOlUq3ZMbm89ByMEeQqA/s1600/5S.png

Hoạt động 5S nghe chừng rất đơn giản, nhưng lại có ý nghĩa lớn trong việc đảm bảo sức khỏe cán bộ nhân viên, tạo thuận lợi khi làm việc, nâng cao năng suất và chất lượng cuộc sống. Hoạt động này bắt nguồn từ truyền thống của Nhật Bản, với mục đích khơi dậy ý thức trách nhiệm, tính tự nguyện, tự giác của cán bộ. Các nhà quản lý tại Nhật Bản đã tiếp thu truyền thống này và đẩy lên thành một phong trào rộng rãi, sau đó đúc kết thành một lý luận khoa học và cho ra đời chương trình năng suất chất lượng mới đó là 5S.


II. Áp dụng 5S như thế nào?

SERI - SÀNG LỌC Loại bỏ những cái không cần thiết

Bước 1:

- Bạn hãy quan sát kỹ nơi làm việc của mình cùng với một vài đồng nghiệp.
- Hãy phát hiện và xác định những cái không cần thiết cho công việc của bạn.
- Sau đó thì vứt bỏ (hủy) những cái không cần thiết
- Đừng giữ lại những thứ gì không cần thiết cho công việc của bạn.
Bước 2:

- Nếu bạn và đồng nghiệp của bạn không thể quyết định ngay được là một thứ gì đó có còn cần thiết cho công việc hay không thì hãy đánh dấu sẽ hủy kèm theo ngày tháng sẽ hủy và để riêng ra một nơi.

Bước 3:

- Sau một thời gian, ví dụ 3 tháng, bạn hãy kiểm tra lại xem có ai cần đến cái đó không.
- Nếu sau 3 tháng mà không thấy ai cần đến, tức là cái đó không còn cần cho công việc nữa.
- Nếu bạn không thể tự mình quyết định thì hãy để ra một thời hạn để xử lý.

Chú ý:

1.Khi sàng lọc, bạn không được quên những gì để trong ngăn tủ.
2.Việc hủy những cái không cần thiết có thể là:
+ Bán cho đồng nát
+ Giao cho các đơn vị khác nếu họ cần
+ Vứt bỏ
+ Khi hủy những thứ thuộc tài sản của công ty, bạn nên báo cáo cho người có thẩm quyền biết
+ Bạn cũng nên thông báo cho những nơi đã cung cấp những nguyên vật liệu, tài liệu thừa đó
+ Khi quan sát xung quanh để tìm ra những thứ không cần thiết ở nơi làm việc của bạn, hãy tìm mọi nơi, mọi ngóc ngách giống như khi bạn tìm diệt một con gián vậy. Và sẽ là một phần thưởng nếu trong quá trình đó bạn lại tìm ra một vài vật có ích mà lâu nay bạn không nhớ để đâu.

SEITON -SẮP XẾP: Đặt mọi thứ đúng chỗ sao cho thuận lợi khi sử dụng

Bước 1:

- Bạn phải tin là mọi thứ không cần thiết đã được loại bỏ ra khỏi nơi làm việc của bạn
- Việc còn lại là bạn hãy suy nghĩ xem để cái gì ở đâu là thuận tiện theo quy trình làm việc đồng thời bảo đảm thẩm mỹ và an toàn

Bước 2:

- Sau đó bạn hãy trao đổi với các đồng nghiệp về cách sắp xếp bố trí trên quan điểm thuận tiện cho thao tác.
- Một nguyên tắc cần chú ý là cái gì thường xuyên hay phải sử dụng đến thì phải đặt gần người sử dụng để đỡ phải đi lại. Cái gì ít dùng hơn thì để xa hơn. Bạn hãy phác thảo cách bố trí và trao đổi với đồng nghiệp, sau đó thực hiện.

Bước 3:

- Bạn phải làm sao cho các đồng nghiệp của mình đều biết được là cái gì để ở chỗ nào để tự họ sử dụng mà không phải hỏi ai.
- Tốt nhất là bạn nên có một danh mục các vật dụng và nơi lưu giữ. Hãy ghi chú trên từng ngăn kéo, ngăn tủ, cặp tài liệu để mọi người biết cái gì được lưu giữ ở đó.

Bước 4:

Hãy áp dụng nguyên tắc này để chỉ rõ nơi đặt bình cứu hỏa và những chỉ dẫn cần thiết khác
Chú ý:

- Mục đích của SEITON - SẮP XẾP là làm cho nơi làm việc của bạn đựợc an toàn, hiệu quả khi làm việc. Vì vậy những vật như rèm, màn che để dấu những vật dụng ở phía sau là không cần thiết
- Nếu bạn có được tiêu chuẩn quy định mức tối thiểu và tối đa lưu giữ vật liệu, tài liệu thì càng tốt (reoder level)

SEISO - SẠCH SẼ: Làm vệ sinh sạch sẽ nơi làm việc

Có một mối quan hệ rất mật thiết giữa chất lượng sản phẩm và sự sạch sẽ ở nơi làm việc chế tạo sản phẩm. Như vậy Seiso (sạch sẽ) phải được thực hiện hàng ngày, đôi khi là trong suốt cả ngày.

Sau đây là một vài gợi ý cho Seiso của bạn:
- Đừng đợi đến lúc dơ bẩn mới vệ sinh. Hãy quét dọn, vệ sinh nơi làm việc, kể cả máy móc thiết bị, dụng cụ đồ đạc V.V… một cách thường xuyên làm cho những thứ trên đây không còn cơ hội để dơ bẩn.
- Giành 3 phút mỗi ngày để làm Seiso.
- Bạn và các đồng nghiệp của bạn có trách nhiệm với môi trường xung quanh nơi làm việc
- Những người làm vệ sinh chuyên nghiệp chỉ chịu trách nhiệm ở những nơi công cộng.
- Nếu bạn muốn làm việc trong một môi trường sạch sẽ và an toàn, tốt nhất là bạn hãy tạo ra môi trường đó.
- Đừng bao giờ xả rác, khạc nhổ bừa bãi và hãy tạo một thói quen sạch sẽ.
- Vệ sinh dọn dẹp cũng là một hành động kiểm tra.
- Điều này rất quan trọng đối với các nhà máy, công xưởng.
- Nếu bạn thấy điều này đúng thì hãy bắt đầu ngay từ hôm nay.

Chú ý: Ngoài 3 phút hàng ngày cho Seiso, bạn nên có thói quen làm Seiso trong tuần, trong tháng. Cái lợi do Seiso mang lại sẽ lớn hơn nhiều lần so với thời gian bỏ ra.

SEIKETSU - SĂN SÓC Duy trì sự vệ sinh sạch sẽ ở mức độ cao

Để không lãng phí những nỗ lực đã bỏ ra, bạn không nên dừng lại sau khi đã thực hiện được 3S. Sau đây là những gợi ý cho SEIKETSU của bạn:
- Tạo ra một hệ thống nhằm duy trì sự sạch sẽ ngăn nắp ở nơi làm việc; cần có lịch làm vệ sinh.
- Phong trào thi đua giữa các phòng ban, phân xưởng cũng rất quan trọng và hiệu quả trong việc lôi kéo, cuốn hút mọi người tham gia 5S.

Chú ý:

- Cần chỉ rõ tên người chịu trách nhiệm về nơi làm việc hay máy móc.
- Kiểm tra và đánh giá thường xuyên do thành viên của tổ (nhóm, đội) 5S của đơn vị thực hiện.
- Đừng chỉ có tìm chỗ xấu, kém để phê bình mà phải chú ý tìm ra cái hay, cái tốt để khen thưởng động viên.

SHITSUKE - SẴN SÀNG Thực hiện các S trên một cách tự giác mà không cần phải có ai đó nhắc nhở hay ra lệnh.

Cần phải làm cho mọi người thực hiện 4S một cách tự giác như là một thói quen hay lẽ sống. hông có cách nào thúc ép thực hiện 5S hơn là thường xuyên thực hành nó cho tới khi mà mọi người đều yêu 5S. Cần tạo ra một bầu không khí lành mạnh để mọi người thấy không thể thiếu 5S.

Muốn vậy cần phải chú ý:
- Coi nơi làm việc như là ngôi nhà thứ hai của bạn - Nhận thức được công ty như là nơi bạn tạo ra thu nhập cho bạn và gia đình bạn.
- Nếu bạn mong muốn và thường xuyên làm cho ngôi nhà của bạn sạch sẽ, vệ sinh, ngăn nắp thì tại sao bạn lại không cố gắng làm cho nơi làm việc của bạn sạch sẽ thoải mái dễ chịu như ở nhà.
Chú ý:

Để nâng cao SHITSUKE (sẵn sàng) của nhân viên trong công ty thì vai trò của người phụ trách là cực kỳ quan trọng. Người phụ trách phải là tấm gương về 5S để mọi người noi theo.

Tham Khảo:
- Implement 5S at your workstation

Coding with JDK7

The JDK7 milestone 5 update is available for download. Developers now have a chance to try coding with the new language semantics and see for themselves what it is like. The 4 major changes that affect the way one codes in java as of JDK 7 are
  • Using underscores in numerals.
  • Diamond syntax used to work with collections + generics.
  • Using Strings in switch statements.
  • Making use of binary literals

Here is a short code sample that you can use to check the new features out. Use a plain text editor and your old friends javac and java, to test it out. IDEs will not support the new syntax and will most likely complain.

Sample JDK 7 Code:

public class Jdk7Tests {

public static void main(String[] args) {
Jdk7Tests jdk7Tests = new Jdk7Tests();
jdk7Tests.integersWithUnderscores();
jdk7Tests.stringSwitch();
jdk7Tests.binaryLiteral();
jdk7Tests.diamond();
}

private void integersWithUnderscores()
{
int i = 1_2;
System.out.println(i);
i*=10;
System.out.println(i);
int j=2_0;
System.out.println(i-j);
}

private void stringSwitch()
{
String key = "akey";
switch (key)
{
case "":
{
System.out.println("Nothing");
break;
}

case "akey":
{
System.out.println("Matched akey");
break;
}
default:
break;
}
}

private void binaryLiteral()
{
byte aByte = (byte)0b001;
short aShort = (short)0b010;
System.out.println(aByte + " " + aShort);
}


private void diamond()
{
Set<String> set = new TreeSet<>();
set.add("c");
set.add("b");
set.add("a");
for (String val : set)
{
System.out.println(val);
}
}
}

Underscores and numerals:

This feature will be great to process SSNs / phone numbers. No more putting the data into a String, parsing it, stripping it off underscores, and then putting it into an integer. But confusion arises when you try to do some arithmetic with the numeral. What is 1_2 * 2 ? The JVM strips the underscores when processing the operation as can be seen from the code example above. Thus 1_2 * 10 = 120 and 120 – 2_0 = 100. Simple

Diamond:

This should simplify instantiating collections. Time to update my auto complete code templates in anticipation of JDK 7. It is a little easier to read the code inside the diamond() method, in my opinion. Nothing more to the syntax though.

Switch with strings:

This is a pretty neat feature. You can now switch using Strings besides int, etc etc. Code that used to assign int variables to their corresponding String counterparts can now use this feature to simplify their code. Often code that contains call back methods in several places might set a int variable in one place, indicating that a particular String was found and then process this at a later point in time, using a switch construct. Some developers use this technique to write code that processes XML with SAX. They should be able to chop a few lines off that code using this feature.

Binary literals:

You can now use a binary literal representation and have that converted to a data type, say a byte or short, with very little code. I am not able to think of a scenario where I would use this regularly. But some of those coding practice problems that involve bits should be easier to write up .

Other features of interest that do not necessarily affect programming, involve better algorithm implementations and performance improvements. These improvements are said to bring a many fold increase to performance in some applications. Test them out if you have the time.

(From www.certpal.com)