• web 全栈 学习 1 工程师成长思路图



    第一部分: 技术的三个阶段

    实现 ---> 借鉴 ---> 优化

    实现:为了实现功能,不考虑可读性。
    借鉴:阅读开源代码,开源程序,学到编程思想。
    优化:可读性,可执行。

    阶段一:实现
    多做事,多接触技术

    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

    ------------------------------------------------------------
    ------------------------------------------------------------
    ------------------------------------------------------------





  • 相关阅读:
    深入浅出Tomcat/2
    深入浅出Tomcat/1- 来历和配置文件
    深入浅出:HTTP/2
    深入浅出:5G和HTTP
    深入浅出:远离法律风险,必须了解开源项目许可证
    深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么
    深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么
    深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么
    一个微信群的现状
    Hbase原理、基本概念、基本架构
  • 原文地址:https://www.cnblogs.com/yhdsir/p/4935575.html
Copyright © 2020-2023  润新知