第一部分: 技术的三个阶段php
实现 ---> 借鉴 ---> 优化css
实现:为了实现功能,不考虑可读性。
借鉴:阅读开源代码,开源程序,学到编程思想。
优化:可读性,可执行。html
阶段一:实现
多作事,多接触技术前端
一、多作事
多接触各类类型的网站:门户、SNS、BBS、商城等等。
多接触各方面的技术:前端、后端、服务器等。
什么没作过就是作什么。
这个阶段的程序员容易加班、熬夜。java
二、要接触各类技术node
前端技术
HTML,css,js,
phonegap,
cocos2d,
response
核心问题:特效python
后端技术
PHP,java,
python,nodejs
OPP,MVC,AOP,
REST,SOA,
Webservice
核心问题:程序架构mysql
系统底层
Linux,Apache,
nginx,mysql,LVS,
mongodb
核心问题:高并发nginx
阶段二:借鉴
善于分析别人的代码git
五种分析代码的方法:
看文档 开发文档、phpDocument
作调试 Xdebug
自带函数 debug_backtrace
debug_print_backtrace
var_export
var_dump
get_included_files
SocketLog 一、不能var_dump的地方: ajax、api;
二、var_dump了也看不见的地方:cron脚本、队列。
思惟整理 UML图像、思惟导图(xmind)
分析代码方法一:看文档
看代码
---> 编程思想
看文档
注释提取成文档
phpDocumentor 官网地址:http://www.phpdoc.org/
四种安装方法
生成文档的命令:
phpdoc -o HTML:frames:earthli -d ./code -t./docs
在代码目录内:输入以上命令
-o 生成文档的风格
-d 代码的目录
-t 生成文档的目录
分析代码方法二:作调试
Xdebug
具体使用教程:https://netbeans.org/kb/docs/php/debugging_zh_CN.html
分析代码方法三:PHP自带函数
打印调用栈:
debug_backtrace(); 打出调用栈,能够查看调用的文件和方法,返回值。
debug_print_backtrace(); 打出调用栈,能够查看简单的调用栈,返回值。
ThinkPHP的执行流程:
index.php 加载 ThinkPHP
ThinkPHP 执行 Think:start()
Think.class.php 中执行 App:exec()
App.exec() 中用反射方法调用了控制器
输出变量:$arr=array('a'=>'aaa', 'b'=>'bbb');
echo $arr; ---> var_dump($arr); //能够看到结构
//记录日记结构
//var_export 变量原样输出
file_put_content('./log.log', $arr); ---> file_put_content('./log.log', var_export($arr, true), FILE_APPEND);
获取全部加载的文件 get_included_files() 返回值
分析代码方法四:SocketLog
用SocketLog作微信调试
用户 ->发消息-> 微信 ->请求接口-> 服务器
用户 <-显示给用户<- 微信 <-返回内容(xml)<- 服务器
var_dump调试 -> 服务器
SocketLog原理:
php程序 -> WebSocket -> 浏览器
php程序 -×-> 浏览器
SocketLog 使用方法:
浏览器 安装插件
设置插件
websocket 启动websocket服务:
node sever/index.js
php程序 导入类库
include 'SocketLog.class.php';
配置设置
slog($arr, 'set_config');
发送日志
slog($log[,type])
Github地址:https://github.com/luofei614/SocketLog
分析代码方法五:思惟整理
思惟导图。
软件:xmind
UML图像:理清类的关系
阶段三:优化
------------------------------------------------------------
可读性,安全性,可扩展性,服务器优化
------------------------------------------------------------
可读性:
1:命名规范:函数名,类名,变量名,数据库表名,字段名不要是拼音声母缩写,尽可能用英文
2:注释规范:勤于写代码注释,对与逻辑复杂的代码段能够先注释后写代码。注释尽可能符合phpdocument的规范。调试代码加上//debug注释。
更多编码规范可参考discuz的编码规范:
http://open.discuz.net/?ac=document&page=dev_coderule
------------------------------------------------------------
可扩展性:(高聚合、低耦合)
可扩展性.png
推荐书:《深刻PHP面向对象、模式与实践》《程序员修炼之道》
------------------------------------------------------------
安全性:
xss:
Cross-site scripting 跨站脚本攻击,可用于盗号
由于网站对用户输入的数据没有严格过滤,用户能够输入js代码,致使页面能执行js代码。用户js代码得到用户的cookie。
Sql注入:
由于对用户输入的内容没有严格过滤,用户输入的内容又做为sql语句查询条件时,致使用户能执行本身编写的sql语句,得到网站的数据中的数据。
CSRF:
Cross-site request forgery跨站请求伪造,可用于刷粉丝
由于网站没有对用户提交数据的来源进行判断,致使黑客能够在第三方网站用js自动提交表单的操做。
------------------------------------------------------------
数据库、服务器优化
一、使用缓存
启用php的APC模块对OPCODE进行缓存。
用Memcache, Xcache等对数据库查询结果进行缓存。
Apache, nginx, varnish 等运行环境都有缓存模块
根据HTTP协议对用户浏览器设置缓存
二、数据库优化
选择好mysql引擎(myisam,innodb)
作好mysql索引优化,表结构优化,用explain进行分析
配置mysql配置文件,配置查询缓存 (query_cache_*) ,索引缓存 (key_buffer), 线程缓存 (thread_cache_size), 临时表大小 (tmp_table_size), 用 mysqlreport 分析
三、使用队列:耗时的程序能够用队列处理,用 gearman, redis
四、搭建分布式环境 (nginx, LVS), 搭建主从读写分离的数据库。
五、压缩文件:
Apache, nginx 运行环境有压缩模块, PHP能够设置配置项 zlib.output_compression, 前端压缩js,css文件,使用css sprite 方法切图。
六、使用云计算
推荐书:《海量运维、运营规划之道》、《构建高性能Web站点》
------------------------------------------------------------
------------------------------------------------------------
第二部分:技术团队的管理
------------------------------------------------------------
开发流程
分析
需求
陈述处理
怎么作
(按姓名拼音排序)
作什么
难点
demo
优雅降级(例:缓存)
设计
数据库口
接口 (十分详细,如何查表,判断逻辑)
前端页面
编码
排期
正交设计
防卫式编程
测试
人工测试
CodeReview
单元测试 (代码发布系统)
网站报警
(定时程序检测状态。状态不对,就发邮件,或者短信。甚至拨打电话)
(端口,状态码,链接数,监听指标不少,不止errorlog)
(异常状况监察机制)
------------------------------------------------------------
分析和设计在Xmind中完成
用trello排期(划分功能,分配工做)
------------------------------------------------------------
------------------------------ 重点 ------------------------------
造成团队开发规范(文档)
checklist
开发前,用xmind分析整理
开放前,发现产品有特殊状况下缺乏的页面、文案及时反馈
开发前,简历git分支,注意更新master和develop
开发中,及时更新看板,记录时间
开发中,写好注释,复制逻辑要先写注释后写代码,相同逻辑//@same 注释,调试代码//debug 注释,特殊逻辑要写注释说明
开发中,注意安全问题。变量在sql语句拼接时要过滤,SQL关键词大写,表名、字段名用反引号括起,值用引号括起。
开发中,注意操做去重,如驳回操做前判断是否为能驳回的状态
开发中,开发过程注意解决报警错误
开发中,针对少数状况写报警 ,如:数据量
开发中,遇到问题第一反应是找问题
开发后,完成后运行单元测试,作的没有语法错误,sql语句错误,产品逻辑错误。
开发后,测试前codeview
开发后,按产品流程测试(创建测试checklist,多个接口按产品逻辑测试,若是有前端在前端上面测试,注意边缘状况)
开发后,项目上线前运行端对端测试
开发后,修复bug时要先本身重现错误
附加注意项:1.及时删除无用代码。2.及时重构有问题的代码
*多赞赏,少批评
单元测试写的很好,下次注意把注释写好就能够了。
*严重问题,出现一次说一次。
变量没有过滤。
*不要说不对,要说能够这么用另一种方法。
*对上司不要问为何,要问是否是。
------------------------------------------------------------
网站Wanning报警
register_shutdown_function('jd_fatal_error');
set_error_handler('jd_error_handler');
function jd_fatal_error()
{
if($e = error_get_last()) {
swith($e['type']) {
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
js_error_handler($e['type'], $e['message'], $e['file'], $e['line']]);
break;
}
}
}
function jd_error_handler($errno, $errstr, $errfile, $errline){
}
------------------------------------------------------------
业务逻辑报警
$user = db_find('seeker', '`uid`, `realname`, `email`, `token`', "`uid`='".s($uid)."'");
if(empty($user))
{
jdlog("id为".intval($uid)."的 recomment_user表记录查询不到", 'recommend_weixinlogin', true, true);
}
$emails = get_data("SELECT * FROM subscribe WHERE `email_statsu` = 1 AND `unsubscribe` = 0");
if(count($email)>5000)
{
jdlog('##订阅邮箱大于5000了,队列数过大,须要考虑分批加入队列##','subscribe_big', true, true);
}
------------------------------------------------------------
GeekCompany
报警发到slack
国外的软件,接收消息的东西,能够定义消息的类型。
有app,PC的软件。
有带用户信息,能够联系用户。能够留住用户,告诉用户错误解决了,能够回来继续浏览了。能够观看用户的行为。
------------------------------------------------------------
管理方面的书
《程序员修炼之道》
《带人的技术》
《精益创业》
《精益创业实战》
《敏捷开发一千零一晚上》
------------------------------------------------------------
------------------------------------------------------------
总结:
工程师的成长
技术
实现 -> 多作事
借鉴 -> 5种分析代码的方法:
看文档 phpDocument
作调试 Xdebug
php自带函数
debug_backtrace
debug_print_backtrace
var_export
var_dump
get_included_files
SocketLog
思惟整理
优化 -> 可读性、可扩展性、安全性、服务器优化
管理
分析 xmind
设计 xmind
编码 trello
测试 slack
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------