第一部分: 技术的三个阶段
实现 ---> 借鉴 ---> 优化
实现:为了实现功能,不考虑可读性。
借鉴:阅读开源代码,开源程序,学到编程思想。
优化:可读性,可执行。
阶段一:实现
多做事,多接触技术
1、多做事
多接触各种类型的网站:门户、SNS、BBS、商城等等。
多接触各方面的技术:前端、后端、服务器等。
什么没做过就是做什么。
这个阶段的程序员容易加班、熬夜。
2、要接触各种技术
前端技术
HTML,css,js,
phonegap,
cocos2d,
response
核心问题:特效
后端技术
PHP,java,
python,nodejs
OPP,MVC,AOP,
REST,SOA,
Webservice
核心问题:程序架构
系统底层
Linux,Apache,
nginx,mysql,LVS,
mongodb
核心问题:高并发
阶段二:借鉴
善于分析别人的代码
五种分析代码的方法:
看文档 开发文档、phpDocument
做调试 Xdebug
自带函数 debug_backtrace
debug_print_backtrace
var_export
var_dump
get_included_files
SocketLog 1、不能var_dump的地方: ajax、api;
2、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自动提交表单的操作。
------------------------------------------------------------
数据库、服务器优化
1、使用缓存
启用php的APC模块对OPCODE进行缓存。
用Memcache, Xcache等对数据库查询结果进行缓存。
Apache, nginx, varnish 等运行环境都有缓存模块
根据HTTP协议对用户浏览器设置缓存
2、数据库优化
选择好mysql引擎(myisam,innodb)
做好mysql索引优化,表结构优化,用explain进行分析
配置mysql配置文件,配置查询缓存 (query_cache_*) ,索引缓存 (key_buffer), 线程缓存 (thread_cache_size), 临时表大小 (tmp_table_size), 用 mysqlreport 分析
3、使用队列:耗时的程序可以用队列处理,用 gearman, redis
4、搭建分布式环境 (nginx, LVS), 搭建主从读写分离的数据库。
5、压缩文件:
Apache, nginx 运行环境有压缩模块, PHP可以设置配置项 zlib.output_compression, 前端压缩js,css文件,使用css sprite 方法切图。
6、使用云计算
推荐书:《海量运维、运营规划之道》、《构建高性能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
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------