Thứ Tư, 30 tháng 7, 2008

Tư duy lập trình ( Phần 3)

Tiếp theo và hết.
Chúng ta nên làm gì?

Chúng ta có 2 cách tiếp cận để giải quyết những vấn đề trên. Cả 2 cách đều được lấy từ cuốn sách Peopleware mà tôi đã từng giới thiệu, cùng với cuốn sách “First Break All The Rules” – một cuốn sách mà những người làm quản lý và nhân sự nên đọc. Tôi viết bài viết này cũng là nhờ lấy thông tin từ 2 cuốn sách trên.

Cách thứ 1: tôi gọi là “sửa chữa nhẹ”. Chúng ta sẽ điều chỉnh lại những ảnh hưởng của cái thang theo hướng tích cực.

Cách thứ 2: tôi gọi là “làm lại hoàn toàn”. Tôi sẽ trình bày về cách này ở phần sau.

Sửa chữa nhẹ có nghĩa là chúng ta tạm chấp nhận sự tồn tại của cái thang, nhưng sẽ “tùy biến” nó lại một chút. Quan điểm thông thường bảo rằng chúng ta chỉ được phép tiến lên trên cái thang (hoặc có thể rẽ trái hay phải tùy theo chúng ta có thiên hướng quản lý hay kỹ thuật, nhưng cuối cùng thì cũng phải đi lên). Vậy thì chúng ta sẽ thêm một lựa chọn nữa khi leo thang: nếu ai không thích leo lên trên thì có thể leo ngang!

Nghĩa là mỗi người sẽ được khuyến khích đi sâu vào lĩnh vực mà họ đang làm. Không nhất thiết phải giỏi mọi thứ trong thời gian ngắn mới được đánh giá cao, thay vì vậy mỗi người cần tìm cái mình thích nhất và có khả năng nhất, rồi tập trung phát triển để mình trở nên xuất sắc nhất trong lĩnh vực đó.

Sau đây tôi sẽ trình bày cụ thể chúng ta sẽ cần làm thế nào và hệ quả sẽ ra sao.

1) Trả lương theo đúng năng lực

Chắc chắn những gì tôi trình bày ở trên sẽ khiến bạn phải nghi ngờ ngay: thực tế tuy phũ phàng nhưng nó phải là như vậy. Manager thì quan trọng hơn developer nên lương cũng cao hơn developer. Vì vậy ai cũng muốn thăng tiến để làm manager. Suy cho cùng thì ai lại chẳng muốn địa vị cao và lương cao!

Đúng vậy, tìm một manager tốt thì khó hơn rất nhiều so với tìm được developer tốt. Để trở thành manager tốt thì cũng cần nhiều thời gian, nhiều kỹ năng hơn, nhiều kinh nghiệm hơn, cho nên lương trung bình của manager phải cao hơn lương trung bình của developer.

Nhưng sẽ thật sai lầm nếu cho rằng lương của mọi manager đều phải cao hơn lương của mọi developer. Nếu công ty trả lương dựa trên nấc thang mà nhân viên đang đứng, thì không sớm thì muộn mọi nhân viên sẽ cũng xô đẩy nhau vào cuộc đua leo thang không có kết thúc hậu.

Trở lại câu chuyện bóng đá một chút. Thật ra ngay cả những đứa nhỏ cũng hiểu làm tiền đạo thì có giá hơn làm hậu vệ. Tiền đạo ít khi thi đấu đủ 90 phút, lại chạy ít hơn, nhưng lúc nào cũng nhận lương cao hơn, giá trị chuyển nhượng cũng cao hơn, và luôn được hâm mộ hơn so với hậu vệ. Vậy thì ai lại muốn làm hậu vệ?

Câu trả lời là có. Đó là những hậu vệ xuất sắc. Thể thao, đặc biệt là bóng đá, có một hệ thống lương bổng tốt mà những ngành khác nên học tập. Nó khuyến khích những hậu vệ giỏi luôn nỗ lực để xuất sắc hơn, thay vì cắm cúi rèn luyện để trở thành những tiền đạo trung bình. Họ hiểu rằng làm hậu vệ xuất sắc thì lương cao hơn làm tiền đạo trung bình. Dĩ nhiên, họ cũng hiểu ở cùng trình độ cao như họ thì những đồng nghiệp trên hàng tiền đạo sẽ có lương cao hơn, hợp đồng quảng cáo nhiều hơn, khả năng đạt giải thưởng (như Quả bóng vàng chẳng hạn) cũng sẽ lớn hơn. Nhưng điều đó không làm họ quan tâm, bởi vì họ hiểu rằng mình sinh ra không phải để làm tiền đạo xuất sắc.

Tương tự như vậy, trong bóng đá thì lương trung bình của huấn luyện viên luôn cao hơn lương trung bình của cầu thủ. Mourinho có mức lương mà rất nhiều cầu thủ ở Chelsea phải thèm muốn. Các cầu thủ Việt Nam hẳn sẽ phải e dè trước mức lương của ông Riedl. Nghề huấn luyện viên cũng có tuổi thọ cao hơn nghề cầu thủ.

Nhưng chẳng có mấy cầu thủ muốn kết thúc sự nghiệp cho nhanh để trở thành huấn luyện viên. Bởi vì trở thành cầu thủ xuất sắc đối với họ thì khả thi hơn, và khi đó họ cũng có thu nhập cao hơn so với việc trở thành huấn luyện viên làng nhàng.

Chúng ta nên làm như vậy trong ngành phần mềm. Chúng ta vẫn giữ những nấc thang như vậy, nhưng sẽ trả lương sao cho những người xuất sắc ở nấc thang bên dưới sẽ có lương cao hơn so với những người bình thường ở nấc thang bên trên.

Lấy ví dụ ở công ty Merrill Lynch. Theo như tác giả Marcus Buckingham và Curt Coffman của cuốn sách “First Break All The Rules” thì lương cao nhất mà một người cố vấn tài chính có thể nhận được là 500 ngàn đô la một năm. Trong khi đó, lương thấp nhất của một giám đốc chi nhánh (vị trí cao hơn so với cố vấn tài chính) chỉ là 150 ngàn đô la. Vì vậy, nếu một cố vần tài chính giỏi muốn được thăng chức, anh/chị ấy phải chấp nhận rủi ro sẽ bị lương thấp hơn đi rất nhiều. Dĩ nhiên, ở khía cạnh còn lại, nếu trở thành giám đốc chi nhánh xuất sắc, lương của họ có thể lên đến hàng triệu đô la. Cuộc chơi rất công bằng.

Các cầu thủ xuất sắc hoặc cầu thủ gạo cội cũng phải cân nhắc rất nhiều khi chuyển sang nghề huấn luyện viên. Bởi vì ngay lập tức họ sẽ bị giảm lương so với khi làm cầu thủ. Nguyên tắc này khuyến khích những người giỏi trở nên giỏi hơn, và loại bớt những người chỉ nhằm vào thu nhập cao mà không cần tài năng ra khỏi cuộc chơi.

Cũng có nhiều người phải đối cách làm này. Họ nghĩ rằng cách làm hiện tại đỡ tốn kém hơn. Trả nhiều cho manager (có số người ít) và trả ít cho developer (có số người nhiều hơn) thì sẽ tiết kiệm hơn so với làm ngược lại. Họ nghĩ rằng chỉ cần manager giỏi thì cũng có thể quản lý được một tập thể developer trung bình.

Một tập thể developer trung bình thì kết quả cuối cùng sẽ là trung bình, cho dù manager có là ai. Người manager sẽ phải mất nhiều thời gian để “hốt” những hậu quả và sai sót mà những developer để lại. Họ sẽ giẫm lên chân nhau. Một số người, đặc biệt là manager, thậm chí phải dành thời gian để lao vào coding thay cho những người không có khả năng. Cơn ác mộng này hẳn ai trong chúng ta cũng từng một lần biết qua.

Nếu một manager xuất sắc mà tập thể thì kém cỏi, kết quả sẽ thế nào? Không khó phải đoán, vì kinh nghiệm cho thấy kết quả của tập thể đó cũng sẽ rất kém cỏi. Điều duy nhất mà manager xuất sắc làm tốt hơn manager kém cỏi trong trường hợp này là dù thất bại, các thành viên cũng vấn thấy vui vẻ vì đã làm việc chung với người manager xuất sắc, vì họ đã học được nhiều điều có ích. Ngược lại, họ sẽ vô cùng tức giận và ganh ghét vì thấy người kém cỏi mà cũng được làm manager.

Khả năng duy nhất mà manager xuất sắc có thể làm là biến một tập thể có tiềm năng trở nên thực sự xuất sắc. Điều này thì manager trung bình hay kém cỏi không thể làm được.

Vì vậy, hãy trả lương cao cho những những developer xuất sắc, và trả lương cao hơn nữa cho những manager xuất sắc; đối với những người còn lại thì trả lương thấp hơn.

2) Mở rộng các nâng thang sang chiều ngang

Phần lớn các công ty phần mềm đều định ra bảng liệt kê các tiêu chí để đánh giá nhân viên. Trong đó, nó sẽ phân biệt rạch ròi đâu là sự khác biệt giữa developer với senior developer, với team leader, với manager, với senior manager. Chẳng hạn, senior developer thì hơn developer ở số năm kinh nghiệm và khả năng truyền đạt. Nhưng rất ít nơi nào có khả năng định nghĩa đâu là sự khác biệt giữa developer kém, đâu là developer trung bình, và đâu là developer xuất sắc.

Đánh giá như vậy thì buồn cười quá. Nếu dựa vào cách làm đó, tôi có thể nói rằng Trần Tiến Anh, cựu thủ môn của đội Thể Công giỏi hơn Ronaldinho nhiều. Ronaldinho chỉ biết đá ở vị trí tiền về tấn công hoặc tiền đạo. Nhưng Trần Tiên Anh thì “tròn trịa” hơn, bắt gôn thì hay, thình thoảng cũng đá được hậu vệ, khi nào có dịp đẩy lên đá tiền đạo cũng ngon lành chẳng kém tiền đạo mấy đội bóng phong trào.

Cách làm hiện nay đang phá hủy nghề nghiệp của tester, developer, và cả team leader, những người ở nấc thang bên dưới. Rất nhiều người làm testing và lập trình hiện nay đang hoang mang và chán nản, vì cho rằng những công việc này chẳng có gì phức tạp cả, ai làm cũng như ai. Là một người say đặc biệt say mê phần mềm và làm phần mềm, tôi không khỏi xót xa vì chuyện này. Ngay cả những người dọn dẹp phòng trong các khách sạn cũng hiểu được thế nào là người làm giỏi, thế nào là người làm dở, vậy mà chúng ta không chịu phân biệt đâu là developer giỏi và đâu là developer dở. Mà thật ra ngay cả những vị trí ở trên cũng đang xảy ra tình trạng tương tự đấy thôi.

Chúng ta nên chấm dứt tình trạng so sánh táo và cam, so sánh chó và mèo, so sánh tàu thủy và máy bay. Thay vì vậy, hãy so sánh những con mèo với nhau, chỉ rõ ra được đâu là mèo đẹp, đâu là mèo xấu; nuôi dưỡng và thưởng cho mèo đẹp để nó đẹp hơn, và không bao giờ khuyến khích nó trở thành chó nếu điều đó là không khả thi.

3) Thay đổi công việc phát triển phần mềm

Thực tình tôi cũng phải thừa nhận rằng với công việc phát triển phần mềm hiện nay, rất khó để khuyến khích mọi người phát triển theo chiều ngang được, dù đó là tester, developer, hay manager. Vâng, phần lớn chúng ta làm gia công phần mềm (outsourcing), và khi outsourcing, chúng ta không cần nhiều những developer xuất sắc như nước Mỹ, và về mức độ cũng không cần phải xuất sắc như những người hàng đầu ở Mỹ.

Trong tình hình hiện nay, một số nhỏ những cá nhân xuất sắc ở Việt Nam sẽ không tìm được vị trí của nấc thang thích hợp cho mình. Họ đang hoang mang không biết làm gì. Phần lớn họ quyết định ra nước ngoài học lên cao. Tôi chưa có khả năng bình luận về điều này, bởi vì tôi không may mắn được sinh ra trong số đó. Tôi đã và đang phải vật lộn với từng nấc thang đấy thôi, bắt đầu từ nấc thang thấp nhất đấy thôi

Nhưng ngay cả trong gia công phần mềm, vẫn còn rất nhiều khoảng trống để nhiều người phát triển sang ngang. Vấn đề là chúng ta có biết cách làm hay không. Tôi sẽ trở lại với đề tài này trong thời gian sắp tới.

4) Hiểu rõ bản chất của sự phát triển

Tuy vậy, cũng sẽ có nhiều người phản đối những gì tôi đã trình bày ở trên. Tôi đoán có lẽ họ xuất thân từ ngành nhân sự, vì cái thang sự nghiệp là sản phẩm của ngành đó, không phải là của ngành công nghiệp phần mềm. Tôi cũng đoán có lẽ họ nhiễm phim kiếm hiệp Hồng Kông nặng.

Trong phim kiếm hiệp, nhân vật chính của chúng ta sẽ luyện võ công từ cơ bản đến thượng thừa bằng cách bước vào một tòa tháp nhiều tầng. Ở mỗi tầng sẽ có các đối thủ với những sở trường khác nhau. Chẳng hạn, ở tấng 1, anh ta phải đối đầu với một cao thủ về khinh công. Anh ta phải rèn luyện để khinh công của mình vượt qua được đối thủ đó. Chiến thắng ở tầng 1 sẽ cho phép anh ta bước lên tầng 2. Ở tầng này, anh ta sẽ phải luyện kiếm pháp để đánh bại một cao thủ chuyên về kiếm. Cứ như thế, tấng 3 sẽ là đao pháp, tầng 4 là quyền pháp, tầng 5 là khí công, tấng 6 là trí lực, tầng 7 là phi tiêu ám khí, vân vân và vân vân. Khi vượt qua được tất cả các tầng và lên đến đỉnh ngọn tháp, anh ta sẽ trở thành cao thủ đệ nhất thiên hạ.

Quan niệm thông thường dạy chúng ta rằng đó là sự phát triển của con người. Chúng ta được khuyến khích chinh phục những cái chưa biết, những cái chưa làm, khắc phục những điểm yếu của mình. Chúng ta cần làm cho mình hoàn thiện hơn.

Sự thực thì chẳng ai có thể làm được như vậy. Mỗi người sinh ra đều có điểm mạnh và điểm yếu riêng. Rất khó để chúng ta tự rèn luyện nhằm có thêm được những điểm mạnh mới, và càng không thể nếu chúng ta cố gằng tự sửa chữa điểm yếu để nó trở thành điểm mạnh.

Tất cả các vĩ nhân đều có khiếm khuyết. Họ không mất thời gian đi sửa chữa khiếm khuyết của mình. Thay vào đó họ tìm ra đầu là điểm mạnh của họ, tìm môi trường để điểm mạnh phát huy hết, và tìm những người cộng sự xuất sắc ở lĩnh vực khác để bù đắp cho khiếm khuyết của mình.

Tôi hiểu ra điều này sau khi đọc 2 cuốn sách ở trên, và nhất là sau khi cuộc trao đổi với một nhân viên trong công ty. Tôi hỏi:

- Định hướng nghề nghiệp trong tương lai của em như thế nào? Và rồi tôi thao thao về những cơ hội phía trước, nào là leader, manager, technical director,...

- Em thấy mình phù hợp với công việc chỉnh sửa và hoàn thiện lại những phần mềm sẵn có, để nó trở nên tốt hơn. Em thích được làm việc, nhưng quan trọng nhất là em thích được chơi game!!! – Nhân viên đó trả lời.

Tôi bị bất ngờ và chợt bửng tỉnh. Tôi đã quá ngu muội, tưởng tượng mình là đạo diễn trong bộ phim kiếm hiệp, và dựng cho người nhân viên này vai chính trong đó. Tôi lại đi khuyến khích nhân viên này kinh qua tất cả các tầng để trở nên hoàn thiện hơn, nhưng lại không hiểu người này muốn gì và có khả năng gì.

Bây giờ thì tôi đã hiểu. Người nhân viên của tôi không cần phải trở thành nhân vật chính trong bộ phim. Ngược lại, anh ta nên trở thành một trong các nhân vật phụ. Anh ta sẽ đi tìm xem mình thích cao thủ ở tầng nào nhất, và nếu đủ khả năng, anh ta sẽ ở lại tầng đó, rèn luyện để có thể trở thành cao thủ đệ nhất trong lĩnh vực đó. Có thể anh ta sẽ trở thành đệ nhất cao thủ khinh công, và như vậy anh ta không cần thiết phải luyện phép mình đồng da sắt làm gì nữa. Đơn giản là không thể được như vậy.

Anh ta sẽ ở lại tầng đó càng lâu càng tốt. Có lẽ anh ta sẽ không bao giờ đi lên những tầng phía trên của ngọn tháp. Điều đó là không cần thiết. Bởi vì anh ta là một người rất đặc biệt. Cuộc sống của anh ta không phải là ở ngọn tháp đó. Anh ta chỉ ở tầng 1 của ngọn tháp trong một phần nhỏ của cuộc đời, và trong phần lớn thời gian còn lại, anh sẽ ra ngoài ngọn tháp, chơi những thứ mình thích, làm những điều có ý nghĩa khác, rồi ở bên những người quan trọng nhất đối với anh ta. Đó là phần kết của bộ phim.

Chúng ta có rất nhiều chọn lựa

Còn một cách khác, tôi cho rằng triệt để hơn, đó là chúng ta hãy dẹp bỏ cái thang đó. Rõ ràng là nó vô nghĩa và nó đang làm sự nghiệp của nhiều người trở nên vô nghĩa.

Bất kỳ công ty nào cũng cần có sơ đồ mô tả bộ máy quản lý của công ty. Từ người thấp nhất đến người cao nhất. Sơ đồ này là phải có ở bất kỳ tổ chức nào. Nội dung của nó hoàn toàn giồng “bản vẽ” cái thang sự nghiệp mà chúng ta đang dùng.

Nhưng chúng ta không nên sử dụng nó đễ định hướng cho nhân viên phát triển sự nghiệp theo đó. Chúng ta nên tìm cách khác tốt hơn

33 câu hỏi phỏng vấn của Google

Microsoft nổi tiếng là có các câu hỏi phỏng vấn nhân viên mới mang tính kỹ thuật theo dạng đố “mẹo” (đa số là về thuật toán hoặc lập trình C/C++). Có nhiều bộ sưu tập các câu hỏi dạng này đã từng được hỏi ở các cuộc phỏng vấn ở Microsoft. Gần đây Google cũng phỏng vấn theo kiểu tương tự. Mỗi câu trả lời chỉ được cho khoảng 5-10 phút suy nghĩ. Đôi khi người ta quan tâm đến quá trình suy nghĩ của bạn hơn là bản thân câu trả lời.

Trong chuỗi bài này sẽ nêu chọn lọc một số câu hỏi . Các câu hỏi được chọn không nhất thiết là khó nhất, tiêu chuẩn là gọn gàng và đẹp.

1. Cho một danh sách liên kết đơn (simple linked list) hữu hạn. Có hai trường hợp: một là cuối danh sách trỏ về NULL, hai là trỏ về một phần tử đã gặp - tạo nên một vòng tròn trong danh sách.
Ví dụ trường hợp 1: A –> B –> C –> D –> NULL.
Ví dụ trường hợp 2: A –> B –> C –> D –> E –> F –> C.
Cho trước một con trỏ vào một danh sách liên kết đơn L nào đó, hữu hạn nhưng có thể có độ dài tùy ý. Làm thế nào để kiểm tra nhanh nhất nếu danh sách L thuộc trường hợp 1 hay trường hợp 2, với điều kiện là ta chỉ được dùng vài chục bytes bộ nhớ.

2. Cho một chuỗi ký tự s bao gồm nhiều từ. Viết một đoạn chương trình C đảo thứ tự các từ.
Ví dụ: với input là “this is a nice blog” thì output là “blog nice a is this“.

3. Cho hai dãy số đã xếp thứ tự tăng dần A và B, mỗi dãy có n phần tử. Xét tập hợp sau:

S = { A[i] + B[j] | 1 }

4. Chỉ với các phép tính cộng, trừ, nhân, chia, các hàm lượng giác, phép lũy thừa, và phép lấy căn, cùng với ba số 2, làm thế nào để viết một biểu thức định trị ra 2005? (Gợi ý: 2005 không có gì đặc biệt, số nguyên dương nào cũng được.) [Câu này tôi biết qua chị Hà Dương, lúc giải ra rất thích! Đơn giản và độc đáo]

5. Bụt, diêm vương, và Tèo đứng trước mặt bạn. Bụt và diêm vương cái gì cũng biết. Tèo thì cái biết cái không. Bụt luôn nói thật, diêm vương luôn nói dối. Với 3 câu hỏi có/không, mỗi câu chỉ hỏi một trong ba đối tượng, xác định ai là ai.

6. Cho a và b là các số nguyên dương, nguyên tố cùng nhau. Tìm công thức tính số nguyên lớn nhất không thể viết dưới dạng ax+by, trong đó x và y là các số nguyên không âm.

7. Cho hai sợi dây dài, làm bằng các vật liệu khác nhau, có mật độ vật chất khác nhau ở các điểm khác nhau của từng sợi. Cho biết mỗi sợi dây cháy trong đúng một giờ thì hết. Dùng hai sợi dây (và diêm) để đo 45 phút.

8. Cho hai hình lập phương. Ta phải gán các chữ số 0-9 (mỗi mặt một số) ra sao để có thể dùng hai hình lập phương biểu diễn được tất cả các ngày trong tháng.

9. Những điểm nào trên quả địa cầu (giả sử là đúng hình cầu) có tính chất sau đây: đi về phía Nam 1km, sau đó về phía Tây 1km, sau đó về phía Bắc 1km thì quay lại điểm cũ.

10. Cho một mảnh giấy hình chữ nhật với một lỗ hổng hình chữ nhật ở giữa.

Hỏi: Dùng dao cắt mảnh giấy một nhát như thế nào để có hai nửa có diện tích bằng nhau?

11. Có 500 cái cửa nằm dọc theo một hành lang đánh số từ 1 đến 100. Lúc đầu các cửa đều đóng. Có 500 người xếp hàng đi dọc hành lang. Anh thứ nhất mở tất cả các cửa; anh thứ hai chuyển trạng thái (mở thành đóng, đóng thành mở) các cửa 2, 4, 6, …; anh thứ ba chuyển trạng thái các cửa 3, 6, 9, …; cứ như vậy đến anh thứ 500 chuyển trạng thái cửa 500.

Hỏi: cuối cùng có bao nhiêu cửa đóng?

12. Có hai căn phòng nằm cạnh nhau nhưng không thông nhau, và đứng bên này không thấy bên kia. Phòng 1 có ba cái đèn bóng tròn. Phòng 2 có ba công tắc của ba đèn ở phòng 1. Bạn là người lạ, được dẫn vào phòng 2 trước, được quyền nghịch ngợm tắt mở công tắc tùy ý. Sau đó bạn được sang phòng 1 kiểm tra đèn.

Hỏi: nghịch thế nào ở phòng 2 để biết công tắc nào tương ứng với đèn nào?

13. (Bài toán Monty Hall) Monty Hall làm MC của một trò chơi trên truyền hình. Có ba cái cửa chắn trước người chơi. Đằng sau một trong các cánh cửa là phần thưởng. Bạn chọn một trong ba cánh cửa. Monty Hall xem đằng sau hai cánh còn lại và mở một cửa không có phần thưởng.

Hỏi: bạn sẽ giữ chọn lựa cũ hay đổi sang cửa còn lại để lấy phần thưởng? Tại sao?

14. Tèo yêu hai cô gái Tấm và Cám. Cả ba sống trên cùng một con đường, Tèo ở đoạn giữa. Các xe buýt đi cả hai chiều của con đường, mỗi chiều một tiếng một lần có xe buýt đến (tốc độ đều). Sáng sáng Tèo ra bến xe buýt và đón xe nào đến trước thì đi về hướng ấy. Sau một thời gian dài thì Tèo đi thăm Tấm gấp ba lần đi thăm Cám.

Hỏi: sao lại thế được?

15. Có hai xe tải đứng đối diện nhau, cách nhau 100km. Xe 1 có tốc độ 50km/h, xe 2 có tốc độ 30km/h, một con ruồi đậu trên mũi xe 1 bay qua bay lại giữa hai mũi xe với tốc độ 5000km/h. Cả hai xe và con ruồi đều xuất phát cùng một lúc.

Hỏi: đến khi con ruồi bị đè bẹp gí giữa hai xe (đụng nhau) thì con ruồi bay được bao xa?

16. Cho một linked list (danh sách liên kết) và pointer đến đầu linked list. Ta không biết trước tổng số phần tử trong list là bao nhiêu. Viết một function trả về pointer đến một phần tử ngẫu nhiên trong list (uniform distribution), mà chỉ được duyệt qua linked list 1 lần. (Nghĩa là không được đếm tổng số phần tử n, chọn ngẫu nhiên từ 1 đến n, rồi duyệt lần 2 để trả về con trỏ ngẫu nhiên.)

17. Cho một array *A* các ký tự trong một bộ ký tự nào đó, và một tập *S* của vài ký tự. Viết một function chạy trong thời gian tuyến tính,trả về sub-array nhỏ nhất của *A* chứa tất cả các ký tự trong *S*.

18. Cho một ma trận m hàng n cột. Các con số trên các hàng đều tăng dần từ trái sang phải, và trên các cột đều tăng dần từ trên xuống dưới. Viết một thủ tục tìm một số xem nó có trong ma trận không? Thời gian chạy là bao nhiêu? *Lưu ý*: đây là phiên bản 2-D của binary search.)

19. Ba người thuê một phòng khách sạn. Họ đưa cho anh bảo vệ 30 đô. Anh bảo vệ đưa cho người quản lý, nhưng người quản lý trả lại 5 đô vì giá phòng chỉ có 25. Cầm 5 đô, không biết làm sao chia cho 3 người, anh bảo vệ cầm lấy 2 đô xem như tiền boa, còn lại đưa mỗi người 1 đô.
Mồi người bỏ ra 10 đô, lấy lại 1 đô, vị chi là mỗi người 9 đô - tổng cộng 27 đô. Anh bảo vệ lấy 2 đô nữa là 29 đô. Vậy còn 1 đô đi đâu?

20. Có n người, trong đó một số luôn nói thật, một số lúc thật lúc dối không biết đâu mà lường. Ta phải phỏng vấn đám người này và chỉ ra tất cả những người luôn nói thật. Những người này biết thông tin thật/dối của tất cả những người còn lại. Các câu hỏi chỉ có thể ở dạng: “hỏi anh A xem anh B thuộc loại nào”.
(i) Nếu biết trước hơn nửa số người thuộc dạng luôn nói thật, tìm chiến thuật phỏng vấn chỉ cần n-1 câu hỏi.
(ii) Có tồn tại chiến lược phỏng vấn nào không nếu chỉ có ít hơn nửa luôn nói thật?
(iii) Giả sử ta tìm được 1 anh nói thật. Dĩ nhiên ta có thể hỏi anh này n-1 câu để biết tất cả những người còn lại thuộc loại nào. Có cách nào tốt hơn không?

21. An, Bình, Chung, Dung phải qua cầu khỉ vào buổi tối. Chỉ có một cái đèn pin. Tối đa là hai người đi cùng một lúc, và phải có đèn mới qua/lại được. Họ đi với tốc độ khác nhau. Nếu hai người cùng đi thì cả hai phải đi bằng tốc độ người đi chậm hơn.
An cần 1 phút.
Bình cần 2 phút.
Chung cần 5 phút.
Dung cần 10 phút.
Dĩ nhiên là phải có người cầm đèn đi ngược lại để đón người kế qua nếu cần!
Hỏi: ít nhất họ cần bao nhiêu phút để cả 4 qua được cầu?

22. Có ba hộp kẹo, một toàn kẹo dừa, một toàn sô cô la, hộp còn lại thì nửa này nửa nọ. Nhãn tất cả các hộp đều dán sai. Giả sử ta có một cục kẹo của một hộp, đoán tất cả các hộp xem là gì.

23. Cho biểu thức 101 - 102 = 1, di chuyển một chữ số hoặc ký hiệu (-, =) sao cho nó biến thành đẳng thức.

24. Cho một ly sữa và một ly cà fê cùng thể tích chất lỏng. Múc 1/10 ly cà fê đổ vào ly sữa, sau đó múc 1/10 ly sữa cà fê đổ vào ly cà fê. Giả sử cà fê và sữa hòa tan tuyệt đối.
Hỏi: sau khi đổ thì phần trăm cà fê và sữa ở hai ly ra sao?

25. Cho một dãy số A gồm n số thực: A[1], \dots, A[n]. Một dãy con của A là một dãy liên tục các phần tử của A. Ví dụ: dãy A[2], A[3], \dots, A[25] là một dãy con của A. Tìm một thuật toán chạy trong thời gian O(n) để in ra dãy con có tổng lớn nhất của A. (Chú ý là A có thể lẫn lộn các số âm, dương.)

26. Định nghĩa \log^{(i)} n = \log \log \dots \log n (i lần), và
\log^*n = \min\{ i \geq 0 \ : \ \log^{(i)} n \leq 1 \}

Hỏi: trong hai hàm \log^*(\log n) và \log(\log^*n) thì hàm nào tăng nhanh hơn khi n lớn?

27. Viết một đoạn chương trình C để xác định xem máy chạy chương trình là big-endian hay little-endian.
28. Viết một đoạn chương trình C để biết stack của một máy grow down hay grow up?

29. Cho chuỗi S_1 = \{ a, b, c, d, \dots, x, y, z, aa, ab, ac, \dots \}. Biết rằng chuỗi này có ánh xạ một-một đến chuỗi S_2 = \{1, 2, 3, 4, \dots \}. Viết một chương trình để chuyển một phần tử của S_1 thành một phần tử tương ứng của S_2. Viết chương trình chuyển theo chiều ngược lại.

30. Cho một hình vuông đơn vị, mô tả các điểm trong hình vuông này mà nằm gần tâm hơn cạnh ngoài.

31. Có bao nhiêu số 0 ở đằng cuối của biểu diễn thập phân của n!?

32. Khi ta soi gương, giơ tay trái lên thì hình nhân trong gương giơ tay phải của hắn. Tuy nhiên, khi ta cúi đầu thì hình nhân trong gương cũng cúi đầu. Tại sao gương “lật” trái/phải, nhưng không “lật” trên/dưới?

33. Có 9 túi đựng tiền, mỗi túi chứa ít nhất 100 đồng tiền, trong đó có một túi chứa toàn tiền giả. Các đồng tiền thật đều nặng 100 grams. Các đồng tiền giả đều nặng 90 grams. Cho một cái cân đĩa (1 đĩa và đồng hồ chỉ cân nặng), cân 1 lần để xác định túi nào chứa tiền giả?

Tư duy lập trình (Phần 2)

Loạt bài viết này thuộc về Lê Đình Lĩnh Nam.(Nam Le's Blog)
Trong bài viết trước, tôi đã cố gắng mô tả một số khía cạnh của nghề lập trình viên, nhưng quên nêu lên luận điểm quan trọng nhất: vì sao lại như vậy và chúng ta phải làm thế nào đây?

Ta sẽ đi đến đâu từ vị trí này?

Nào, trước hết chúng ta bắt đầu bằng câu hỏi:

Chúng ta sẽ được làm gì khi tham gia vào một công ty phần mềm?

Quan niệm phổ biến hiện nay nói rằng bạn sẽ bắt đầu ở vị trí thấp nhất là một lập trình viên (programmer, hoặc là developer, hoặc coder, hoặc tester, hoặc technician). Ở đó bạn cần hoàn thành tốt các công việc được giao bằng nỗ lực cá nhân. Nếu làm tốt, bạn sẽ tiến lên làm lãnh đạo nhóm (team leader, hoặc senior developer), khi đó công việc chuyên môn được chia ra, bạn chỉ làm những thứ khó nhất và quan trọng nhất; còn đối với những việc dễ và thường lập đi lập lại, bạn sẽ chỉ dẫn những người lập trình viên ở bên dưới thực hiện. Lên một mức cao hơn, bạn sẽ được làm quản lý dự án (nếu bạn có thiên hướng về quản lý) hoặc sẽ làm trưởng phòng kỹ thuật (nếu bạn có thiên hướng về chuyên môn). Lúc này bạn sẽ dành phần lớn thời gian cho việc lập kế hoạch, giao việc, kiểm soát, sử dụng người, đào tạo,... Tiếp tục lên cao nữa, bạn sẽ được tham gia vào ban lãnh đạo, nơi bạn sẽ chịu trách nhiệm định hướng, phân tích cơ hội, thách thức,... Và cứ thế tiếp tục lên cao nữa.

Tôi nghe người ta mô tả về nấc thang nghề nghiệp trên ngay từ khi bước chân vào khoa Công nghệ thông tin trường Đại học Bách Khoa. Lúc tôi đi dự phỏng vấn ở các công ty phần mềm, người ta lại nói về nó. Khi tôi đã đi làm và trong các buổi đánh giá thành tích (performance appraisal), người ta cũng lại nói về nó. Đến khi tôi rời khỏi công ty, người ta vẫn lại nói về nó. Cho đến gần đây khi tôi có dịp trở lại trường đại học Bách Khoa, tôi lại vẫn thấy người ta tiếp tục nói về nó!

Tôi thấy quan niệm đó có gì đó mẫu thuẫn và hơi buồn cười. Vì sao vậy? Tôi xin nêu ra một số lý do sau.

1) Vị trí phía trên không phải là hình thức cao hơn của vị trí phía dưới

Điều kỳ diệu nhất của con người so với những sinh vật khác là khả năng tiến hóa và phát triển. Chúng ta biết rằng các loài đều tiến hóa từ hình thức cấp thấp lên hình thức cấp cao. Người ta gọi đó là một phần của sự phát triển.

Nhưng nghề nghiệp của chúng ta thì lại không phát triển theo cách như vậy được. Thử lấy ví dụ về công việc của người kiểm thử phần mềm (tester) và lập trình viên. Rất nhiều người quản lý mắc phải sai lầm thô thiển khi cho rằng lập trình viên là “hình thức cao hơn” của tester. Điều đó có nghĩa là, nếu một nhân viên hơi yếu về kỹ năng lập trình, cách tốt nhất là đưa người đó vào vị trí tester. Đến khi nào người đó thể hiện tương đối tốt công việc của tester, ta sẽ thăng cấp cho người đó lên vị trí lập trình viên.

Thực sự thì tester và lập trình viên đòi hỏi hai loại người hoàn toàn khác nhau. Những người lập trình viên giỏi là những người đặc biệt yêu thích sự chặt chẽ, sự hiệu quả, và những vấn đề hóc búa (có thể đọc cuốn “Làm thế nào để dịch chuyển núi Phú Sĩ?” để biết rõ những người lập trìnn viên xuất sắc nhất thế giới thích giải quyết những câu đố hóc búa cỡ nào; tuy nhiên chú ý là bản dịch sang tiếng Việt hơi bị kém.) Khả năng đó giúp cho họ hiểu được một bài toán trừu tượng và cụ thể hóa nó bằng các dòng lệnh máy tính trong thời gian ngắn nhất, với độ chính xác cao nhất.

Nhưng nếu có dịp gặp gỡ những tester xuất sắc, bạn sẽ thấy họ hoàn toàn khác biệt. Họ đặc biệt giỏi trong các bài toán tổ hợp (vd: với những điều kiện này thì có bao nhiêu tình huống có thể xảy ra); họ rất ghét phải làm đúng theo một quy trình các bước đã định sẵn (họ luôn tò mò chuyện gì sẽ xảy ra nếu ta bỏ qua bước này, nếu ta đổi ngược thứ tự hai bước kế tiếp nhau); và họ có một niềm đam mê, có thể nói là đến mức bệnh hoạn, trong việc tìm ra chỗ sai sót của mọi việc (những tester xuất sắc luôn vui mừng vì chứng minh sản phẩn bị lỗi, và cảm thấy rất khó chịu khi phải chấp nhận rằng sản phẩm không còn lỗi, trong khi người bình thường thì ngược lại).

Điều đấy cho thấy rằng không có dấu hiệu gì để bảo đảm một tester xuất sắc sẽ có thể trở thành một lập trình viên xuất sắc. Cũng không có lý do gì để cho rằng lập trình là công việc đòi hỏi kỹ năng cao hơn so với kiểm thử.

Cũng cách nhìn nhận như vậy, ta sẽ thấy rằng system analysis không phải là hình thức cao hơn của developer, manager không phải là hình thức cao hơn của system analysis, và director không phải là hình thức cao hơn của manager,... Ở mỗi cặp so sánh như vậy, thành công ở vị trí đầu tiên không thể bảo đảm sẽ thành công ở vị trí tiếp theo.

Để dễ hình dung, chúng ta hãy nói đến bóng đá. Hồi còn nhỏ, tôi và các bạn vẫn có suy nghĩ ấu trĩ giống như trên khi chơi bóng đá. Những đứa giỏi nhất (hoặc có uy nhất) sẽ được đá ở trên hàng tiền đạo, kém hơn một ít thì đã ở giữa làm tiền vệ, ai không có chút khéo léo và khả năng thì cho làm hậu vệ, còn đứa nào tệ nhất thì đẩy xuống làm thủ môn.

Đội bóng đó đã thi đấu thế nào? Hoàn toàn thất bại. Chúng tôi có thủ môn tầm thường, các hậu vệ tầm thường, tiền vệ cũng tầm thường, và tiền đạo cũng tầm thường nốt. Ai cũng không cảm thấy thoải mái ở vị trí của mình cả, nghĩ rằng mình không thể phát huy hết khả năng ở đây. Vì vậy chẳng ai thực sự thi đấu cả, nhất là những đứa phía dưới. Đứa nào cũng hau háu lao lên để ghi bàn hoặc thể hiện kỹ thuật cá nhân, mong có lúc nào đã sẽ được nhìn nhận lại để được xếp ở vị trí phía trên.

Rất nhiều công ty phần mềm đang ở vào tình trạng giống như đội bóng của chúng tôi trước kia. Hiện tượng là khác nhau, nhưng bản chất của vấn đề là một.

2) Một cuộc đua vô nghĩa

Khi thiết kế ra những nấc thang nghề nghiệp kia, người ta đã vô tình đẩy mọi nhân viên vào một cuộc đua vô nghĩa và rất thiếu tính nhân bản. Tất cả những người mới bắt đầu sẽ đứng ở nấc thang thấp nhất. Trong những người này, ai giỏi hơn sẽ được bước lên nấc thang cao hơn. Nấc thang càng ở trên cao thì chỗ cho những người ở đó cũng càng ít đi. Bạn nghĩ sao? Một sự canh tranh rất tốt cho sự phát triển?

Nhìn bề ngoài thì có vẻ như vậy. Nhưng thực sự bên trong thì không giống như vậy. Hãy nghe câu chuyện của hai người sau đây để có thể hiểu vì sao như vậy.

Anh K. là một lập trình viên xuất sắc khi vào làm cho công ty phần mềm X. Anh có một niềm đam mê mãnh liệt với công việc lập trình, và chỉ trong nửa năm tài năng đặc biệt của K. đã được mọi người thừa nhận. Manager của K., lo lắng rằng có thể mất K. vào các công ty khác và cũng muốn giúp K. phát triển nghề nghiệp, liền đề nghị thăng chức cho K. lên vị trí trưởng nhóm lập trình. Vẫn với đà tiến triển như vậy, sau gần hai năm K. lại bước thêm lên được nấc thang cao hơn nữa: project manager. Mọi chuyện tồi tệ bắt đầu từ đây. Ở vị trí này, K. sớm nhận ra mình thiếu quá nhiều thứ để trở thành nhà lãnh đạo giỏi: kiến thức, kinh nghiệm, tài năng,... K. cảm thấy mọi thứ đều trì trệ. K. cảm thấy bị lạc lối. K. cảm thấy không còn nhiệt tình khi làm công việc hiện tại nữa. K. cảm thấy công việc thật bế tắc. Dù lãnh đạo công ty đã tạo điều kiện cho K. tham dự các khóa đào tạo về quản lý, K. vẫn không thấy tình hình khá hơn. Kiến thức có thể học được, kinh nghiệm có thể tích lũy theo thời gian, nhưng như vậy thì chưa đủ. K. hiểu rằng mình không có tài năng lãnh đạo: anh không có khả năng trình bày tốt, không có khả năng ra quyết định khi không có đầy đủ thông tin,...

Cấp trên động viên K. rằng nếu cố gắng thì K. sẽ sớm khắc phục được những khiếm khuyết đó. Nhưng K. thì không tin rằng như vậy. K. hiểu rằng mình thiếu yếu tố cơ bản nhất để làm được những điều đó: K. không hề có sự đam mê công việc quản lý. Không có đam mê, anh không thể thấy được mình muốn gì, sẽ đi về đâu, và không hề có đủ sức mạnh để vượt qua những khó khăn và cám dỗ xung quanh. Đào tạo hoặc kinh nghiệm thì không thể giúp gì để tạo ra niềm đam mê.

K. cảm thấy thời gian đang kéo dài ra. K. cảm thấy chán nản với công việc. K. cảm thấy không hài lòng với nấc thang hiện nay mình đang đứng. K. muốn có sự mới mẻ, tiến bộ và phát triển. Ban lãnh đạo thấy điều đó và lại động viên: K. cần cố gắng hoàn thiện một số mặt nữa để có thể rời nấc thang hiện tại và bước lên nấc thang cao hơn nữa.

Và K. thấy thất vọng tràn trề. Không, anh không còn muốn bước lên nấc thang kế tiếp nữa. Ngay cả nấc thang cao nhất ở trên cùng cũng không còn hấp dẫn đối với anh nữa. Anh đã bước qua nhiều nấc thang trong thời gian quá ngắn để rồi chợt nhận ra rằng mình đã bước đi quá xa. Càng lúc anh càng xa rời những việc anh yêu thích nhất, những việc mà anh có thể phát huy hết khả năng của mình, những việc luôn kích thích anh phát triển và học hỏi nhiều hơn. Đáng buồn thay, đó là những công việc ở nấc thang phía dưới nơi anh đứng.

Nhưng K. không thể bước xuống được. Không ai có thể từ vị trí project manager lại chuyển xuống làm developer được. Và K. cũng không muốn bước xuống nữa. Ở những nấc thang phía dưới giờ chỉ còn lại những người có khả năng lập trình tầm thường và khả năng lãnh đạo cũng tầm thường, những người không có chút đam mê với công việc, những người cũng mất phương hướng như anh.

K. không biết đi đến đâu từ vị trí hiện tại của mình. Bi kịch của K. là rất phổ biến, và cũng chính vì vậy mà tôi lấy đó làm tiêu đề của bài viết.

Cái hệ thống phát triển nghề nghiệp trên đã tàn nhẫn đẩy K. và những người khác vào một cuộc đua hoàn toàn vô nghĩa cho chính bản thân họ. Nó luôn thúc mọi người tiến lên và tiến lên một cách mù quáng; càng bước lên cao, họ càng nhận ra nó thật vô nghĩa đối với bản thân. Cái gì vô nghĩa với từng nhân viên thì sớm muộn cũng sẽ hoàn toàn vô nghĩa với công ty.

K. sẽ không bước lên nấc thang kế tiếp, dù công ty có làm mọi cách. Anh cũng sẽ không bước xuống nấc thang bên dưới. Và anh chỉ có một chọn lựa thực sự: nhảy ra khỏi cái thang đó.

Câu chuyện thứ hai.

T. đã từng là một sinh viên đầy năng động và có khả năng phân tích, đánh giá vấn đề cực kỳ xuất sắc. Cô yêu thích công việc phân tích thiết kế hệ thống và mong muốn theo đuổi nghề đó thật lâu dài. Nhưng khi vào công ty F., người ta đánh giá rằng vì kinh nghiệm lập trình của T. còn ít, nên tốt nhất cô nên bắt đầu từ vị trí tester. Sau một thời gian nếu có tiến bộ, cô sẽ được đưa lên làm lập trình viên, rồi nếu vẫn làm tốt, cô sẽ có đủ khả năng và kinh nghiệm để làm phân tích viên. T. vui vẻ chấp nhận đề nghị này.

Gần hai năm trôi qua và T. vẫn làm tester ở công ty đó. Dĩ nhiên là cô thất vọng. Cô thấy mình bị mắc kẹt ở phía dưới. Người ta vẫn nhắc nhở T. trong những buổi đánh giá nhân viên rằng T. cần vượt qua hai nấc thang trước khi đến được vị trí mình mong muốn. Nhưng T. không thể bước lên được. Chỉ có một số người được bước lên nấc thang kế tiếp từ vị trí hiện tại. Những người sớm phát huy khả năng trong công việc kiểm thử đã bước lên trước T. hết rồi. Cô không thể cạnh tranh với họ được, đơn giản bởi vì khả năng testing của cô không thể bằng họ. Người ta tiếp tục khuyến khích T. nâng cao các kỹ năng và kinh nghiệm testing, lập trình để được trở thành phần tích viên!!! T. thấy buồn cười và mất tự tin. T. không còn thấy kiên nhẫn với công việc và công ty nữa. Gia đình và bạn trai của của cũng không còn kiên nhẫn được nữa. Cũng như K. cô cũng nhảy ra khỏi cái thang đó.

Chúng ta đều biết cái thang và từng nấc thang của nó vô nghĩa như thế nào. Nhưng không ai nói điều đó với chúng ta cả. Chúng ta vẫn vẽ nó ra để động viên nhau, và động viên chính chúng ta. Nhưng không sớm thì muộn, chúng ta sẽ biết nó thật ngốc nghếch.

Nó vô nghĩa vì chẳng có ai có thể bước hết tất cả các bậc, từ bậc thấp nhất lên bậc cao nhất được. Nếu có ai đó có thể làm được điều đó, thì tôi không thể hình dung được một người hoàn hảo đến thế. Tôi đã thử tìm hiểu tiểu sử của rất nhiều những nhân vật kiệt xuất và thành đạt trong lĩnh vực của mình, và nhận ra rằng không có ai hoàn hảo đến vậy.

Nó vô nghĩa bởi vì nó ép chúng ta vào một cuộc đua mà cuối cùng tất cả những người tham gia đều là kẻ bỏ cuộc. Nó buộc chúng ta nếu muốn phát triển thì phải tiến lên. Khi tiến lên có nghĩa chúng ta phải rời bỏ vị trí mà chúng ta ưa thích và có thể tiến bộ, để bước vào một địa hạt mà chúng ta hoàn toàn lạ lẫm và không có dấu hiệu gì cho thấy sẽ tiến bộ.

Những người trong ngành đều đã được nghe về chuyện của K. và T., nhưng không biết kết thúc của câu chuyện là thế nào. Tôi cũng không biết bây giờ họ ra sao. Một số người nói rằng sau khi nhảy khỏi cái thang đó, K. trở thành một lập trình viên tự do. Người khác nói rằng K. đã đổi nghề. Có người thì thấy T. lập gia đình và theo chồng định cư ở nước ngoài rồi học lên cao. Lại có người cho rằng T. đã trở thành nữ chủ doanh nghiệp của riêng mình.

Nhưng tôi tin rằng, dù ở nơi nào đó, và dù đang làm nghề gì, nếu được hỏi về câu chuyện những nấc thang nghề nghiệp, cả hai sẽ đều cười và nói rằng không bao giờ muốn trở lại với nó nữa.

3) Triệt tiêu những cá nhân xuất sắc


Dĩ nhiên cũng có một số người có thể trèo lên những nấc thang thật cao trong một thời gian rất ngắn. Hiện nay ở Việt Nam điều đó ngày càng xuất hiện nhiều. Chúng ta không còn thấy lạ nếu biết được có người chưa đầy 30 tuổi đã trở thành senior manager, thậm chí là director của những công ty lớn.

Trở thành senior manager khi chưa đầy 30 tuổi có nghĩa là gì?

Có nghĩa là người đó chỉ cần trải qua chừng 1-2 năm ở mỗi nấc thang: developer, team leader, manager,... (Dĩ nhiên có một số ít người đã đi làm từ trước khi tốt nghiệp đại học, nhưng đó không phải là đa số) trước khi bước được lên nấc thang kế tiếp.

Tôi thấy nghi ngờ về điều này. Có lẽ ở Việt Nam chúng ta đã quá dễ dãi trong việc đánh giá năng lực con người. Tôi may mắn có dịp biết được một số lập trình viên làm việc trong các công ty ở Mỹ (họ là công ty đối tác của công ty tôi), và đã từng bị sốc khi biết rằng họ đều ngoài 50 tuổi. Họ làm lập trình viên đã được hơn 20 năm, có nghĩa là tuổi nghề của họ còn lớn hơn tuổi đời của tôi! Ồ, đừng nghĩ rằng họ là những nhân viên kém cỏi nên mới ở mãi vị trí đó. Xét về năng lực, kinh nghiệm và kiến thức, có lẽ tôi chưa quen ai ở Việt Nam có thể sánh được với họ.

Nhân viên ở Nhật cũng cần 10 đến 15 năm làm công việc chuyên môn trước khi được xem xét để thăng chức. Ở Microsoft, lập trình viên cũng có 4-5 năm làm việc trở lên.

Trong nghiên cứu mang tên Dự án Phát triển tài năng, tiến sĩ Benjamin Bloom của trường đại học NorthWestern đã tìm hiểu quá trình phát triển của những cá nhân xuất sắc trong nhiều lĩnh vực khác nhau. Kết luận được ông đưa ra là những người đó trung bình mất từ 10 đến 18 năm để đạt đến thành tựu cao nhất trong lĩnh vực của mình. Nghĩa là ngay cả những cá nhân kiệt xuất nhất trên thế giới (nghiên cứu đó đánh giá họ có trình độ world-class), cần không dưới 10 năm để đạt đến đỉnh cao trong lĩnh vực của họ. Chú ý rằng lập trình viên, quản lý, hoặc kinh doanh là những lĩnh vực hoàn toàn khác nhau. Nghiên cứu của tiến sĩ Benjamin không hề nói rằng cần mất trên 10 năm để con người vươn lên vị trí lãnh đạo cao nhất.

Đây là một sự tai hại nữa của cái thang nghề nghiệp. Nó khiến cho chúng ta không thấy được đỉnh cao trong từng công việc, ngược lại nó làm cho chúng ta vội vã tìm cách thể hiện mình vừa đủ tốt trong nấc thang hiện tại để được bước lên cao. Và đến lúc nào đó, như anh K. chẳng hạn, chúng ta sẽ sớm nhận ra chúng ta đã bước đi quá xa, đến nỗi chúng ta không thể quay lại, đồng thời chúng ta đã không còn hứng thú gì nữa với những nấc thang phía trên nữa. Cái gì đến quá dễ thì ra đi cũng dễ dàng như vậy.

Có thể đây là sản phẩm của những người làm công tác nhân sự chăng? Trong nỗ lực tìm ra cách giúp mọi nhân viên phát triển nghề nghiệp, họ đã vô tình bắt mọi người phải leo thang! Và sau quá trình leo thang mệt mọi như vậy, chúng ta sẽ thấy một số ít người ở trên cao có khả năng làm tốt được nhiều việc, nhưng chẳng có việc gì xuất sắc. Còn phần lớn mọi người thì ở bên dưới, bất mãn và buồn chán vì không thấy mình tiến bộ. Những người ở giữa thì hoang mang và mất phương hướng.

Bạn cần chú ý cách dùng từ ở đây, cần phải thấy được sự khác biệt giữa tốt (good) và xuất sắc (excellent, hoặc great). Tôi tin một số người chỉ cần mất 1-2 năm để làm tốt một số việc nào đó, nhưng để đạt được mức độ xuất sắc thì không thể.

Tôi sẽ không ngạc nhiên nếu càng về sau chúng ta càng có ít những người xuất sắc, những người giữ vị trí hàng đầu trong lĩnh vực của họ. Thiếu những người đó, chúng ta sẽ không thể phát triển xa được. Tôi cũng không ngạc nhiên nếu một ngày nào đó, mọi người lại tiếp tục xuýt xoa về loạt bài báo: những người leo thang số 1 Việt Nam. Có những người leo thang như vậy, chúng ta sẽ mãi ì ạch thua xa những nước khác.

Điều này sẽ rất khó thay đổi, vì càng ngày càng có nhiều người tham gia vào cuộc đua leo thang. Và những nấc thang thì càng lúc càng nhiều ra. Tôi được biết có công ty lúc mới thành lập thì chỉ có 3 nấc thang: developer, team leader, và boss. Nhưng sau đó thì họ có thêm nấc manager ở giữa team leader và boss. Rồi consultant ở giữa team leader và manager. Rồi senior developer ở giữa developer và team leader. Rồi thêm senior manager. Lần gần đây nhất khi xem trên website của công ty thì tôi thấy đã có thêm director. Tôi nghĩ số nấc thang sẽ không dừng lại ở đây.

Đây là điều rất nguy hiểm. Với sự phát triển vô độ như vậy, chẳng mấy chốc các công ty sẽ giống như một anh chàng ốm nhách và cao kêu. Ai cũng được quản lý một số người phía dưới của mình. Tướng nhiều nhưng quân thì ít. Một số người bên dưới phải lao động vất vả cho số lượng rất nhiều người bên trên. Quá nhiều người tầm thường ở các cấp quản lý trung gian. Mọi người sẽ phí nhiều thời gian cho việc họp hành, báo cáo, kế hoạch, đánh giá, khen thưởng,... nên sẽ ít thời gian cho những công việc thực tế (viết code, kiểm tra, tạo quan hệ tốt với khách hàng,...)

Tư duy lập trình

Không bao giờ sợ phải bắt đầu.
Tôi sẽ không viết hai lần cùng một đoạn mã giống nhau.
Khi phát triển phần mềm, hãy nghĩ đến tương lai.
Viết mã càng ít bao nhiêu ,mắc lỗi càng ít bấy nhiêu.
Bạn sẽ không bao giờ trở thành một lập trình viên giỏi nếu chỉ tập luyện 2 giờ mỗi ngày.
Tất cả các công việc đều có phần thú vị và phần buồn chán, không có ngoại lệ.
Kẻ thù số một của các lập trình viên là gì? Kiêu căng.
Lập trình viên sử dụng hầu hết thời gian của mình vào việc sửa lỗi. Chương trình càng dễ đọc bao nhiêu càng tiết kiệm thời gian bấy nhiêu.
Trường học khiến các bạn tin rằng chương trình của bạn chỉ cần thỏa mãn một mình bạn là đủ. Điều này hoàn toàn sai lầm. Chương trình phải thỏa mãn khách hàng và các lập trình viên khác.


Giới thiệu
Thế là bạn nghĩ rằng lập trình là một thế giới vô cùng thú vị, và bạn muốn tham gia vào thế giới ấy? Trước khi bạn bắt đầu, điều duy nhất mà tôi muốn khuyên là: nếu bạn thực sự yêu thích lập trình thì đó rõ ràng là công việc tốt nhất mà bạn có thể có được. Ngược lại, nếu bạn chỉ cảm thấy thích, hay không quan tâm lắm đến lập trình, thì đó rõ ràng là công việc tồi tệ nhất của bạn. Bởi vì bạn đang gia nhập vào một thế giới mà sự cạnh tranh luôn là nỗi ám ảnh không thể tránh khỏi. Phát triển phần mềm gần như là một cuộc đua tranh. Trong đó, cuộc sống của bạn là một con đường và bạn phải chạy càng nhanh càng tốt, không cần biết dưới chân có gì, cho đến khi gặp đồng bằng hoặc là đụng phải vách đá cheo leo. Nếu bạn sẩy chân, mọi thứ kết thúc, và đó hoàn toàn là lỗi của bạn. Nghe có vẻ hơi ghê gớm đúng không? Nhưng đừng để những điều đó làm bạn nản lòng. Tôi chỉ không muốn vẽ nên một viễn cảnh tươi đẹp, nơi có những cánh đồng xanh ngút ngàn và những đám mây lững lờ trôi trên nền trời xanh thẳm. Thực tế là có thể chỉ vài phút sau đó trời sẽ mưa và bạn thì chẳng mang theo dù. Thế nhưng, chính những điều không chắc chắn, những thách thức và áp lực sẽ làm cho cuộc sống trở nên đầy hứng thú.
Bạn vẫn còn đọc đến đây ư? Rất tốt, thế có nghĩa là bạn hoàn toàn nghiêm túc về điều này. Bây giờ điều tôi sẽ nói với bạn là một bản phác thảo về những gì đang chờ đợi bạn trong thế giới lập trình, chúng ta sẽ nói một ít về kỹ thuật và cả những niềm vui của thế giới ấy.

Bạn cần gì để trở thành một lập trình viên?
Tôi không nghĩ rằng có một vài yêu cầu khó khăn nào đó khiến bạn không thể trở thành lập trình viên, tôi chỉ đơn giản nghĩ rằng bất cứ ai có một ít (hay rất nhiều) mong muốn đều có thể trở thành lập trình viên. Vấn đề chỉ là bạn dành ra bao nhiêu thời gian. Điều đó có nghĩa là tôi nghĩ có nhiều quan niệm sai lầm về những kỹ năng cần có để trở thành lập trình viên. Trước tiên, bạn không cần phải thật xuất sắc trong môn Toán, bạn chỉ cần có khả năng hiểu được những điều cơ bản. Dĩ nhiên là có những ngoại lệ, nếu bạn có hứng thú trong lĩnh vực đồ họa hay lập trình game thì một kiến thức Toán vững vàng sẽ giúp bạn rất nhiều. Một quan niệm sai lầm khác là bạn cần phải là thiên tài logic. Nói chung, điều đó không phải là bắt buộc, dĩ nhiên tư duy logic càng tốt thì càng dễ dàng hơn khi tiếp cận thế giới lập trình. Vậy thì kỹ năng nào là cần thiết? Bị thúc đẩy bởi những thách thức là yếu tố quan trọng nhất. Đơn giản là vì bạn đang tham gia vào một trò chơi trong đó thách thức xuất hiện trong mọi ngõ ngách. Một điều quan trọng khác là phải không ngừng theo đuổi mục tiêu, nhưng vẫn phải luôn uyển chuyển để không đuổi theo một cách mù quáng những mục tiêu xa vời.

Còn trường học thì sao?
Trường học là nơi tuyệt vời để học mọi thứ ngoại trừ công nghệ. Đừng cho là tôi sai, tôi không nói rằng tôi nghĩ trường học là không quan trọng. Ngược lại, tôi nghĩ trường học là rất quan trọng, nhưng không phải để học lập trình. Những gì bạn nên tập trung thật sự ở trường là học cách để làm việc với những người khác trong một đề án. Cũng như học cách những người xung quanh giải quyết vấn đề và cách thức giải quyết của họ khác cách của bạn ở chỗ nào. Trường học thường bắt bạn phải làm những thứ có thể bạn không thích. Chẳng hạn, tôi nhớ lúc tôi học môn “Thiết kế trình biên dịch”, tôi tự nhủ: “Thật là mất thời gian một cách vô ích, tôi chẳng bao giờ cần phải thiết kế trình biên dịch làm gì”. Nhưng, điều tôi đã học được là làm thế nào để giải quyết những vấn đề hoàn toàn khác nhau, và kiến thức này giúp tôi làm được nhiều việc khác.

Một trong những thuận lợi bạn có được từ trường học là bạn có thể gặp gỡ bạn bè có cùng chí hướng và có thể sau này trở thành đồng nghiệp của bạn. Ngành công nghiệp phần mềm ở nhiều khía cạnh rất giống với ngành công nghiệp điện ảnh, khi có ai đó bị lôi cuốn vào một đề án đầy tham vọng, họ thường mời bạn bè cùng hợp tác. Nếu bạn không biết họ từ trước, bạn sẽ không thể mời (hay thuê), và trong nhiều trường hợp, trường học chính là nơi bạn có thể tìm được những người có cùng sở thích. Một khía cạnh khác không thể bỏ qua là trường học không chỉ dạy về kỹ thuật mà còn dạy về lịch sử, về tâm lý,… Và trong khi những thứ ấy có vẻ không liên quan trực tiếp đến lập trình, bạn có thể sẽ rất ngạc nhiên nếu biết rằng đó cũng là một trong những nguồn cảm hứng mà tôi từng có. Tôi nên bắt đầu từ đâu?

Trước tiên, tôi khuyên là bạn nên cân nhắc cẩn thận trước khi có một quyết định quan trọng. Như tôi đã nói, thế giới lập trình có thể rất lý thú, nhưng cũng đầy gian nan. Do đó, đừng bao giờ nhảy bổ vào mà không suy nghĩ kỹ. Việc đầu tiên cần làm dĩ nhiên là tìm mua một cuốn sách dạy lập trình. Nhưng có quá nhiều sách và quá nhiều ngôn ngữ. Tôi khuyên bạn nên chọn một trong các ngôn ngữ
sau: C, C++, Visual Basic, Pascal (Delphi) hay Java. Khoan hãy nghĩ đến những ngôn ngữ khác, bởi vì chúng hoặc là quá phức tạp cho người mới bắt đầu hoặc là quá đơn giản để có thể đưa bạn vào thế giới lập trình. Nhưng dù thế nào thì bạn cũng nên chọn một ngôn ngữ vào thời điểm này. Những ngôn ngữ này rất giống nhau, và vô cùng mạnh mẽ. Hầu như mọi ứng dụng thương mại đều có thể được viết bởi một trong những ngôn ngữ trên. Phương pháp của tôi là chọn 2 quyển sách cho mỗi ngôn ngữ đã nêu ở trên. Đọc sơ qua trước, và chú ý các ví dụ, mã nguồn trong đó. Sau khi đã đọc sơ qua tất cả các quyển sách đã chọn, hãy chọn quyển sách gây cho bạn nhiều hứng thú nhất. Và ngôn ngữ mà quyển sách đó đề cập chính là ngôn ngữ bạn nên học đầu tiên. Bây giờ hãy chọn thêm vài quyển sách về ngôn ngữ đó, mỗi quyển, bạn hãy đọc một phần chương đầu tiên, bạn có cảm thấy quan tâm đến nó không? Nếu không, hãy bỏ quyển sách ấy và chọn một quyển khác; nếu có, hãy lật đến giữa quyển sách và một phần chương mà bạn bắt gặp, vẫn cảm thấy quan tâm đến quyển sách ấy đúng không? Tốt, đó là quyển sách có thể bạn sẽ chọn. Đừng cố hiểu nó viết cái gì, chỉ cần tìm hiểu xem nó có mang đến cho bạn sự quan tâm về ngôn ngữ đó hay không. Tiếp tục phương pháp này cho đến khi không còn quyển sách nào cả, bạn có thể tìm được quyển sách gây cho bạn nhiều hứng thú nhất để học ngôn ngữ đó.

Những công cụ cần thiết
Hãy nhìn thẳng vào vấn đề, chọn đúng công cụ sẽ làm cho công việc trở nên dễ dàng hơn. Điều này càng chính xác hơn trong lĩnh vực phát triển phần mềm. Có thể Microsoft đã tạo ra môi trường phát triển tốt nhất, Microsoft Developers Studio. Do đó, nếu bạn dùng C/C++, Visual Basic,… thì có lẽ đây sẽ là thứ bạn cần. Tuy nhiên, vẫn có nhiều công cụ thay thế miễn phí khác cho những ngôn ngữ này. Bạn có thể kiểm tra thử nếu thích.
Một công cụ khác cũng rất quan trọng, đó là trình soạn thảo mã lệnh (code editor). DevStudio có một trình soạn thảo mã lệnh tích hợp sẵn, và đó là một trong những lý do khiến nhiều người dùng nó. Cá nhân tôi không thích bị ràng buộc bởi một môi trường phát triển nào. Do đó, tôi thích dùng công cụ soạn thảo MultiEdit. Tôi đã sử dụng nó trong nhiều năm. Và tôi rất tự hào khuyên những ai muốn tìm một công cụ thay thế cho DevStudio hãy dùng nó.

Hãy là người lạc quan
Tôi từng nghe người ta nói rằng kẻ lạc quan nhất trên thế giới chính là nhà phát triển phần mềm. Trong suy nghĩ của họ, không có phần mềm nào là không thể viết được. Một ví dụ nhỏ, bạn hãy vào thử một site download phần mềm nào đó mà xem. Có hàng trăm hàng ngàn phần mềm bao gồm mọi lĩnh vực. Làm thế nào mà người ta có thể sáng tạo ra từng ấy phần mềm. Chúng nhiều và tốt đến nỗi bạn không thể nghĩ ra nên sáng tạo thêm phần mềm nào. Thế nhưng từng ngày từng giờ, các nhà phát triển phần mềm luôn sáng tạo và cho ra nhiều phần mềm mới hơn nữa, những phần mềm mà đã có thời người ta cho là không thể tạo ra được. Dù sao thì lạc quan mấy cũng phải có giới hạn. Mấu chốt của vấn đề là họ không nhìn mọi thứ một cách tổng thể, mà ở từng phần cụ thể. Ở một chừng mực nào đó, có thể xem đấy là đặc trưng của ngành thiết kế phần mềm, chia dự án ra thành những phần nhỏ và giải quyết từng phần. Nếu bạn không phân phối thời gian hợp lý, bạn sẽ không thể nào hoàn thành công việc. Khi bạn bắt đầu viết chương trình “thực sự” đầu tiên (nghĩa là chương trình có thể thực hiện được một công việc nào đó cần thiết cho mọi người, không phải cho riêng bạn), phải chắc chắn rằng bạn dành đủ thời gian để vạch ra kế hoạch về những việc bạn định làm, thứ tự thực hiện, và kết quả cuối cùng là gì. Nếu bạn làm điều này, bạn sẽ thấy mọi thứ trở nên dễ dàng hơn và có thể hoàn thành nhanh hơn là bạn nghĩ.

Hãy làm việc theo nhóm!
Nếu bạn dự định trở thành một lập trình viên đơn độc, hãy suy nghĩ lại. 99,9% các dự án đòi hỏi phải làm việc theo nhóm. Và do đó, bạn cần phải có kinh nghiệm làm việc theo nhóm, phối hợp với những người khác trong một dự án. Một khi bạn đã hoàn thành những dự án nhỏ của riêng mình, đó là lúc bắt đầu tìm cách tham dự vào một dự án có nhiều người tham gia. Đó có thể là một game, một bản demo, hay bất cứ thứ gì. Chỉ cần đó là dự án làm bạn quan tâm. Có nhiều các để tìm dự án, bạn có thể gia nhập vào những dự án đã có, tìm kiếm những nhóm vừa mới thành lập và xin gia nhập, hay thậm chí tự lập một dự án và mời người khác cùng cộng tác. Điều quan trọng nhất là bạn phải học cách làm việc cùng với những người khác để thực hiện mục tiêu chung.

Những thứ nên đọc!
Đọc sách là nguyên tắc cơ bản… Và điều này càng chính xác trong ngành phát triển phần mềm. Nếu bạn là người không thích đọc sách, có lẽ bạn nên chọn một công việc khác. Bởi vì đọc sách chính là chìa khóa để củng cố và hiện thực hóa những tiềm năng của bạn. Bạn có thể tự hỏi vì sao tôi có thể viết nhiều phần mềm trong thời gian ngắn như thế? Có 3 lý do chính: kinh nghiệm, những đồng nghiệp tài năng mà tôi luôn hài lòng khi được làm việc chung và cuối cùng là những quyển sách tôi đã đọc. Tôi không thể giúp bạn có được kinh nghiệm và những bạn đồng nghiệp giỏi, nhưng tôi có thể giới thiệu cho bạn những quyển sách hay:

Code Complete, ISBN: 1-55615-484-4.
Đây là quyển sách cần thiết cho mọi nhà phát triển phần mềm, bất kể họ đang dùng ngôn ngữ lập trình nào. Nó bao gồm nhiều bài thực hành và nhiều kỹ thuật liên quan đến phong cách viết mã.

Rapid Development, ISBN: 1-55615-900-5.
Quyển sách này hướng đến việc lập kế hoạch cho một dự án, tập trung vào những lỗi tiềm ẩn có thể mắc phải,… Đây là quyển sách cho bạn biết thế giới thực sự của ngành phát triển phần mềm.

Dynamics of Software Development, ISBN: 1-55615-823-8.
Quyển sách này có một hướng tiếp cận khác, tập trung vào việc làm việc theo nhóm và động lực của việc lập trình. Đây là điều thỉnh thoảng bị xem nhẹ, và hậu quả có thể được thấy trong nhiều dự án bị thất bại.

The Mythical Man-Month, ISBN: 0-201-83595-9.
Đây thực sự là một quyển sách nên đọc. Dù rằng nó đã được viết cách đây hơn 20 năm, thế nhưng vẫn có nhiều điều có thể áp dụng.

Programming Windows, ISBN: 1-57231-995-X.
Nếu bạn có ý định lập trình trên Windows (bằng C hay C++), bạn cần phải mua quyển sách này. Theo tôi đây là quyển sách dạy lập trình Windows tốt nhất.

The Art of Ware, ISBN: 1-55851-396-5.
Tôi là một người hâm mộ cuồng nhiệt Tôn Tử, do đó tôi rất thích thú khi đọc quyển sách này. Đây là một quyển sách có phong cách viết rất lôi cuốn, với những bài học trong binh pháp Tôn Tử được vận dụng vào ngành phát triển phần mềm.

Tổng kết
Hy vọng tôi đã nêu được một số điều cần thiết để trở thành một lập trình viên, không phải về mặt kỹ thuật mà là về mặt tư duy. Cá nhân tôi cho rằng lập trình là một công việc đầy hứng thú. Không có gì vui hơn khi nhìn thấy ai đó đang sử dụng phần mềm do bạn viết để làm cho cuộc sống của họ tốt hơn, dù chỉ là một phần nào đấy. Do đó, nếu bạn quyết định theo đuổi ngành phát triển phần mềm, tôi xin chúc bạn may mắn và hy vọng một ngày nào đó tôi sẽ có dịp download phần mềm do bạn viết để sử dụng.

Thứ Ba, 29 tháng 7, 2008

Những hệ điều hành khá giống Ubuntu

Đi kèm với Ubuntu là những phiên bản hệ điều hành tương tự. Trong đó, bên cạnh phần lớn những điểm chung về nhân hệ điều hành, kiến trúc hệ thống và các ứng dụng nền tảng, mỗi phiên bản đều có những nét riêng Vì vậy, nếu có cơ hội khảo sát tất cả các hệ điều hành “Like” Ubuntu, chúng ta sẽ dễ dàng chọn lựa một phiên bản phù hợp với yêu cầu học tập, làm việc và nghiên cứu của mình.

1. Bắt đầu với Edubuntu : một phiên bản có nguồn gốc từ Ubuntu, được tùy biến để phù hợp với mục tiêu giáo dục. Sản phẩm này đang được sử dụng phổ biến trong các trường ở cấp tiểu học và trung học trên thế giới.



Edubuntu bao gồm một số lượng lớn các ứng dụng được dùng trong các nhà trường như GCompris, KDE Edutainment Suite, và Schooltool Calendar. Hệ điều hành này ra đời nhằm mục đích giúp cho thầy cô giáo/giảng viên dễ dàng xây dựng các bài giảng, thiết kế môi trường học tập trực tuyến với những hình ảnh, biểu đồ trực quan sinh động trong khoảng thời gian ngắn mà không yêu cầu cao về kiến thức và kỹ năng kỹ thuật.

Edubuntu sử dụng môi trường đồ họa GNOME cho giao diện của mình, với yêu cầu hệ thống PC có cấu hình tối thiểu là: đĩa cứng dung lượng 2.5 GB, bộ vi xử lý tốc độ 1 GHz và bộ nhớ RAM 256 MB. Bạn có thể truy cập vào địa chỉ
http://www.edubuntu.org/Download để download.

2. Tiếp theo là Kubuntu : Phiên bản này sử dụng môi trường đồ họa KDE thay cho GNOME. Bên cạnh sự tương đồng về kiến trúc, Kubuntu đồng thời cũng sử dụng chung các repository như của Ubuntu.



Cùng với GNOME, KDE cũng là một môi trường đồ họa nổi bật, được sử dụng phổ biến trong các hệ điều hành Linux. KDE mang đến một giao diện mềm mại và thân thiện cho Kubuntu và những ứng dụng trên đó.

Kubuntu yêu cầu hệ thống PC có cấu hình tối thiểu là: đĩa cứng dung lượng 3 GB và bộ nhớ RAM 256 MB. Bạn có thể truy cập vào địa chỉ http://www.kubuntu.org/download.php để download.

3. Xubuntu : cũng có nguồn gốc từ Ubuntu, kết hợp với môi trường đồ họa Xfce. Hệ điều hành này ra đời nhằm phục vụ cho những người dùng đang sở hữu máy tính với cấu hình thấp, hoặc với những đối tượng cần một môi trường làm việc tốc độ nhanh và hiệu suất cao.



Xfce là một môi trường đồ họa đơn giản và nhỏ gọn (lightweight desktop environment) được dùng phổ biến trong các hệ thống Unix. Ưu điểm của thư viện này là tính dễ sử dụng, cấu hình đơn giản và giúp hệ thống máy tính hoạt động với tốc độ cao.

Khi khởi động lần đầu tiên, desktop của Xubuntu không có bất kỳ biểu tượng nào. Tuy nhiên, những ứng dụng cơ bản nhất đều được tích hợp sẵn, bao gồm công cụ soạn thảo văn bản Abiword, bảng tính điện tử Gnumeric, trình duyệt Firefox và công cụ gửi nhận thư Mozilla Thunderbird.

Xubuntu yêu cầu hệ thống PC có cấu hình tối thiểu là: đĩa cứng dung lượng 1,5 GB, bộ nhớ RAM 128 MB để chạy và 192 MB để cài đặt. Bạn có thể truy cập vào địa chỉ http://www.xubuntu.org/get để download.

4. Gubuntu : Nếu bạn muốn xây dựng một phiên bản Ubuntu riêng cho mình, hãy chọn Gobuntu. Đây là hệ điều hành GNU/Linux, có nền tảng là Ubuntu. Mục đích của Gobuntu là cung cấp một platform để những lập trình viên quan tâm, tự mình sửa chữa, bổ sung và nâng cấp nhằm tạo ra một phiên bản hệ điều hành mang bản sắc riêng. Vì lẽ đó, Gobuntu chỉ bao gồm các ứng dụng open-source và non-restricted. Các ứng dụng, driver và firmware không cung cấp đầy đủ mã nguồn, hoặc license không cho phép sao chép, sửa chữa và phân phối lại sẽ không có trên Gobuntu.



Về yêu cầu hệ thống, Gobuntu tương tự Ubuntu với đĩa ứng dung lượng 4 GB và bộ nhớ RAM là 384 MB. http://cdimage.ubuntu.com/gobuntu/releases/7.10/release là nơi bạn có thể truy cập để download hệ điều hành này.

5. Ubuntu Mobile Internet Device (MID) là phiên bản Ubuntu nhỏ gọn sử dụng cho các phương tiện di dộng.

Ubuntu MID đem đến cho bạn một công cụ giải trí và khai thác Internet tuyệt hảo. Với ưu điểm hỗ trợ những công nghệ nổi bật như Web 2.0/AJAX, Adobe Flash, Java… phiên bản này giúp cho những phương tiện di động của bạn trở nên cực kỳ hữu ích với các tính năng duyệt web, email, media, camera, VoIP, chat, GPS, digital TV, games, calendar…

6. Cuối cùng, không thể không nhắc đến Ubuntu Studio, một phiên bản Ubuntu chuyên về lĩnh vực multimedia. Studio thích hợp với những người say mê hoặc những chuyên gia trong các lĩnh vực giải trí và đồ họa.



Với một tập hợp đa dạng các ứng dụng giải trí và đồ họa như GIMP, Blender, PiTiVi, Cinepaint… Studio hy vọng sẽ phát huy mạnh mẽ trí tưởng tượng và sức sáng tạo của bạn. Hãy bắt đầu với Ubuntu Studio tại http://ubuntustudio.org.

Chủ Nhật, 27 tháng 7, 2008

Ebook học tập

Giáo trình Vật lý đại cương !


Link : http://www.box.net/public/eilaknci4a


Giải tích Tác giả:

Nhóm tác giả

Chuyên ngành:

/ Khoa học tự nhiên / Toán học

Nguồn phát hành:

Khoa Toán Tin, ĐHSP Hà Nội

Sơ lược:
Thông tin giáo trình

Trang bị cho người học những kiến thức và kĩ năng cơ bản về giới hạn, liên tục và phép tính vi phân đối với hàm một biến và hàm nhiều biến, nhằm tạo cho người học có thể tiếp tục học tập các môn học khác và có thể vận dụng chúng.
Download nội dung giáo trình.

Chú ý:

Giáo trình điện tử của trường ĐHSP Hà nội là một loại học liệu điện tử đã được đóng gói theo chuẩn SCORM 1.2. Để học được nội dung của giáo trình này cần phải được chạy trên một hệ thống quản lý học trực tuyến (LMS) hoặc là một phần mềm có thể thưc thi được các gói học liệu theo chuẩn SCORM 1.2 – như Reload Player.

Các yêu cầu kỹ thuật

Để học được các giáo trình này trên máy tính cá nhân, cần phải cài đặt các phần mềm sau:

- Phần mềm Reload Player
- Phần mềm JavaRuntime Enviroment

Bạn có thể download hướng dẫn và bộ công cụ các phần mềm hỗ trợ trên tại đây.
//-------------------------------------------------------------
Software:Phần mềm Borland C được dùng khi học và làm bài thi:http://rapidshare.com/files/83659784/C_Resources.rar or: http://www.box.net/shared/static/zeysyzb0gs.rar-

Giáo trình Pascal:
Tác giả: PGS.TS Lê Khắc Thành

Chuyên ngành:

/ Công nghệ thông tin

Nguồn phát hành:

Khoa CNTT, ĐHSP Hà Nội



Sơ lược:
Thông tin giáo trình Khóa học được chia làm 8 phần lớn. Các phần được sắp theo trình tự kiến thức hợp lí và logic, bạn phải hoàn thành phần đầu để có kiến thức cần thiết trước khi muốn học tốt phần sau sau. Mỗi phần lại chia thành các bài nhỏ hơn. Cuối khóa học có bài kiểm tra trắc nghiệm để đánh giá khả năng tiếp thu kiến thức của các học viên.

Kiến thức đạt được
  • Hiểu khái niệm về thuật giải, biết thiết kế thuật giải để giải quyết một bài toán trong tin học.
  • Biết sử dụng ngôn ngữ lập trình Pascal để giải quyết các bài toán trong môi trường Turbo Pascal.
  • Nắm được một số thuật giải điển hình trong tin học.
  • Tạo cơ sở để tiếp nhận các ngôn ngữ lập trình bậc cao hơn.
Download nội dung giáo trình.

Free Download Manager - Không chỉ là chương trình hỗ trợ Download




Nhắc đến các chương trình hỗ trợ download, hẳn bạn sẽ nghĩ ngay đến Internet Download Manager hoặc Flashget. Tuy nhiên, chính Free Download Manager mới chính là chương trình hỗ trợ download mạnh mẽ nhất từ trước đến nay.

Ngày nay, khi mà vấn đề bảo mật và bản quyền luôn đặt lên trên hết, thì việc tìm kiếm cho mình những chương trình miễn phí nhưng mạnh mẽ đang rất được chú trọng.

Cần phải thừa nhận rằng, Internet Download Manager (IDM) là một chương trình hỗ trợ download mạnh mẽ, nó giúp cho tốc độ download đươc cải thiện đáng kể, tuy nhiên vướng mắc duy nhất đó là IDM không miễn phí, nó chỉ cho phép bạn sử dụng 30 ngày trên bản dùng thử và sau đó phải gỡ bỏ nó ra.

Đại diện thứ 2 của các chương trình hỗ trợ download thông dụng nhất hiện nay, đó là Flashget, tuy nhiên ngày nay, để tìm được Flashget có giao diện tiếng Anh là việc “hơi” khó, bởi vì giao diện của Flash phiên bản hiện tại đã chuyển sang tiếng Trung Quốc, và vấn đề sử dụng 1 phần mềm với giao diện ngôn ngữ không quen thuộc hẳn sẽ rất khó khăn.

Còn rất nhiều những đại diện khác cho các phần mềm hỗ trợ download, tuy nhiên, bài viết sau đây xin giới thiệu đến các bạn Free Download Manager, một phần mềm hỗ trợ download miễn phí nhưng rất nhiều các tính năng, có thể sẽ khiến bạn phải bất ngờ.

Đầu tiên, bạn download phiên bản mới nhất của chương trình tại đây.

Sau khi download chương trình, bạn tiến hành cài đặt, trong quá trình cài đặt, chương trình sẽ cho bạn thiết lập 1 số tùy chọn. Tại bước thứ 5 của quá trình cài đặt, bạn có thể thiết lập chương trình khởi động cùng hệ thống hay không bằng cách đánh dấu vào tùy chọn được khoanh đỏ dưới đấy. Nếu không đánh dấu vào tùy chọn này, chương trình sẽ không khởi động cùng hệ thống.



Sau khi thiết lập tùy chọn này, bạn tiến hành cài đặt chương trình bình thường.

Sử dụng Free Download Manager :

Mặc định, Internet Explorer là trình duyệt web được Free Download Manager hỗ trợ. Trong trường hợp bạn muốn chương trình hô trợ Firefox thì bạn cần phải cài đặt extension Flashgot cho Firefox tại : https://addons.mozilla.org/en-US/firefox/addon/220

Trong lần sử dụng chương trình đầu tiên, FDM sẽ cho phép bạn chọn ngôn ngữ để sử dụng. Điều thú vị là trong bảng danh sách ngôn ngữ của chương trình có cả Tiếng Việt, tuy nhiên có một vài trường hợp khi sử dụng tiếng Việt bạn có thể gặp lỗi font chữ, rất khó để sử dụng, do đó tốt nhất bạn nên sử dụng font chứ tiếng Anh.

Về cơ bản, Free Download Manger (FDM) có giao diện khá giống với Flashget hay IDM, tuy nhiên, FDM có những tính năng vượt trội so với 2 đổi thú nổi tiếng kia.

Hỗ trợ download theo định dạng P2P (Peer to Peer): Một trong những tính năng nổi bật của FDM đó là cho phép bạn sử dụng nó để download các file Torrent. Có lẽ khái niệm download file P2P (Peer to peer) đã không còn xa lạ với người sử dụng Internet. Sau khi bạn download file torrent để bắt đầu quá trình tải dữ liệu theo kiểu P2P, bạn có thể sử dụng FDM để download dữ liệu P2P đó mà không cần sử dụng đến các phần mềm torrent chuyên biệt khác, đây là một điều khá tiện lợi đối với những ai không muốn cài đặt quá nhiều phần mềm trên máy tính của mình.

Chơi và chuyển đổi định dạng file Media : Một tính năng độc đáo khác của FDM mà các chương trình hỗ trợ download khác không có, đó là tính năng chơi các file media sau khi download và đổi định dạng trực tiếp bằng chương trình này. Để có thể chơi những file media, sau khi download xong, bạn click vào file media vừa download, ở bên dưới, bạn chọn tab Media Preview / Convert rồi bấm nút Play để chương trình phát file vừa tải được.



Còn trong trường hợp bạn muốn đổi định dạng file media, cũng tại tab này, bạn chọn file vừa download được và nhấn nút Convert. Lập tức bản tùy chọn những thông số để chuyển đổi định dạng sẽ được hiện ra, bạn chọn những thông số thích hợp về định dạng file chuyển đổi (File format), Kích cỡ của file video (trong trường hợp đó là file video – Vide size) và chất lượng tần số của file sau khi chuyển đổi (Quality).



Có thể nói tính năng này của FDM là rất đặc biệt mà không một chương trình hỗ trợ download nào có được. Sau khi tùy chọn những thông số cần thiết, bạn nhấn nút Convert đê quá trình bắt đầu công việc của mình. Sau khi quá trình chuyển đổi hoàn thành, chương trình sẽ hiện hộp thoại yêu cầu bạn chọn chỗ lưu cho file vừa được chuyển đổi, sau khi bạn chọn chỗ lưu và nhấn Save để kết thúc quá trình này của chương trình.

Chia sẽ nhận xét về file download : Kế bên tab dành riêng cho Media là tab Opinions. Tại tab nay, bạn sẽ được phép viết nhận xét và đánh giá về file đã download, những nhận xét này sẽ được lưu trên file sau khi download, giúp cho bạn dễ dàng quản lí những file đã download được cũng như để chia sẽ những file này với bạn bè được dễ dàng hơn.



Kiểm tra virus file download : Thêm vào đó, chương trình còn tích hợp tích năng kiểm tra virus của file sau khi download. Để kiểm tra file bạn vừa download có an toàn hay không, bạn click chuột phải vào file đó trong danh sách download và chọn Perform Virus check để chương trình anti virus cài đặt trên máy tính của bạn kiểm tra tính an toàn của file trước khi bạn sử dụng.



Tạo chương trình dạng Portable: Một tính năng rất độc đáo khác của FDM đó là cho phép bạn tạo ra chương trình FDM dưới dạng Portable là dạng chương trình có thể chạy ngay mà không cần cài đặt. Để tạo ra chương trình Free Download Manager Portable, tại giao diện chính của chương trình, bạn click vào File, chọn Creat Portable Version. Cửa sổ Creat Portable Version hiện ra, bạn click vào biểu tượng tập tin để chọn đường dẫn lưu chương trình dạng Portable và nhấn OK.



Quá trình sẽ mất một khoảng thời gian để tạo ra dạng Portable của chương trình. Sau khi quá trình hoàn tất, bạn tìm đến vị trí nơi bạn đã chọn để lưu sẽ thấy một folder mang tên Free Download Manager, bạn có thể copy folder này vào USB và sử dụng ở những máy tính khác không có cài đặt FDM mà không cần phải cài đặt lại, rất tiện lợi.

Tương thích với nhiều định dạng kết nối (Kể cả kết nối Dial-up): Một điểm mạnh khác của FDM đó là tương thích với những đường kết nối Internet khác nhau. Để chọn đường kết nối Internet tương thích để chương trình hoạt động được tốt, tại giao diện chính của chương trình, bạn click vào Options trên thanh menu và chọn Optimizations master. Một hộp thoại mới hiện ra, tại đây bạn chọn dạng kết nối Internet mà bạn đang sử dụng. Thông thường nếu bạn sử dụng ADSL thì sẽ chọn tốc độ 512K DSL / Cable. Sau khi chọn được định dạng kết nối thích hợp, bạn click vào Finish để xác lập với chương trình.



Ngoài ra, những tính năng còn lại của chương trình như download theo danh sách cho trước, hay shutdown hệ thống sau khi download… mà bạn có thể khám phá trong quá trình sử dụng,

Quản lí phần mềm bằng Soft Informer : FDM còn tích hợp thêm tiện ích Software Informer, một tiện ích rất hay. Để kích hoạt tiện ích này, bạn vào thư mục nơi cài đặt FDM, sẽ thấy biểu tượng của chương trình SoftInfo (biểu tượng hình con bạc tuộc), bạn click vào đó để kích hoạt chương trình.

Sau khi được kích hoạt, giao diện của chương trình Software Informer sẽ được hiện ra. Tại đây, danh sách những phần mềm đang được cài đặt trên máy tính của bạn sẽ được liệt kê toàn bộ. Với Soft Informer, bạn có thể kiểm tra phiên bản đang sử dụng của các phần mềm và kiểm tra cập nhật của các phần mềm đó một cách dễ dàng. Nói cách khác thì Soft Informer là tiện ích giúp cho bạn quản lí các phần mềm rất hay và đang để sử dụng. Từ giao diện của chương trình này, bạn có thể vào trang chủ của những phần mềm đang cài đặt trên máy tính để xem thông tin cập nhật bằng cách bấm view Home Page ở sau mỗi phần mềm, hoặc bạn có thể kiểm tra cập nhật của toàn bộ các phần mềm cùng một lúc bằng cách click vào nút Check for the latest version of your sowtware …



Hỗ trơ Upload : Ngòai chức năng hỗ trợ Download, chương trình có có tính năng hỗ trợ Upload. Để sử dụng chức năng này, bạn vào nơi cài đặt chương trình, sẽ thấy Folder FUM, bạn vào folder này sẽ thấy biểu tượng fum, bạn click vào biểu tượng này để sử dụng chức năng hỗ trợ upload của chương trình. Về cơ bản Free Upload Manager (FUM) sẽ upload file bạn cần upload lên server chương trình và lưu trữ trên đó để bạn sử dụng hoặc chia sẽ, sau một số ngày nhất định, file đó sẽ bị xóa.

Sau khi kích hoạt chương trình, giao diện chính của chương trình sẽ được hiện ra. Tại giao diện chính của chương trình, bạn click vào biểu tượng dấu cọng để thêm file vào. Sau khi click vào biểu tượng này, một cửa sổ hiển thị những tùy chọn sẽ được hiện ra, bạn chỉ cần lưu y’ những điều sau :

- Add files / Add folder : thêm file hoặc thêm folder để upload lên server

- Compress : Nén file hoặc nén folder lại sau khi đưa lên server. Bạn có thể chọn chất lượng nén, hoặc nếu không bạn không cần quan tâm đến vấn đề này.

- Keep these files : Số ngày để lưu trữ file trên server của chương trình. Bạn có thể chứa file trên server tối đa là 1 tháng và tối thiểu là 2 ngày. Tùy thuộc vào mục đích sử dụng để bạn lựa chọn.

- Supposed number of download : số lượng để download file, tùy theo mục đích sử dụng để bạn chọn số lượng download tương ứng.

- Nếu muốn thêm những thông tin về file như mô tả về file, tên của bạn... thì bạn đánh dấu vào mục Include Advanced Information và điền đầy đủ vào các khung.

Sau khi đã hoàn thành các bước trên, bạn click vào I agree to Term để đồng ý với điều khoản của chương trình và click Ok để bắt đầu tải file lên server.



Sau khi quá trình upload hoàn thành, chương trình sẽ cung cấp đường link của file đã được upload trên server để tiện cho việc download.

Còn rất nhiều những tính năng độc đáo khác của chương trình mà trong 1 bài viết không thể nào đem đến cùng các bạn, do đó, qua quá trình sử dụng, các bạn có thể khám phá ra thêm những tính năng mới mẻ của chương trình này.

Tóm lại, mặc dù tên tuổi còn khá xa lạ đối với người sử dụng Internet, nhưng phải thừa nhận rằng FDM là một chương trình rất bổ ích cho những ai sử dụng Internet. Đặc biệt, FDM là một chương trình mã nguồn mở, do đó, bạn có thể tải mã nguồn của nó để khám phá thêm những điều hấp dẫn có trong chương trình này.

DOWNLOAD: version 2.5 build 758 (5,62 Mb)



Nguồn: Dân Trí

> FlashFXP 3.8 (3.7.2 Build 1266) Beta_ chương trình hỗ trợ upload FTP

FlashFXP là ứng dụng nhập FTP & FXP mạnh mẽ và phổ biến với nhiều tính năng cho người dùng có năng lực. FlashFXP có một giao diện trực quan và tính năng toàn diện, cho phép bạn thực hiện tất cả các thao tác thông thường chỉ với vài cú nhấn chuột. Nó cũng đồng thời hỗ trợ kéo-thả, do đó bạn có thể truyền dữ liệu, đồng bộ hóa thư mục, tìm kiếm file và sắp xếp thao tác với chỉ một cái nhắp chuột. Sử dụng FTP protocol, bạn có thể truyền dữ liệu từ các server ở xa vào máy của bạn, hoặc sang các server khác. Nó tạo sự dễ dàng để cập nhật Website của bạn, download file từ server của công ty, thậm chí download file từ Internet mà trình duyệt của bạn dường như luôn bị hỏng. Phần mềm còn cho phép bạn vận chuyển dữ liệu giữa 2 site (FXP), tiếp tục lại (resume) những download không hoàn thiện, đồng bộ hóa thư mục, sắp xếp nhiều thao tác, ..

Yu-Gi-Oh! Power of Chaos YUGI THE DESTINY

Yu-Gi-Oh! Power of Chaos: Kaiba the Revenge
Kaiba the Revenge works in conjunction with the previous Power of Chaos: Yugi the Destiny for the PC or as a standalone game. In the new game, collect more than...

Type rest of the post here

I was really disappointed after playing YtD, the cards were few and weak, the board looked "cheap" and Yugi was annoying as hell.
But I was surprised (in a good way) when I started playing KtR, this game has more than twice the cards on Yugi, stronger monsters and spells, ritual monsters and its silver skin is more pleasant to the eye.
Kaiba gets a bit repetitive with his lines but it feels like you're actually playing against him so it's really worth it.
This game is highly addictive, if you like the series or the card game, you most give it a chance.

Power of Chaos: Kaiba the Revenge is a card game that can be played with Power of Chaos: Yugi The Destiny or as a stand-alone game. Players will collect over 300 additional cards, and will be graced with a new dueling field and interface.

You will battle Yugi's rival, Seto Kaiba on this game. Basically if your familliar with the Yu-Gi-Oh anime series you must know already his strategy of fighting. But beware not all of his strategies are known on this game. One time he will suprice you and you will want to say "OMG how did he do that!" So i wish you good luck Yu-Gi-Oh fans on beating him. I had so much fun dueling him and i must say he is one good duelist.

System Requirements:
Windows XP/ME/2000/98 CD-ROM drive 450 MHz Pentium II processor 128 MB RAM 200 MB free hard disk space Direct X 8.1-compatible video card Direct X 8.1-compatible sound card
http://www.mediafire.com/?emkqnxvm4nj
http://www.mediafire.com/?xjimq2omfem
http://www.mediafire.com/?z2jd0dtxoeu
http://www.mediafire.com/?syzkzunaym0
http://www.mediafire.com/?g3jbnrydj3c

Thứ Năm, 24 tháng 7, 2008

My Drivers v.3.31 Sao lưu update Drivers

My Drivers 3.31 được thiết kế để sao lưu và khôi phục lại các driver đang được cài lên Windows để điều khiển những thiết bị phần cứng của bạn, đề phòng trường hợp hệ thống bị hỏng hoặc bạn muốn cài đặt lại Windows. Không những thế, My Drivers 3.31 còn giúp bạn cập nhật các driver thiết bị không được Windows hỗ trợ, hoặc tự động tìm kiếm driver cho những thiết bị chưa được nhận ra.
Không chỉ sao lưu các driver thiết bị, My Drivers 3.11 còn có thể backup các IE Favorites, thiết lập Proxy, cũng như toàn bộ dữ liệu hòm thư, sổ địa chỉ của Outlook Express thành một file dữ liệu .cab, và sau đó có thể khôi phục lại trên một hệ thống Windows mới.



Reduced: 89% of original size [ 571 x 421 ] - Click to view full image

Cách sử dụng :

Để liệt kê mọi thiết bị trên máy tính của bạn, bấm vào nút Collect All bên phải. Trong trường hợp muốn hiển thị nhanh các phần cứng mà hệ điều hành Windows của bạn không hỗ trợ được, bấm nút Fast Collect, nếu không có thiết bị nào xuất hiện, chứng tỏ các thiết bị của bạn đều được Windows hỗ trợ driver rồi.
Khi đã thấy thiết bị cần sao lưu driver được liệt kê, bạn chọn vào thiết bị đó và bấm nút Backup, nếu muốn sao lưu tất cả các thiết bị được liệt kê (như trong kết quả Fast Collect), hãy bấm Backup All.

Sau khi chương trình tìm kiếm ra các file driver đang được Windows sử dụng để điều khiển thiết bị, để backup thành một thư mục driver cài đặt, bạn bấm vào nút Start ở dưới hoặc vào menu Backup/Backup only selected. Ngầm định, các thư mục driver sẽ được lưu vào C:\My Drivers\. Nếu muốn thay đổi đường dẫn, bạn cần bấm vào Browse trước khi bấm Start. Trong trường hợp muốn tạo driver thành một file .exe để dễ gửi qua mạng hoặc dễ cập nhật vào diver hệ thống của Windows, chọn menu Backup/Backup selected to EXE installer.

Ngoài ra, trong menu Plug-in, bạn cũng có thể sao lưu dữ liệu và contact của Outlook Express và IE Favourites. Khi muốn phục hồi các dữ liệu này trên hệ thống mới, bạn cần phải chạy My Driver 3.31 và cũng vào menu Plug-in, chọn Restore Outlook Express hoặc Restore IE Favourites, sau đó trỏ tới nơi bạn đã backup.

Khi bấm xuống nút mũi tên dưới cùng, bạn sẽ có thêm một loạt nút mới: Update cho phép cập nhật các dữ liệu driver thiết bị mới nhất từ Internet, Remove cho phép loại bỏ đi một phần mềm được cài trên máy (nhưng không đúng hoặc hoạt động không ổn định), Install hỗ trợ cài đặt một phần cứng mới, Restore All giúp sao lưu nhanh toàn bộ các driver có trên máy tính của bạn

Trước khi bạn quyết định cài lại máy tính, hãy nhớ tới My Driver 3.31, vì kể cả bản thử nghiệm của nó cũng có thể backup toàn bộ các driver cần thiết của máy tính bạn trong chưa đầy 1 giờ . Các driver được backup lại đều có thể sử dụng như bình thường và lưu được mãi mãi, chứ không bị đòi mã bản quyền khi bạn dùng chúng để cài lại các thiết bị của mình.


Bài đăng phổ biến