PHP Test và câu chuyện phỏng vấn

trong danh mục PHP

php-test-va-cau-chuyen-phong-van

Hôm qua vừa kết thúc một đợt phỏng vấn nhỏ để tuyển PHP dev cho các dự án của công ty, có một số điều thấy cần phải chia sẻ về buổi phỏng vấn này đến các bạn đồng đạo cũng như những bâng khuâng về các kiến thức mà các bạn vừa ra trường và nhận là có 1,2 năm kinh nghiệm.

Số là hôm qua, vừa chạy xe vừa nghĩ là nên cho một vài bài test để test một số kỹ năng cần thiết của các bạn ứng tuyển vị trí php developer. Một số kỹ năng mà mình muốn các bạn thể hiện được là có kiến thức về PHP ở mức sâu một tí và khả năng xoay sở tình huống, cách giải quyết vấn đề khi thời gian eo hẹp. Và dưới đây là 5 câu hỏi trong bài test của mình sáng qua:

1. Cho ví dụ về một SESSION ID
2. Viết hàm lấy phần mở rộng của một file name.
3. Viết hàm tính số fibonaci của số thứ n
4. Kể tên 7 open source viết bằng PHP
5. Vẽ mô hình một Request, Response có sử dụng MVC.

Và dưới đây mình sẽ chia sẻ với các bạn về các câu hỏi này và tại sao chỉ cần 5 câu là đủ test hầu hết kỹ năng trước khi vào phỏng vấn trực diện.

1. Session ID và hơn thế nữa

Ở câu hỏi đầu tiên, mình chỉ hỏi một câu rất đơn giản là cho ví dụ về một session ID. Nếu anh đã là một PHP developer,làm việc với Session là một lẽ bình thường và tự nhiên. Quá trình create session, regenerate session id là một số quá trình một developer cần tìm hiểu trước khi bước vào sâu hơn trong thế giới của session.

Một developer có kỹ năng sẽ biết session lưu gì, ở đâu và tất nhiên session id là cái gì. Tùy vào thiết kế và môi trường cũng như level của bạn để thấy được session có thể được triển khai bằng file, database hoặc memory (APC, Memcached…)

Và nếu bạn vọc với session thì bạn sẽ biết rằng, SESSION ID là một hash string có chiều dài 32 ký tự, ví dụ “q6galil87hnkafa65r7agnrno4”

2. Xử lý chuỗi là một thao tác thường trực

Nếu thường xuyên làm việc với PHP, xử lý chuỗi là một trong những thao tác mà bạn sẽ lặp đi lặp lại nhiều lần, việc nắm các hàm xử lý chuỗi là một kỹ năng phải có và giúp ích rất nhiều trong việc xử lý trên frontend và backend.

Có nhiều framework có lẽ đã làm sẵn cho bạn khá nhiều hàm dạng này (ví dụ lấy phần mở rộng của filename như câu hỏi ^^) và nó cũng lấy đi của bạn một thứ rất quan trọng, sự tự lập. Lấy phần mở rộng từ một filename là một bài tập rất cơ bản trong các buổi học xử lý chuổi. Tối thiểu bạn chỉ cần biết 2 hàm xử lý chuỗi để giải quyết bài này.

Ví dụ dưới đây là một hàm bình thường để lấy phần mở rộng, ngoài ra, còn có nhiều cách triển khai khác.

function getExt($filename)
{
    return substr($filename, strrpos($filename, '.') + 1);
}

3. Fibonaci và kiến thức đệ quy

Trong các khóa lập trình, dãy số fibonaci là một dãy số rất cơ bản để giúp tìm hiểu về khái niệm đệ quy. Nếu ứng viên có tìm hiểu và luyện tập thì viết hàm cho dãy số fibonaci không phải là vấn đề lớn. Khái niệm đệ quy nếu đã từng tiếp xúc thì sẽ biết cách triển khai. Các hàm đệ quy dạng này thường dùng ở một số trường hợp như các hàm lấy cây thư mục, lấy danh sách danh mục (không giới hạn cấp) có sử dụng SELF_JOIN.

Còn đây là hàm lấy fibonaci:

/*$n greater than zero*/
function getFibonaci($n)
{
    if($n == 1 || $n == 2)
        return 1;
    else
        return (getFibonaci($n - 1) + getFibonaci($n - 2));
}

4. Hiểu biết về thế giới bên ngoài

Câu 4 theo mình nghĩ là câu đơn giản nhất, nếu bạn đã có kinh nghiệm ít nhất 1,2 năm thì việc nghe tên hoặc triển khai ít nhất một vài open source viết bằng PHP là một điều rất tự nhiên nếu bạn có theo dõi các tin công nghệ về lập trình cũng như tin về PHP.

Có lẽ các bạn thích theo dõi các trang tin cư*p, gi*t, hi*p hơn là theo dõi, tìm hiểu các thông tin về công nghệ, việc làm và sự nghiệp mà bạn phải gắn bó với tư cách là một lập trình viên. Gần gũi nhất có thể là một số dự án như: WordPress, Joomla, Zend Framework, Yii, Drupal, PhpBB, Mediawiki…

5. Mô hình hoạt động của HTTP và mô hình MVC

Thật ngạc nhiên, mình nghĩ ít ra các bạn phải biết viết mô hình request đơn giản, gồm có Client, Server, các mũi tên response. Ít ra phải vẽ được như vậy. Câu hỏi này có 2 phần, bạn biết mô hình Client-Server (Request, Response) và phải có kiến thức cơ bản về MVC.

MVC có lẽ là mô hình đơn giản, cổ điển nhất và có thể tiếp cận ngay từ nhiều nguồn và hầu hết các framework đều sử dụng mô hình MVC. Ngạc nhiên là nhiều bạn nói sử dụng các fw bự, tự viết fw này nọ mà lại không biết vẽ ra cái MVC diagram. Thậm chí, có bạn còn làm liều vẽ Request chỉa vào … View !!!

Mình không có nhiều thời gian để vẽ cái diagram mới, nên tạm bưng cái mô hình request response có cả MVC từ framework litpi và cũng là framework dùng trong tất cả dự án của mình hiện giờ.

800px-Request_Response_Diagram

—-
5 câu hỏi trên không phải là tất cả trong buổi phỏng vấn của mình. Các kiến thức như làm việc nhóm, quản lý code và các tình huống thiệt cũng như bảo mật, sự cố cũng được đề cập để các bạn ứng viên trả lời.

Lời kết: Dường như các bạn không biết kinh nghiệm 1,2 năm PHP nghĩa là gì và cứ đánh giá bừa. Ngoài ra, kiến thức nền tảng rất có vấn đề, các kiến thức này đều được đề cập trong hầu hết các sách PHP căn bản cũng như các tut online nhan nhản khắp nơi. Bên cạnh đó, dường như các bạn quá tự tin vào kiến thức của mình trước khi đến dự các buổi phỏng vấn lập trình nên không chuẩn bị gì cả.

Hy vọng bài viết nhỏ này sẽ giúp các bạn PHP nói riêng và lập trình viên nói chung trước khi đi phỏng vấn, hãy tự hỏi mình đã thực sự đáng giá với kinh nghiệm mà mình nêu ra trong CV và nếu chưa đủ thì chỉ có cách trang bị bằng kiến thức mới giúp bạn tiến xa hơn với nghiệp lập trình.

14 bình luận

  1. Dung says:

    Thanks Tuan. Anh thích nhất câu 5 🙂

    [Reply]

  2. Hi Tuấn,

    Lâu rồi mới vào đọc bài của bạn.

    Chả là vì mình mấy hôm nay mải mê một số thứ của PHP, và sau nhiều năm vật lộn với .NET, mình tự nhiên thấy thèm cái thứ gọi là “freedom” và “open”, nên dành thời gian buổi đêm cho nó.

    Rồi mình vào các trang để xem thị trường người ta tuyển dụng PHP Developers như thế nào; mình là .NET Architect, nên nói chuyện đi tìm việc PHP thì hơi bất ổn, cái chính là muốn xem cái người ta mong chờ từ một PHP developer. Và mình thấy hơi buồn một chút khi đọc các yêu cầu về kỹ năng của các thông tin tuyển dụng, thế giới PHP đang đi rất nhanh, nhưng PHP developers ở VN có lẽ đang đi chầm chậm (chỉ là suy nghĩ thiển cận của mình).

    Vào đọc bài bạn, và ồ, ít nhất nếu mình chuyển sang làm PHP, thì sẽ có thể được tuyển vào công ty bạn. ^_^

    Chúc vui ^^

    [Reply]

  3. LongBM says:

    1. Session ID có thể set được nên nói session id là 1 hashstring 32 ký tự là không hoàn toàn chính xác.

    2. Câu hỏi thực sự không khó, sau khi … xem đáp án. Thực sự là câu hỏi không rõ ràng, dẫn đến nhiều cách hiểu khác nhau. Đặt bản thân vào áp lực của người đi apply xin việc đa phần sẽ hiểu câu hỏi phức tạp hơn

    3. Đừng đánh đố ứng viên thế nào là Fibonaci, câu hỏi sẽ hay hơn nếu gợi ý thế nào là Fibonaci để có thể kiểm tra được kiến thức đệ quy (có thể áp dụng vào thực tế) hơn là chọn được 1 thí sinh học thuộc lòng thế nào là Fibonaci.

    4. Thay vì hỏi câu này, theo tôi nên hỏi ứng viên hiểu thế nào là Library, Framework, Platform, CMS… Joomla, Yii, Zend… là thể loại gì trong các khái niệm trên?

    5. Nice question

    [Reply]

    admin Reply:

    THank bạn.

    Mình đặt câu hỏi không phải để các bạn trả lời đúng hết, mà còn quan sát nếu trong tình huống các bạn không trả lời được hoặc gặp câu hỏi hóc búa thì các bạn sẽ phản ứng thế nào nữa, hì hì.

    [Reply]

  4. Phạm Đắc Lộc says:

    Lập trình viên không được nghĩ rằng trên thực tế mọi thứ đều sẽ đúng như mong đợi, vậy nên người càng có kinh nghiệm sẽ tìm ra càng nhiều trường hợp khác nhau để cho vào logic if else trong suy nghĩ của họ.

    Đáp án cho câu 2 của bạn không tính đến trường hợp tên file không có extension (xảy ra đặc biệt phổ biến đối với các file của linux). Có thể sửa lại như sau:

    function getExt($filename)
    {
    return (strrpos($filename, ‘.’) !== false) ? substr($filename, strrpos($filename, ‘.’) + 1) : null;
    }

    Ngoài ra thì các câu hỏi ứng viên của bạn khá thông minh, hữu ích trong việc đánh giá 1 lập trình viên 🙂

    [Reply]

  5. Khang says:

    Mình thấy hỏi cơ bản php như sau:
    – mục đích php đến trái đất là gì?
    – cài php làm sao? có mấy cách?
    – web server là gì?
    – php chạy được trên môi trường nào?
    – template engine và template system là gì? php là cái nào?
    – php chạy trên apache là multi process hay multi thread ?
    …… đại loại là kiến thức tổng quát.
    Nếu mình gặp câu cắt chuỗi của bạn cũng pó tay. Chỉ biết nói miệng cắt từ dấu . cuối cùng trờ về sau. còn hàm thế nào thì lên google hỏi.

    [Reply]

  6. Tuấn says:

    Trong 5 k khó. Riêng câu hỏi về fibonaci vs getExt… nói thật mình học cái vụ fibonaci này đến bao nhiêu lần rồi nhưng giờ nhắc lại hoàn toàn k nhớ. Còn getExt làm nhiều sẽ nhớ, nếu k vẫn phải mở manual lên mà xem… chỉ nên yêu cầu họ phải biết trên đời này có substr, explode… để giải quyết vấn đề là được rồi. Còn một kỹ năng rất quan trọng với PHP dev là search google bằng keyword phù hợp với đọc code trong những source có sẵn… để tìm giải pháp. Như hàm getExt mới nghĩ ra là vậy và tưởng nó đơn giản chỉ có vậy nhưng thực tế cần 1 hàm được viết khác. Chuyện thuộc làu làu với chuyện có kinh nghiệm khác nhau hoàn toàn.

    [Reply]

  7. Trần Thanh Tuấn says:

    câu số 2 & 3 rỏ ràng thêm tí thì hay hơn.
    câu 5 thì tuyệt vời.
    Cám ơn anh !

    [Reply]

  8. hay nhỉ..chắc khả năng xoay xở phải khá tốt. T.T

    [Reply]

  9. Hieu Vo says:

    câu 2: có hàm PHP để lấy phần extension trong tên file nhanh chóng, viếc lại chi cho mệt? và hàm bạn viết ở trên bị sai trong trường hợp tên file có nhiều hơn 1 dấu chấm!

    Câu 3: Kiểu viết đệ qui như vậy chỉ có sv năm 1 viết thôi, trình tụi nhỏ bây giờ cũng khá lắm, nhìn vô là phải tự biết khử đệ qui. Mình phỏng vấn mà thằng nào viết kiểu như bạn là fail ngay và luôn!

    Câu 4: biết tên của opensource thì được cái gì khi chưa bao giờ xử dụng? Ngay bản thân mình có thể ngay 7 cái opensource mà mình chưa bao giờ sử dụng: fuelPHP, cakePHP, Symfony, Drupal, SilverStripe, Lime, Kohana, etc?

    [Reply]

    admin Reply:

    Thế giới của bạn phức tạp quá :), nhận trình còi thôi :).

    [Reply]

  10. vinhhd says:

    Câu 1: yêu cầu cho vd về session_id chứ có bảo bạn nói về session_id đâu

    [Reply]

  11. saimoto says:

    hi bạn. Mình thấy mấy câu trên mang tính hàn lâm quá. Toàn la mấy câu lí thuyết suông. Mấy câu này nên hỏi những người mới ra trường thì thích hợp hơn. Còn những người có kinh nghiệm thì mấy câu này ko thích hợp mấy. Đơn giản những người này thường hay làm việc trên framework hoặc các CMS nên các hàm php thuần đôi khi họ ko nhớ. Ví dụ hàm lấy file extension trong các framework đã có sẵn, hay session thì framework cũng đã hỗ trợ 1 cách đầy đủ…

    Các câu của bác chỉ mỗi câu 3 là mang tính logic 1 tí.

    [Reply]

  12. lucky says:

    những bài test và phỏng vấn luôn là ác mộng đối với những lập trình viên kém trí nhớ và sống dựa vào google.

    [Reply]

Gởi bình luận