基礎題
場景:
你入職了一家新公司.
上班第一天,接待人給你安排好了座位,然后拉過來一臺沒拆封的新電腦.
你把電腦連接好之后,按下電源....
好吧,這真是一臺新電腦,里邊竟然內置了個DOS系統!!
你找同事拿來了操作系統光盤/U盤(這個無所謂了).半個小時后,操作系統安裝好了.
-
第一件事就是要把LAMP環境搭建起來,這樣才好工作.簡述搭建LAMP環境過程中的注意點.
-
LMAP環境搭建好之后,你拿到了第一個開發任務.給公司內部開發一個通用審批系統.公司內部有一個DNS服務器,上邊已經配好了這個系統的域名,叫approving.great-company.com,并指向了你本機的ip. 你嘗試訪問了一下http://approving.great-company.com ,出現了apache經典的It Works頁面,域名是生效的.你打算在桌面新建一個目錄叫approving并在這個目錄下完成這個系統的開發.如何配置apache使得訪問http://approving.great-company.com的時候能夠打開approving/index.php
-
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還沒有審批,那么系統就再發一封郵件催一下.
這個該怎么實現?
進階題
-
有哪些得意之作?
-
是否實踐過PHP編碼規范?
-
如何做質量控制?
-
如何做測試?
-
js命名空間的作用?
-
是否用過jslint?
-
是否寫過jQuery plugin?
-
Linux使用多長時間了?
-
常用工具: vim, grep, sed awk, wget, curl
-
寫過哪些shell腳本?
-
做過服務器管理嗎?
-
接觸到的Mysql數據庫表最大是多少行記錄?
-
使用哪種存儲引擎?
-
出現性能瓶頸如何定位解決?
-
MyISAM與InnoDB索引的區別?InnoDB的Primary Index 和 secondary Index有何區別?
-
你手里有300W份簡歷的工作經歷和教育背景?如何從中提取出學校/專業/公司?
-
學習一個新框架如何入手?
------------------------------------------------------------------------------------
為什么我更新了面試題?
招研發的必須實打實的上代碼,我的確遇到了一些面試時回答問題還不錯,一寫代碼讓人頭疼的工程師.
所以招人時分了兩個層次:
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>)
http://www.fake.com:80 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)"
http://site1.fake.com:80 61.175.193.51 - - [25/Dec/2011:07:02:28 +0800] "GET /home/list HTTP/1.0" 302 399 "http://www.a.com/" "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)"
http://site2.fake.com:80 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),現在想把它導到數據庫里,你有什么辦法?
文章列表