前言有很多文章教你如何面试和跳槽。跳槽之后如何快速熟悉项目,通过试用期。每个人进入工作都会面临一个问题,那就是对项目的熟悉。如此熟悉,相信大家都是看到一大堆代码堆在自己面前,不知从何下手。如果有老同事讲解,有完善的文档可供参考,入手会很方便。但是根据我入职多年的经验来看,大部分公司的项目文档都是不完整的。你一入职,你的老同事就走(是的,你要接锅);除了HR姐的入职培训外,没有更多信息;在这种情况下,如何快速启动项目。这里的代码部分以PHP项目为例,其他语言的读者也可以借鉴。熟悉一个项目是什么意思?项目是为了解决问题而存在的,所以熟悉一个项目就是了解它能解决什么问题。然后您需要询问项目——提出请求。让我们看看我们能得到什么样的答案——回应。那么我们可以问什么问题呢?比如安卓APP问:现在手机壳是什么颜色的?我打算根据这种颜色更换墙纸。显然,该项目无法回答向该项目提出的此类自我问题。那我们得到什么响应(response),我得到它返回给我的参数。哦,不光是这些,这个后面它查阅了哪些数据,或者说修改了哪些数据,还给别的项目发了请求或者消息,这些都是这个项目的响应。所以要熟悉项目,我们需要知道:可以解决哪些问题,在解决问题的过程中做了哪些工作?将项目视为黑匣子。这里我们抽象一下。参考冯·诺依曼结构。不管我们的http服务,Api服务,还是Rpc服务,我们都可以抽象成上面的模型。http服务的输入是http请求,operator是php-fpm程序,php代码控制其性能,存储是磁盘、内存或者redis,输出是http响应。Rpc服务的输入是TCP报文,计算器是php常驻程序。MySQL服务也可以通过这种方式进行抽象。输入是MySQL格式编码的TCP报文,计算器和控制器是MySQL程序,存储是磁盘和内存。输出的也是TCP报文,然后在php程序中对数据进行解码。那么对项目的熟悉程度可以抽象为:了解系统的I/O,什么是输入输出?一个项目计算器,控制器,就是这个项目的程序和代码。存储就是数据。就像一团团的线头,不知从何说起,如果你能马上明白是怎么回事,那么看完这篇你就可以关闭本文了。剥茧的时候,我们会先找一个线程作为开始,代码需要找到输入。网页和APP在项目中都是所见即所得的输入,也是最容易理解的。从这个方向输入可以看到用户用例。这里我们使用php作为操作符,php代码作为控制器。PHP内部实现了一个Zend虚拟机,可以将PHP代码编译成opcode并运行。可以类比为计算器生成的日志、图片等文件的写入作为项目中的存储。数据,无论是本地的还是远程的,我们都用作输出。(输出数据存储,输出数据查询请求)。特别是对于关系数据库,系统建模可以从关系结构中推断出来。一个特定的项目为用户提供服务。在多服务架构中,它也会是一个请求发送者,它发送的请求作为输出。比如:Rpc请求,Redis操作。当你熟悉项目后,第一时间开始啃代码是非常困难的。这就是把它当成一个黑盒子,从什么样的输入,会得到什么样的输出,开始了解系统。只有中间代码才做第一次不用担心的事情。就像TDD一样,需求收到了,中间的实现过程就没那么在意了。这样的参数输入能得到这样的数据返回,这段代码的happy-path就认为通过了。那么接下来,我就开始给大家讲解如何从项目、输入、输出、存储来快速熟悉项目。输入是什么?http请求、tcp、websocket、自定义rpc请求。有消息,cron都在输入。这里我想到了ServerLess,它只关心SQL、Redis、Curl、RPC、文件写入的输入输出,应用发送的外部请求全部输出。配置日志记录Http日志以在浏览器端启用请求日志记录。例子:这里只抓取了http请求,还有一个容易被忽略的websocket。您可以通过WS标签过滤和查看它。在浏览器端开启http请求,相比抓包,避免了添加https证书的问题。在服务器上启用日志##文件:/etc/nginx/nginx.confhttp{...##这是默认日志log_formatmain'$remote_addr-$remote_user[$time_local]''"$request"$status$bytes_sent''"$http_referer""$http_user_agent""$gzip_ratio"';##注意一个新的$request_bodylog_formatlog_requets'$remote_addr-$remote_user[$time_local]''"$request""$request_body"$status$bytes_sent''"$http_referer""$http_user_agent""$gzip_ratio"';...}nginx的access_log会记录GET请求和参数,POST请求需要额外配置。这里我们新增了一种新的日志格式——log_requets。##文件:/etc/nginx/conf.d/www.confserver{...root/usr/share/nginx/html/xiunobbs/;##这里使用新格式日志access_log/var/log/nginx/access_xiuno.loglog_requests;error_log/var/log/nginx/error_xiuno.log;...例子:图中最后一行是POST,日志请求记录了提交的内容。消息队列和Cron输入消息队列一般是通过查看日志记录来检查的。cron除了一般的Linuxcrontab外,还有一些特殊的cron管理工具。这需要向IT运维部门学习。SQL日志以MySQL为例。数据库软件会有日志记录。为了调试,我们打开一般操作日志。这样就可以记录所有提交到数据库的sql记录。##file/etc/mysql/my.cnfgeneral_log_file=/var/log/mysql/mysql.loggeneral_log=1log_output=FILE配置好,重启数据库,然后运行项目记录代码的SQL操作。例子:对于bin-log,这里只记录编辑操作,不记录查询操作。Redis日志监控是一个redis调试命令。输入后,当前窗口会返回redis处理的每条命令,可以帮助我们了解redis上发生了什么。Redis没有任何配置将操作命令记录到日志中。Redis可以记录一些服务状态变化日志,也可以记录慢速日志。登录redis-cli,然后输入monitor,\n这里我们可以使用这个命令将日志操作日志记录到文件中。nohupredis-climonitor>/var/log/redis/redis_op.log2>&1&Memecachedlog启动memcaced参数-vvmemcached-vv通过如下配置记录Memcached日志到文件中。memcached-m64-l0.0.0.0-p11211-umemcache-vv>/var/log/memcached.log2>&1RPClog如果web项目依赖RPC,需要记录。日志总结抓取上面的日志,可以知道web项目,收到了哪些请求,查了哪些DB,做了哪些Redis操作,请求了哪些RPC。但是,在三个窗口之间来回切换很不方便。接下来,我们想要在窗口中显示它们。tail-f-q/var/log/nginx/access_xiuno.log/var/log/mysql/mysql.log/var/log/redis/redis_op.log/var/log/memcached.log效果如下:ok这里是通过日志、配置请求来熟悉代码。AOP日志就到这里,这篇文章也差不多结束了。什么,你没有实现上面的日志方法。Http网关、数据库、消息队列都负责运维。他们做的日志级别不够,或者没有收集。.无法处理以上任何一项。那我们就得使出大招了,PHP-AOP这个利器。在不影响原有代码逻辑的情况下,注解方式侵入代码,无需DBA,运维配合可以通过PHP代码完成Requst、MySQL请求、Redis请求的日志记录。详见本人文章:在PHP7中使用AOP,此处不再展开。哦,如果您想熟悉的代码是函数式编程风格,那么Go!AOP无能为力。让我们将日志添加到代码中。文档和代码的关系Jira/RedMind/Tower/ZenTao/Teambition等也有很多资料,但这太依赖于公司制度和员工态度。有的人口头交流,软件只是用来记录状态;公司的员工都详细记录了一切,他们处理的所有任务都有自己的维基百科。代码和任务管理工具之间的链接一般在提交记录或分支名称中以任务ID号命名。这样就可以通过代码找到任务ID,然后查看当时的备注信息。最后,通过上面的操作,你已经能够通过日志了解这段代码做了什么,梳理出主要的业务。快速入门。至于参数校验和逻辑判断,总是会根据I/O操作的不同来实现。祝你早日熟悉公司业务,担当一职。
