分类目录归档:程序相关

C,Python,环境配置等

什么是PHP高级工程师

众观各大公司在PHP高级工程师的招聘要求,以个人的理解,将共同点抽象出来,得此文,如有与君意见之不同,请留言讨论。

关键词

PHP、高级、系统架构设计、OOP、网络协议、沟通、Linux

定义

以前或现在以PHP为主要开发语言,具有若干年以上工作经验,对OOP有深入认知,掌握各种网络通讯协议,熟练掌握数据库及WEB其它相关知识 能够独立完成可扩展系统架构设计的工程师

具体来说,需要具备以下技能:

  1. 精通PHP 是精通哦
  2. 深入了解面向对象的思想,熟悉常见设计模式
  3. 熟悉*nix系统,最好对其内核有一些研究
  4. 对某一数据库有十分深入的认识,熟练掌握关系数据库理论
  5. 熟悉HTTP、TCP/IP等网络通讯协议
  6. 精通构架设计的理论、实践和工具,并掌握多种参考构架、主要的可重用构架机制和模式
  7. 良好的代码风格,清晰的编程思路

其它说明

  • 学历 学历在各大公司都有明确要求,一般都是本科及其以上,也许有其它相当牛的不在此要求限制之列,但是毕竟这只是少数,要过HR那关,可能得特批。
  • C/C++ 在招聘高级工程师时,一般都会有对这块的要求,但是都是以具有相关经验者优先出现
  • 文档 包括项目中的设计文档,在编码期间的注释能力等,这个属于基本要求
  • 英文读写能力 至少要熟练的文档阅读能力,至于英语的口头表述,只有极个别公司或外企需要
  • 算法和数据结构 强烈建议具备,这属于基本功之一;不是每个公司都会要求,如果公司不要求,也算是亮点之一
  • 软件工程 有些公司要求有相应的软件工程思想,或者有项目管理经验,这与招聘的公司岗位相关
  • 沟通能力 具备良好的沟通能力和理解能力,有良好的团队合作能力,这个应该属于基本要求之一
  • 分布式系统 这个一般属于附加分项,但至少有使用分布式缓存或数据库的经验。
  • 网络编程 部分公司有要求,但是在面试的时候应该都是会问的,所以这个也属于必备技能之一
  • 优化 数据库优化,代码优化等,这个应该属于面试必备知识点,但这与经验有较大关系
  • 业内的名气 blog/出书/演讲/开源项目/…

个人感想

思考所有的能力和要求,发现PHP高级工程师与PHP其实没有多大关系,关键在于程序员(programmer)整个知识体系的构建。 无论是从操作系统、协议、数据库等硬性要求,还是从文档、英文、沟通等软件要求来看,这不仅仅是一个PHP程序员, 它所要表达的是后面五个字:高级工程师。 当达到一定的层次,做技术需要追求广度和深度,有自己的特长,有一个完善的知识体系。

语言只是一门工具,不应该局限于一门语言,但必须精通一门语言。 没有万能的语言,每种语言都有其存在的意义,或者说都有其适用场景,选择最合适的语言,这也是项目开始时需要规划的内容之一。

以上的内容纯属个人想法,如有雷同,不胜荣幸!

HTTP协议的过期模型和由过期时间想到的

HTTP为提高性能,减少网络传输的信息量,从而使用了缓存。
HTTP协议缓存的目标是去除许多情况下对于发送请求的的需求和去除许多情况下发送完整请求的需求。
在http协议中使用截止模型和证实模型来实现缓存。
【截止模型】
目的:减少操作的大量网络来回奔波,或者说减少http的请求数。
避免请求的主要机制是服务器提供明确的在将来截止的时间,表示响应可满足后续请求,即可以在不联系服务器而返回更新的响应。
在服务器指定了截止时间,在截止时间之前实体不会改变,此时需要慎重考虑截止时间。
实现方式:服务器可以使用Expires头部,也可以使用Cache-Control头部的max-age指令来指定明确的截止时间。
其中max-age指令的优先级高于Expires
【证实模型】
目的:减少网络带宽的损耗
这里的证实是指在在请求与应答中存在一些缓存的条目,这些条目在请求与应答中传递,判断是否过期,从而判断是否重传内容。
与截止模型相关,这里还有一次请求,只是如果缓存有效,则不会重传内容。
实现方式:Last-Modified实体头部域经常用于证实模型,如果实体在Last-Modified值以来没有修改过,则可以认为此缓存有效。
ETag头部域提供“不透明”的证实。
【由过期时间想到的】
近来看协议,看源码,过期时间或者超时总会频繁出现。
思考,为什么在这种大型的架构中,过期时间这样一个限制是如此频繁的出现。又或者我们在cookie或session中所看到的expire,缓存中的时间限制等等。这些都是我们经常可以遇到的。
如果我们把这些东西赋予生命,那么我们所设置的这些都是他们的生命终止的时候。
为了保证程序或信息流的生命的完整性,我们希望他们在出生后,只能存活这样一段时间,在我们可以控制的范围内自然的消散?
那对于内存的分配和新的垃圾收集机制,PHP中使用了引用计数,如果使用过期时间,在某个特定的时间内有效,又或者我们无法控制用户所定义的变量的生命周期,所以我们无法以过期时间来实现?
前面提到了session,PHP的session存储方案中,以文件存储为例,设置了过期时间。以文件的最后修改时间为准。
一次http请求,如果缓存 在客户端的内容还没有过期,则直接使用客户端的内容,这是http协议的一种过期模型。这是一个纯粹的以过期时间缓存的模型。不存在再次的交互。
在应用中提到过期,也许我们会看到缓存这个东西。缓存,以一种更快的介质或更短的距离取代较慢的介质或较长的传输距离的优化方式。
如果一个生命没有了完结的时候,它永生了,又当如何?守护进程,我们希望他会一直运行,那如何我们需要时时的中断这样的守护进程,如何管理?我们在做设计的时候如何处理?对于一个永不过期的缓存,如果我们需要将其清除掉,如何处理?清除这一个?以相同 的key重新设置?
以上的http协议的过期模型来自 RFC2616
后面是乱想的…
从年前开始,一直在和朋友一起写TIPI系统文章,而blog的更新也就放在一旁了。这里说明一下。

HTTP为提高性能,减少网络传输的信息量,从而使用了缓存。

HTTP协议缓存的目标是去除许多情况下对于发送请求的的需求和去除许多情况下发送完整请求的需求。

在http协议中使用截止模型和证实模型来实现缓存。

【截止模型】

目的:减少操作的大量网络来回奔波,或者说减少http的请求数。

避免请求的主要机制是服务器提供明确的在将来截止的时间,表示响应可满足后续请求,即可以在不联系服务器而返回更新的响应。

在服务器指定了截止时间,在截止时间之前实体不会改变,此时需要慎重考虑截止时间。

实现方式:服务器可以使用Expires头部,也可以使用Cache-Control头部的max-age指令来指定明确的截止时间。

其中max-age指令的优先级高于Expires

【证实模型】

目的:减少网络带宽的损耗

这里的证实是指在在请求与应答中存在一些缓存的条目,这些条目在请求与应答中传递,判断是否过期,从而判断是否重传内容。

与截止模型相关,这里还有一次请求,只是如果缓存有效,则不会重传内容。

实现方式:Last-Modified实体头部域经常用于证实模型,如果实体在Last-Modified值以来没有修改过,则可以认为此缓存有效。

ETag头部域提供“不透明”的证实。

【由过期时间想到的】

近来看协议,看源码,过期时间或者超时总会频繁出现。

思考,为什么在这种大型的架构中,过期时间这样一个限制是如此频繁的出现。又或者我们在cookie或session中所看到的expire,缓存中的时间限制等等。这些都是我们经常可以遇到的。

如果我们把这些东西赋予生命,那么我们所设置的这些都是他们的生命终止的时候。

为了保证程序或信息流的生命的完整性,我们希望他们在出生后,只能存活这样一段时间,在我们可以控制的范围内自然的消散?

那对于内存的分配和新的垃圾收集机制,PHP中使用了引用计数,如果使用过期时间,在某个特定的时间内有效,又或者我们无法控制用户所定义的变量的生命周期,所以我们无法以过期时间来实现?

前面提到了session,PHP的session存储方案中,以文件存储为例,设置了过期时间。以文件的最后修改时间为准。

一次http请求,如果缓存 在客户端的内容还没有过期,则直接使用客户端的内容,这是http协议的一种过期模型。这是一个纯粹的以过期时间缓存的模型。不存在再次的交互。

在应用中提到过期,也许我们会看到缓存这个东西。缓存,以一种更快的介质或更短的距离取代较慢的介质或较长的传输距离的优化方式。

如果一个生命没有了完结的时候,它永生了,又当如何?守护进程,我们希望他会一直运行,那如何我们需要时时的中断这样的守护进程,如何管理?我们在做设计的时候如何处理?对于一个永不过期的缓存,如果我们需要将其清除掉,如何处理?清除这一个?以相同 的key重新设置?

以上的http协议的过期模型来自 RFC2616

后面是乱想的…

从年前开始,一直在和朋友一起写TIPI系统文章…

使用PHP实现堆排序

使用PHP实现堆排序
堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。

“堆”定义
  n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
  (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ n) //ki相当于二叉树的非叶结点,K2i则是左孩子,k2i+1是右孩子
  若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:
  树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。

“筛选法”调整堆
  R[low]的左、右子树(若存在)均已是堆,这两棵子树的根R[2low]和R[2low+1]分别是各自子树中关键字最大的结点。若R[low].key不小于这两个孩子结点的关键字,则R[low]未违反堆[性质,以R[low]为根的树已是堆,无须调整;否则必须将R[low]和它的两个孩子结点中关键字较大者进行交换,即R[low]与R[large](R[large].key=max(R[2low].key,R[2low+1].key))交换。交换后又可能使结点R[large]违反堆性质,同样由于该结点的两棵子树(若存在)仍然是堆,故可重复上述的调整过程,对以R[large]为根的树进行调整。此过程直至当前被调整的结点已满足性质,或者该结点已是叶子为止。上述过程就象过筛子一样,把较小的关键字逐层筛下去,而将较大的关键字逐层选上来。因此,有人将此方法称为”筛选法”。
以上来自百度百科


以下为PHP的堆排序实现。
siftup函数是在x[1..n-1]为堆,在x[n]中放置一个任意的元素时,重新获得堆的操作。
它尽可能的将新元素向上筛选,向上筛选是通过交换该结点与其父结点来实现的。

siftdown函数是在x[1..n]是一个堆,在x[1]中放置一个任意的元素时,重新获得堆的操作。
它是一个向下筛选的过程,将顺序不对的元素和比它小的子结点交换。

通过siftup函数,加入n个元素,构造堆
通过siftdown函数,每次取堆顶端的数,然后重新构造堆,如此迭代,直到所有的数据都取出,因为堆顶一定是这个堆中最小的值,所以最后一定可以得到一个有序的序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
/**
 * 堆排序
 * @author phppan.p#gmail.com  http://www.phppan.com
 * 哥学社成员(http://www.blog-brother.com/)
 * @package test
 */
 
/**
 * 向上筛选元素
 * 将元素$n添加到堆中,调整构建新的堆
 */
function siftup(&$seq, $n) {
	$i = $n;
 
	while($i > 1) {
		$p = floor($i / 2);
		if($seq[$p] <= $seq[$i]) {
			break;
		}
		list($seq[$p], $seq[$i]) = array($seq[$i], $seq[$p]);
 
		$i = $p;
	}
}
 
/**
 * 向下筛选元素
 */
function siftdown(&$seq, $n) {
	$i = 1;
 
	while(1) {
		$c = $i * 2;
 
		if($c > $n) {
			break;
		}
 
		/* $c 为左结点 $c + 1 为右结点*/
		if($c + 1 <= $n) {
			if($seq[$c + 1] < $seq[$c]) {
				$c++;
			}
		}
 
		if($seq[$i] <= $seq[$c]) {
			break;
		}
 
		/* 将$seq[$i]和它的两个孩子结点中关键字较大者进行交换 */
		list($seq[$c], $seq[$i]) = array($seq[$i], $seq[$c]);
 
		$i = $c;
	}
}
 
 
 
/**
 * 堆排序
 * @param	array	$seq	待排序的序列
 */
function heapSort(&$seq) {
	$n = count($seq);
 
	for($i = 2; $i <= $n; $i++) {
		siftup($seq, $i);
	}
 
	for($i = $n; $i >= 2; $i--) {
		list($seq[1], $seq[$i]) = array($seq[$i], $seq[1]);
		siftdown($seq, $i - 1);
	}
}
 
/* 测试 */
$seq = array(1 => 9, 7, 2, 3, 1, 6);
heapSort($seq);
print_r($seq);
 
die();

heapSort使用了n-1次siftup和n-1次siftdown操作,其时间复杂度为O(nlogn)