基础题

场景:

你入职了一家新公司.

上班第一天,接待人给你安排好了座位,然后拉过来一台没拆封的新电脑.

你把电脑连接好之后,按下电源....

好吧,这真是一台新电脑,里边竟然内置了个DOS系统!!

你找同事拿来了操作系统光盘/U盘(这个无所谓了).半个小时后,操作系统安装好了.

    1. 第一件事就是要把LAMP环境搭建起来,这样才好工作.简述搭建LAMP环境过程中的注意点.

    2. 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

    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>)

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),现在想把它导到数据库里,你有什么办法?


转自 http://www.zhihu.com/question/19757909  (何广宇)

最新文章

  1. 对Live Writer支持的继续改进:设置随笔地址别名(EntryName)
  2. 熟用js中的Date
  3. corefile 设置
  4. Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析
  5. JDIC 访问Web时NullPointerException
  6. golang level
  7. HDU2222 Keywords Search(AC自动机模板)
  8. 修改DevExpress中英文提示,将英文改为中文
  9. Attribute特性验证模型model
  10. mysql left用法
  11. access 2007 vba (亖)
  12. java断言
  13. struts2+ajax实现异步验证
  14. 在FFMPEG中使用libRTMP的经验
  15. Qt文件系统之QFile
  16. kettle连接mysql数据库并进行数据分析
  17. mysql之 表数据存放路径非datadir目录
  18. docker logs 查看实时日志
  19. [转载]linux中sed的用法
  20. 设置root密码,su与sudo的区别

热门文章

  1. 如何关闭Windows10系统更新
  2. 1008 Envy(好题¥)
  3. xss攻击的分类
  4. JVM_总结_03_Java发展史
  5. hadoop2.5.2 安装与部署
  6. PNG24在ie6下的完美解决方法!(DD_belatedPNG)
  7. 使用kaptcha验证码组件操作演示
  8. VS软件版本号定义、规则和相关的Visual Studio插件
  9. 【HTML代码】访问页面时,拨打页面中的电话号码
  10. IE版本的标准定义