Saturday, December 2, 2006

Lông Vịt - The most stupid coder ever...

Invisible dạo này kô có đủ thời gian để làm một cái blog hay hay, xin lỗi những người *hâm* mộ  ... Hôm nay, hên làm sao, lục trong máy thấy có một vài đống chữ, tiện tay hốt lên đây cho blog đỡ hiu quạnh ...

Những đoạn code "cân não"...

Trong series "Những đoạn code cân não", Invisible sẽ lần lượt giới thiệu với các bạn làm quen những lập trình viên kỳ cựu trong làng coder của thế giới... Hôm nay chúng ta hân hoan chào đón LTV: "Lông Vịt" !!!...

1. Randomized...

Lông Vịt là một LTV kỳ cựu, anh đã thử qua kô biết bao nhiêu công ty trong một khoảng thời gian đủ ngắn mà vẫn chưa muốn dừng chân. Hôm nay đã là tuần thứ 2 anh làm việc tại công ty Ep-I-T kể từ khi anh được sếp giao cho module *chọn nhân viên tư vấn cho khách hàng*. Đại ý là khi nhận được một request từ khách hàng trong giờ hành chánh, nếu 2 nhân viên tư vấn đang available thì sẽ chọn random một nhân viên để tư vấn cho khách hàng. Module của anh Lông Vịt chạy cực kỳ tốt, nhưng có cái gì đó sai sai... Sau khi dò qua hàng ngàn dòng code, sếp của anh đã phát hiện:

ids = SelectIdleUsers(2);
if (hour >= 7 && hour < 18) {
    if (rand() > 0.5) {
        Owner->LoadById(ids[0]);
    }
    if (rand() < 0.5) {
        Owner->LoadById(ids[1]);
    }
}


"Cân não" ở chỗ nào chưa ai biết trừ lão sếp, cũng kô biết Lông Vịt sẽ ở lại công ty Ep-I-T bao lâu, nhưng chắc chắn anh sẽ trở lại vào một ngày gần đây với "Những đoạn code cân não" mới ...

2. SQL - A "sequential" query language??...

Lông Vịt ra trường đã lâu, nhưng hiếm ai biết một quá khứ hào hùng của anh lúc còn là SV. Thời đó, khi mọi người đang say sưa lưu trữ và đọc dữ liệu một cách thủ công dùng flat file: text có, binary có, linh tinh có... thì Lông Vịt đã tiếp cận với "công nghệ" mà anh ấy gọi là "truy vấn tuần tự". Mọi DBMS như Oracle, DB2, MSSQL, PostgreSQL, MySQL... anh đều ít nhất một lần... chạy thành công vài câu truy vấn . Biêt được khả năng bẩm sinh của anh, lần này sếp giao anh viết một đoạn code để cập nhật một logging table... Lông Vịt sớm nhận ra ngay những bảng "liên quan" khi sử dụng bộ quản lý đi kèm *Oracle Enterprise Manager*:

tbl_monthly_log: [time], [user_id], [action_id], [log_data]
tbl_action: [action_id], [action_name], [action_level]
tbl_global_log: [time], [user_id], [action_id], [log_data]

Đại ý là hệ thống này cần theo mọi hành động của từng user trên mỗi tháng. Đến cuối tháng sẽ chọn lựa những hành động "đáng lưu ý" để lưu trữ lại và xóa đi những dữ liệu logging trong tháng (xóa nội dung table tbl_monthly_log). Hiểu vấn đề, Lông Vịt bắt tay vào coding... Dưới đôi tay thon dài như trái chuối, cộng với kỹ năng *gõ phím kô thèm nhìn màn hình* của Lông Vịt, hàng ngàn dòng code tuôn ra trên màn hình... Qủa là *phản xạ kô điều kiện* của Lông Vịt (mà *Sinh Học* gọi nó là "bản năng" còn giới *Coder* gọi nó là "trâu bò" ):

ResultSet rs = dbRequest.ExecuteQuery("select ml.*, a.action_level from tbl_monthly_log as ml, tbl_action as a where ml.action_id = a.action_id");

// Populate result-set to a list of LogRecord
LogRecords records = GetLogRecords(rs);

while (records.HasMoreRecord()) {
    LogRecord record = records.NextRecord();
    if (record.GetActionLevel() >= LOGGING_LEVEL) {
        LPSTR lpzSQL = CreateSQL(
            "insert into tbl_global_log (time, user_id, action_id, log_data) values (%u, %d, %d, %s)", record.GetTime(), record.GetUserId(), record.GetActionId(), record.GetLogData());
        dbRequest.ExecuteUpdate(lpzSQL);
        FreeSQL(lpzSQL);
    }
}
// Clean up...
...

Kô tốn nhiều thời gian để coding và kiểm lỗi, đoạn code anh một lần nữa được đánh giá là "perfect"... Nhưng than ôi, khi chạy trên dữ liệu thật (cỡ vài chục/trăm ngàn records) thì anh mất gần hàng chục phút ngóc mỏ ngồi đợi... Lần này sếp kô tự thân đến xem nữa mà lại sai một thằng SV mới ra trường, kinh nghiệm của nó mà theo anh, chỉ mới bằng ngón út của mình, đến làm công việc gọi là "xem code thử"... Sự tự ái, khinh thường, bối rồi, xấu hổ, ngưỡng mộ dần dần chuyển hóa trên khuôn mặt của anh... Trời, kô biêt thằng quỉ nó làm cái quái gì mà thời gian chạy giảm đi 10 lần là ít... Lông Vịt chỉ còn biêt câm nín, nhìn như trời trồng vào cái màn hình LCD 24 inches... Hix, anh thầm nghĩ *tuổi đời có phải là thước đo cho kinh nghiệm kô* ??...

21 comments:

  1. Co cau hoi, duoc khong? Thang quy do la ai vay?

    ReplyDelete
  2. Còn code của anh đọc chán òm, nhiều chữ wa' ....làm biếng đọc, hehehe. Gút nai...

    ReplyDelete
  3. Cao siêu quá. hix....Đọc hiểu chết liền !!!!

    ReplyDelete
  4. Hic, chả hiểu được gì *_*
    Cái code một hình như không random phải không anh nhỉ?

    ReplyDelete
  5. Thằng chó, viết mấy cái entry kiểu này làm tao tốn nơron.
    Đại khái là code thứ nhất, nó chỉ select ở 2 cái record đầu tiên thì còn random con monkey gì nữa.
    Ặc, Oracle 1 chử bẻ đôi cũng không biết, ráng coi thử coi :D

    ReplyDelete
  6. Có lẽ thằng đó nó ngu ở đây :
    while (records.HasMoreRecord())
    ......
    if (record.GetActionLevel() >= LOGGING_LEVEL)

    Viết lại = ngôn ngữ Access :))
    SELECT FROM record
    WHERE GetActionLevel >= LOGGING_LEVEL
    Access cũng quên cha nó rồi. Lần sau không đọc mấy entry kiểu này nữa :))

    ReplyDelete
  7. Mà không có gợi ý thì cũng không biết nó ngu chổ nào, biết đâu mình lại ngu giống nó :(
    May mà không làm mấy cái này :))

    ReplyDelete
  8. @ViP: :p... Ca'i na`y dan`h cho coder die^n die^n tho^i :D
    @Chi Huong: Ho^ng pha?i em :">
    @Haden: Da~ no'i la` "Nhu~ng doa.n code tri' na~o" ro`i ma` :">
    @Anh Tuan: La`m gi` co' chu~ na`o ma` da.i ca ko hie?u b-(.. Xa.o qua' b-(
    @Lihavim: Xem doa.n duo'i :">
    @Sa'n: Hehehe... Mo'i 1 pha`n nho? a` :">

    Reply mo?i tay luon =p~...

    Da~ post 2 ba`i do' o day :">
    1. http://vninformatics.com/forum/topic/46059/Randomized.html
    2. http://vninformatics.com/forum/topic/46366/SQL-sequential-query-language.html

    ReplyDelete
  9. Thua, chạy đâu cũng thấy code cân não của bé rùa. Lâu rồi k mó vào, :">. Cái code của SQL tui đọc k vô, nhưng k hiểu table action làm gì có action_type mà select? Xóa cái đó đi rùa điên.
    (:">, ôi, mình có phải là dân IT hông ta?)

    ReplyDelete
  10. Gruhhh, thằng nhóc này viết toàn thuật ngữ "bác học"

    ReplyDelete
  11. Code cân não của a Ỉn đọc mệt quá trời, nhăn trán hết :)). Cái code 1 thì anh post ở BKIT rồi. Xử cái code thứ 2:
    Trong cái while(records.HasMoreRecord()) của Lông Vịt không có gì sai, nhưng nếu số lượng records quá nhiều sẽ khiến phần mềm của anh chạy như rùa đạp đinh. E đề nghị dùng PreparedStatement để INSERT thay vì dùng Statement :D. Em mới đoán mò thế thôi, chút chiều về tiếp chiêu mấy đoạn code cân não của a tiếp. Sáng sớm dậy vận động tí tẹo chứ não của e vẫn còn đang ngủ :)). Chuồn đi học hehe

    ReplyDelete
  12. Đây là hỗn tạp code =p~. Hị hị, em chả hiểu :((

    ReplyDelete
  13. E'c? :D.. Su?a la.i ro`i Thuy dien >:)

    ReplyDelete
  14. PLMĐ ngu lập trình nên góp ý thế này: Code 1 thì anh đầu sông em cuối sông. Code 2 thì đi từ HN vào TPHCM mà không qua quốc lộ 1A. Nó đi quốc lộ vòng vo gì đó thì phải. Đi kiều rùa trên xe 50 chỗ chất 150 người.

    ReplyDelete
  15. Stupid code nên ko thèm xem [-(

    ReplyDelete
  16. @DuyDQ: Không sai nhưng cách dùng sai, duyệt từng record - tìm kiếm tuần tự kìa. Khúc sau không hiểu vì không biết Oracle :D

    ReplyDelete
  17. mày càn gl1uc bệnh càng nặng đó Khoa !!!

    ReplyDelete
  18. Anh K ơi là anh K. =)) hốt chi cái mớ c...ode này lên rồi bị chửi thảm zầy nè trời =))

    ReplyDelete
  19. Ku này bị nhiễm code kiếc nặng quá. Cuối cùng thằng ku này là ai vậy bà kon? Lén lén qua blog của anh post 1 câu, xong chuồn chả biết là ai nữa.

    ReplyDelete
  20. huhu,

    rand goi toi hai lan khong co truong hop bang nua, chac code nay cua cu Khoa, ko co else if, else gi rao troi.

    batch insert de dau rui, dung dynamic sql nua chu sao giong code cua cu Khoa lam. Chac luc code cu cua minh ra ngam ngui ha

    ReplyDelete