文章出處

基礎題

場景:

 

你入職了一家新公司.

上班第一天,接待人給你安排好了座位,然后拉過來一臺沒拆封的新電腦.

你把電腦連接好之后,按下電源....

 

好吧,這真是一臺新電腦,里邊竟然內置了個DOS系統!!

 

你找同事拿來了操作系統光盤/U盤(這個無所謂了).半個小時后,操作系統安裝好了.

 

    1. 第一件事就是要把LAMP環境搭建起來,這樣才好工作.簡述搭建LAMP環境過程中的注意點.

    2. LMAP環境搭建好之后,你拿到了第一個開發任務.給公司內部開發一個通用審批系統.公司內部有一個DNS服務器,上邊已經配好了這個系統的域名,叫approving.great-company.com,并指向了你本機的ip. 你嘗試訪問了一下 ,出現了apache經典的It Works頁面,域名是生效的.你打算在桌面新建一個目錄叫approving并在這個目錄下完成這個系統的開發.如何配置apache使得訪問的時候能夠打開approving/index.php

    3. apache配置好之后,你開始了開發工作.這時,同事給了你一份代碼,是另一個人寫了一半的通用審批系統.這下好多了,你不用從零開始寫代碼了.你翻看了他的代碼,發現邏輯是這樣的: 用戶使用email和密碼登錄這個系統后,程序把這個用戶的id放到了session里.通過$_SESSION['uid']就可以拿到登錄用戶id,然后去數據庫里就能把這個用戶的個人信息(比如叫什么名字,是哪個部門的)拿到了.接著,你找到了這個通用審批系統主要功能點的代碼

<form action="new-approving.php" method="post">
    審批事項: <input type="text" name="title" />
    詳細描述: <textarea name="details"></textarea>
    <input type="submit" value="提交" />
</form>
<?php

include __DIR__ . '/conndb.php';

$title   = $_POST['title'];
$details = $_POST['details'];
$access  = md5(uniqid());

$db->query("INSERT INTO approving(title, details) VALUES ('$title', '$details')");
$insertId = $db->getLastinsertId();
$db->query("INSERT INTO access(approving_id, access) VALUES ($insertId, $access)");

// 通知boss@great-company.com審批
$to      = 'boss@great-company.com';
$subject = "請審批 $title";
$body    = "$details\n<a href=\"approve.php?access=$access\">快速審批鏈接</a>";

include __DIR__ . '/lib/mail.php';
$mail = new Mail();
$mail->addTo($to);
$mail->setSubject($subject);
$mail->setBodyHtml(nl2br($body));
$mail->send();

header('Location: success.php');

看到這里,你大概看明白了.用戶登錄進來之后,提交一個表單,填寫好要boss審批什么東西以及詳細的描述,程序接收到提交數據后,除了把審批事項存放到approving表之外,還生成了一個access,發送給了boss,應該是boss在郵件里點擊這個”快速審批鏈接”就不需要登錄系統就直接把事項審批了.接著,你找到了approving.php的代碼:

<?php

include __DIR__ . '/conndb.php';

$access = $_GET['access'];
$row    = $db->query("SELECT approving_id FROM access WHERE access = '$access'");
if (!$row) {
    die('No such access');
}

$approvingId  = $row['approving_id'];
$approvingRow = $db->query("SELECT * FROM approving WHERE approving_id = $approvingId");

echo '<h3>審批事項: ', $approvingRow['title'], '</h3>';
echo '<p>詳細描述:</p>';
echo '<p>', nl2br($approvingRow['details']), '</p>';
echo "<a href=\"pass.php?access=$access\">通過</a>";
echo "<a href=\"deny.php?access=$access\">拒絕</a>";

 

Review上述三段代碼,指出代碼中存在的問題.

 

4. 在你翻看完成了大部分代碼之后,你發現里邊有一個TODO尚未完成.

// TODO: 如果兩天了boss還沒有審批,那么系統就再發一封郵件催一下.

這個該怎么實現?

 

進階題

  1. 有哪些得意之作?

  2. 是否實踐過PHP編碼規范?

  3. 如何做質量控制?

  4. 如何做測試?

  5. js命名空間的作用?

  6. 是否用過jslint?

  7. 是否寫過jQuery plugin?

  8. Linux使用多長時間了?

  9. 常用工具: vim, grep, sed awk, wget, curl

  10. 寫過哪些shell腳本?

  11. 做過服務器管理嗎?

  12. 接觸到的Mysql數據庫表最大是多少行記錄?

  13. 使用哪種存儲引擎?

  14. 出現性能瓶頸如何定位解決?

  15. MyISAM與InnoDB索引的區別?InnoDB的Primary Index 和 secondary Index有何區別?

  16. 你手里有300W份簡歷的工作經歷和教育背景?如何從中提取出學校/專業/公司?

  17. 學習一個新框架如何入手?


------------------------------------------------------------------------------------

為什么我更新了面試題?

招研發的必須實打實的上代碼,我的確遇到了一些面試時回答問題還不錯,一寫代碼讓人頭疼的工程師.
所以招人時分了兩個層次:
1) 期望面試者入職工作后,代碼寫出來,一兩天內能發布到線上.(對應基礎題)
2) 了解面試者對編程認知的廣度和深度.(對應進階題)

基礎題分析說明

1. 搭建LAMP環境過程中,一定要把錯誤報警全都打開(安裝了xdebug后,錯誤報警會更顯眼,track_errors也很有用...)
2. 會配虛擬主機
3. Code Review.
首先,這三段代碼均缺少權限判斷.
第2段代碼的問題:
1) 對提交過來的數據沒有任何驗證.
如果沒有提交title字段,$_POST['title']就報undefined index了
如果title,details為空,或者過長都會有問題
2) 數據庫操作部分有SQL注入
一個操作涉及到多個表時需要考慮事務的問題
第3段代碼的問題:
1) 數據驗證
2) SQL注入
3) XSS
4. 寫一個在CLI運行php程序,然后放入cronjob即可.
熟悉CLI環境還是需要的,讓一個新人明白數據不一定是從他寫的表單里提交過來的,好費勁.
------------------------------------------------------------------------------------

我覺得,如果一個應聘者能對如下關于LMAPJ(J指Javascript)方面的問題有自己的實戰經驗或者能提出解決方案的,都是可以考慮錄用的。以下只是個人最近的一些思考,不見得合理,但是我會很愿意和能清楚解答如下問題的人在一起工作的。 
====================================== 

== PHP == 
# 編碼規范 
你在以前的項目中采用什么樣的編碼規范? 
# 正則 
你對正則有多熟悉?在以前的項目中用過嗎?用在哪些地方了?是自己寫的,還是從網上找的? 
以下是apache的一段訪問日志,從中取出訪問的站點名稱,訪問者ip (<del>訪問時間,訪問頁面,訪問者的客戶端</del>) 

 157.55.16.231 - - [25/Dec/2011:06:44:08 +0800] "GET /robots.txt HTTP/1.1" 200 394 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +Meet our crawlers)" 
 61.175.193.51 - - [25/Dec/2011:07:02:28 +0800] "GET /home/list HTTP/1.0" 302 399 "" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MASN)" 
 61.237.230.38 - - [25/Dec/2011:09:55:55 +0800] "GET /blog/archive/?year=2010 HTTP/1.1" 200 8467 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; Tablet PC 2.0; InfoPath.3; MS-RTC LM 8; 360SE)" 

# 開發過PHP的CLI程序嗎? 
# 你做的哪個東西自己都覺得自己很NB? 
# 有哪些好書可以推薦一下嗎? 
## Book List 

== Javascript == 
# 你是怎么接觸并學習js的? 
# 在團隊中,采用什么機制來解決命名沖突的? 
# 采用什么辦法來保證代碼質量的? 
# 知道jslint嗎?使用過嗎?用多長時間了?怎么和日常的開發工作結合在一起的? 
# jQuery熟嗎?寫過jQuery的插件嗎? 
# 有哪些好書可以推薦一下嗎? 
## Book List 
> js語言精粹 
> [JavaScript高級程序設計(第2版)].(美)澤卡斯 
> High Performance JavaScript - Nicholas C. Zakas 

== Linux == 
# linux熟嗎?使用多長時間了? 
# 常用工具: vim,grep,sed,awk,wget,curl...熟嗎? 
# 寫過shell腳本嗎? 
# 管理過服務器嗎? 
# 有哪些好書可以推薦一下嗎? 
## Book List 
> [sed與awk(第二版)].(美)多爾蒂,(美)羅賓斯 

== Apache == 
# 會配置虛擬主機嗎?有幾種配置方法?(基于ip的,基于端口的,基于域名的,混雜的) 
# 瀏覽器緩存是怎么使用的?(mod expires) 

== MySQL == 
# 你接觸到的最大的mysql數據庫表是多大?(行記錄數大概是什么量級的?) 
# 使用的是哪種存儲引擎(MyISAM, InnoDB, ...) 
# 出現性能瓶頸時是如何解決的? 
# 自己創建過索引嗎?是怎么決定要在某些列上創建索引的? 
# 關于索引,清楚MyISAM與InnoDB的區別嗎? MyISAM的主鍵索引和其它索引有區別嗎? InnoDB的主鍵索引和其它索引有區別嗎? 
# 有哪些好書可以推薦一下嗎? 
## Book List 
> [MySQL技術內幕InnoDB存儲引擎].姜承堯 
> [高性能MySQL(第2版)中文版].施瓦茨 

== 其它 == 
# 數據結構和算法怎么樣?覺得有用嗎?在什么地方用到了?有什么好書推薦一下嗎? 
# 除了PHP,還有哪門語言是你的強項,可以拿來用在production中的? 
# 工作之余做過什么有意思的項目嗎? 
# 有好的技術博客推薦一下嗎? 
風雪之隅-Laruence的博客
酷殼 – CoolShell.cn
黑客志 | Hacker的社交禮儀與自我修養
# csdn的用戶名密碼泄露出來一批,有643W多(其格式是username # password # email),現在想把它導到數據庫里,你有什么辦法?


 

轉自 http://www.zhihu.com/question/19757909  (何廣宇)


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()