使用 ApiDoc 编写接口文档
apidoc是一个 API 文档生成工具, apidoc 可以根据代码注释生成 web api 文档, apidoc 从注释生成静态 html 网页文档,不仅支持项目版本号,还支持 api 版本号, 项目约定使用此工具来生成接口文档
DemoUrl : https://start.wulicode.com/docs/web/
apidoc是一个 API 文档生成工具, apidoc 可以根据代码注释生成 web api 文档, apidoc 从注释生成静态 html 网页文档,不仅支持项目版本号,还支持 api 版本号, 项目约定使用此工具来生成接口文档
DemoUrl : https://start.wulicode.com/docs/web/
这里数据来自于 PHP 服务器获取到的数据, 并在这个数据基础上对 Header 进行说明并进行实地验证, 更多的 Header 的信息查看 HTTP Headers
服务器信息以及服务器接收到的响应数据
USER
: ‘duoli’当前程序的运行用户
HOME
: ‘/Users/duoli’当前程序的用户主目录
REDIRECT_STATUS
: 200PHP CGI 模式下的重定向状态, 使用 --enable-cgi-redirect
开启, 默认不能进行重定向
SERVER_PORT
: 80服务器端口号
SERVER_ADDR
: 127.0.0.1服务器地址, 默认是当前服务器的内网IP
REMOTE_PORT
: 59888当前连接到 Web 服务器所使用的端口号
REMOTE_ADDR
: 127.0.0.1当前用户的服务器地址, 如果服务器之间的数据传输启用了代理, 这里的地址会是最后一个代理的地址(如果需要对此地址进行覆盖改写, 需要从服务器中配置此变量)
SERVER_SIGNATURE
: ‘’包含了服务器版本和虚拟主机名的字符串
SERVER_SOFTWARE
: nginx/1.21.5当前服务器的版本号
GATEWAY_INTERFACE
: CGI/1.1当前网关接口
REQUEST_SCHEME
: http当前地址的请求协议
SERVER_PROTOCOL
: HTTP/1.1当前请求的传输协议
SERVER_NAME
: ‘127.0.0.1’当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定
DOCUMENT_ROOT
: ‘…./start/public’当前请求文件的真实目录
DOCUMENT_URI
: ‘index.php’
SCRIPT_NAME
: ‘index.php’ 当前请求的文件名称
REQUEST_URI
: ‘/misc/http/server’
当前请求的URI路径
CONTENT_LENGTH
: ‘’发送给接收方的消息主题的大小
CONTENT_TYPE
: ‘’用于指示资源的MIME类型
REQUEST_METHOD
: ‘GET’当前的请求方法
QUERY_STRING
: ‘’当前的查询字符串数据
SCRIPT_FILENAME
: ‘…/public/index.php’当前脚本的文件路径
FCGI_ROLE
: ‘’当前 FastCGI 的角色, 可以使用的角色为 [RESPONDER|AUTHORIZER|FILTER] FastCGI
PHP_SELF
: ‘index.php’当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar
的脚本中使用 $_SERVER['PHP_SELF']
将得到 /test.php/foo.bar。__FILE__
常量包含当前(例如包含)
文件的完整路径和文件名。
REQUEST_TIME_FLOAT
: ‘1648284041.8815’REQUEST_TIME
: ‘1648284041’当前请求时间
HTTPS
如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。Note: 注意当使用 IIS 上的 ISAPI 方式时,如果不是通过 HTTPS 协议被访问,这个值将为 off。
REMOTE_HOST
浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。 Note: 你的服务器必须被配置以便产生这个变量。例如在 Apache 中,你需要在 httpd.conf 中设置 HostnameLookups On 来产生它。参见 gethostbyaddr()。
PATH_TRANSLATED
当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 Note: 自 PHP 4.3.2 起,PATH_TRANSLATED 在 Apache 2 SAPI 模式下不再和 Apache 1 一样隐含赋值,而是若 Apache 不生成此值,PHP 便自己生成并将其值放入
SCRIPT_FILENAME 服务器常量中。这个修改遵守了 CGI 规范,PATH_TRANSLATED 仅在 PATH_INFO 被定义的条件下才存在。 Apache 2 用户可以在 httpd.conf 中设置 AcceptPathInfo = On 来定义 PATH_INFO。
SCRIPT_FILENAME
当前执行脚本的绝对路径。 Note: 如果在命令行界面(Command Line Interface, CLI)使用相对路径执行脚本,例如 file.php 或 ../file.php,那么 $_SERVER['SCRIPT_FILENAME']
将包含用户指定的相对路径。
PHP_AUTH_DIGEST
当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization” HTTP 头内容(以便作进一步的认证操作)。
PHP_AUTH_USER
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
PHP_AUTH_PW
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
AUTH_TYPE
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
PATH_INFO
包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息,如果存在的话。例如,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar
被访问,那么 $_SERVER['PATH_INFO']
将包含 /some/stuff。
全局代理
1 | # 设置代理 |
设置项目代理
1 | # 设置代理 |
给指定的 URL 设置代理
1 | [http "https://github.com/"] |
1 | # Checkout |
https 方式每次都要输入密码,按照如下设置即可输入一次就可以很长时间不用再手输入密码。
第一步:设置邮箱和密码
1 | $ git config --global user.email "your email" |
根据自己的需求执行下面的任意一条命令
第二步:
1 | # 设置记住密码(默认15分钟): |
运行相关命令, 输入账号密码, 如果正确则下次不必重新输入, 在 git 目录中存在两个文件 .gitconfig
, .git-credentials
, 里边放置的是凭证的信息
推送到 https://github.com/{username}/{project}.git
fatal: 无法访问 ‘https://github.com/...':Failed to connect to github.com port 443: Operation timed out
Completed with errors, see above
如果出现 raw.githubusercontent.com 之类的问题都可以采用此类方法解决
解决: hosts 中加入 ip 映射
查询真实 IP
通过 IPAddress.com, 输入 github.com 查询到真实 IP 地址, 然后修改 hosts 映射, 这里需要在本地 ping 下指定的查询出来的 ip , 否则也无法访问
1 | # 删除本地所有tag 并获取服务端所有 |
服务端 git pull 或 git checkout 报以下错误
Your local changes to the following files would be overwritten by merge
error: Your local changes to the following files would be overwritten by merge:
解决方案:
1 | $ git reset --hard HEAD |
安装插件 Paste To Aliyun Oss
安装之后可以使用 ctrl + cmd + v
来将图片直接粘贴到阿里云并把地址复制到 vscode 中
安装插件 Paste Image
安装之后可以使用 alt + cmd + v
来将图片直接粘贴到编辑器中,
直接粘贴的图片默认位置和命名并不符合我们的要求, 所以需要重新进行配置
配置日期的参考文档: Moment 格式
1 | { |
这样我们粘贴图片的之后就可以直接将文件粘贴到/_static/images/2020/0131/191053.png
类似目录下
1). 查找是否安装中文插件
2). 设置选择中文语言
打开 View -> Command Palette
搜索 Configure Display Language
, 选择 zh-cn
岗位职责
把需求或产品实现为用户可用的软件产品
任职资格
加分项目:
氛围足够轻松和舒适
1、能够独立解决 Windows/Linux 上的 web 运行环境中出现的问题,能够熟练对 Web 运行环境进行优化;
2、了解如何使用 C 语言进行 PHP Extension 的开发;
3、熟练使用 Memcache/Redis 等工具对 Web 应用进行优化;
5、可以熟练进行较为复杂的 shell 编程;
6、能够对 MySQL 等数据库进行性能优化,能够独立查找并解决 Web 应用中的性能问题;
7、深入理解面向对象软件开发原则,对设计模式有深入学习、研究;
8、熟练掌握常见的数据结构及算法;
9、对 ZF/YII/CI 等框架源代码有过研究,了解框架精髓;
1、熟练利用 C 语言进行 PHP Extension 的开发,并能够快速解决 Web 运行环境出现的复杂问题;
2、对 Linux 系统有深入的研究,可以解决 Linux 系统出现的复杂问题;
3、对 MySQL 索引优化、Memcached 实现等工具的实现原理有深刻理解;
4、对分布式、高并发系统有深入研究;
5、在 PHP 领域中主导或参与部分开源项目,对 PHP 行业发展做出较为明显的贡献;
搭建开发环境, 并且能够处理因为开发环境问题导致的问题
nginx
-php - 无法加载指定扩展 (进行扩展的安装) - 500 错误 / 一般是权限问题 - 通过 PHP 错误日志来处理问题所在
mysql
其他服务
代码管理
git 版本管理工具
基础能力
php 基础
Mysql 基础
Linux 服务器
前端技术
在开发过程中会用到各种各样的配置文件, 但配置文件的规范可能有较大的不同, 这里对规范进行统一的说明
以下文档使用 全屏模式观看, 否则可能会出现样式错乱
支持 #
类型的注释, Env 使用注释和 Nginx 注释相同, 采用 #
进行单行注释, 注释风格如下
1 | # ----------------------------------------------------- |
Centrifugo 均使用 ini
后缀, 配置 =
前后不允许存在空格
支持 /*...*/
类型的注释均使用此格式
1 | // 长注释 |
在使用 Webstorm 写 es6、node 的时候,会出现没有语法提示甚至是产生波浪线,例如常用的 require
, import
不仅是内置函数语法,不仅是 js,在一些第三方 npm 库(比如 element-ui),在 vue/html 等上也被黄色背景色标上“未知标签名”的语法提示
既影响美观,又不支持代码候选补全,实在对不起 WebStorm 前端开发利器的称号。
解决方法
打开 : Preferences | Languages & Frameworks | JavaScript
将 JavaScript Language version 更改为 项目所需要的版本,
方法 1: 推荐
1 | $ yarn add @types/node -D |
方法 2: 依赖于编辑器
打开 : Preferences | Languages & Frameworks | JavaScript | Libraries
选择下载, 选中 node
下载完成后 启用 @types/node
node_modules
文件夹!打开 Preferences | Editor | File Types
; 取消 node_modules
此项
因为语法库就是在来自本机和当前项目的 node_modules
文件夹中。
其实过滤
node_modules
文件夹是有一定道理的,它虽然总体积不大,每个文件体积也小,但是它文件数量巨大,特别是较大的项目,node_modules
包含的文件数量多似繁星…,如果让 Webstorm 加载进来,轻则出现一小段时间软件卡顿,重则电脑长时间崩溃,当然这和电脑的性能有关。所以有一些博客可能会建议开发者特别是初学者在设置中过滤掉node_modules
文件夹。
虽然加载 node_modules
会让电脑卡顿一段时间,但是给 Webstorm
足够时间,在电脑性能不会太差的情况下还是可以加载完的,换来的编程便利还是值得的。
然后就慢慢等待加载完毕
加载完毕之后,如果当前项目下也有 node_modules,也会自动挂到 JavaScript Library 中
效果
设置后,不仅没有语法波浪线,在输入的时候已经有代码候选补全,并且按 ctrl 点击还能跳转查看源码
标签组件名也能补全
标签也不会出现语法背景黄色,并且还支持自定义属性参数的补全
对被测软件进行一次全面的测试,测试用例 100%执行。
对首轮测试提的 BUG 进行回归测试,测试 BUG 内容及其相关联内容,每进行一轮回归测试需由测试组织一次总结会,参与人员包括:测试、相关开发人员,主要内容:大体是对测试中出现的问题进行总结,目的是为了让大家认识到这个问题,在下次的项目中避免再发生同样的问题,提高工作效率,时间在 15 分钟之内。
每进行一轮测试需等开发修复完 Bug 后再进行下一轮测试,不能尚未修复完 Bug 就进行测试,一定要及时跟踪 Bug 状态。
Bug 修复完成的时间:
测试根据测试的内容确定 Bug 后,需给开发留出 1-1.5 天的时间修复 Bug 并进行确认,根据 Bug 的修复难易程度,修复时间会提前或者延后,延后时间为 3 小时,时间不宜过长。
责任人:
看出现错误的原因,是前端问题还是后端问题还是 UI 问题,相应指派给不同的负责人,由该负责人修复 Bug,修复完 Bug 后一定要及时改变禅道上 Bug 的状态,以便测试进行下一步工作。
当被测软件符合上线标准,应对其进行一次全面的复测,已保证功能可以正常实现。
每次测试完一个项目后,该项目已达到上线标准,需在上线前开一个测试总结会,由测试组织开展;
参会人员:产品, UI, 测试、相关开发人员;
内容:大体包括开始、完成、总结这几个部分,测试应当在总结中发现尚未覆盖的用例并进行完善,需总结测试中出现的问题,目的是为了让大家认识到这个问题,在下次的项目中避免再发生同样的问题,提高工作效率,时间在 15 分钟之内。
A 类错误 | B 类错误 | C 类错误 | D 类错误 |
---|---|---|---|
无 | 无 | 无 | <4% |
对于每一次测试,当没有发现致命性错误和严重性错误和一般性错误,轻微性错误数量小于测试用例总数的 4%,功能实现,且可以正确执行,则认为系统通过本次测试。
1) A、B、C 级错误修复率必须达到 100%。
2) D 级错误修复率应达到 96%以上。
注:项目紧急时,C 级错误修复率应达到 96%以上,D 级错误修复率应达到 90%以上。
测试用例执行覆盖率应达到 100%。
注:如软件发现 Bug,但没有该项测试用例,应及时进行补充。
测试把软件当中的重点内容列举出来:
列举出功能点后,执行一遍测试用例。
上线后也可以让非开发测试人员进行测试,收集问题,增加系统的稳定性。
看出现错误的原因是属于前端还是后端还是 UI 问题,找到相应的负责人进行修复。
对开发自己制定的阶段性计划进行测试,主要是看开发有没有完成自己制定的阶段性计划,保证开发进度正常进行,帮助开发确定这个阶段完成的标准以及下个新阶段启动的条件或前提,时刻跟进开发的进度。
了解安装自动化测试所需软件,熟悉软件的使用,制定相应的测试计划。
测试需从接口角度发现问题,并快速定位问题,确定问题是前端还是后端问题,直接指派给相关负责人。
数据架构师岗位职责:
1、主导数据中台系统数据架构设计,编写相关技术文档;
2、主导公司数据分析工具集的落地,搜索产品、图分析、时空分析、自定义建模分析工具,交互分析工具,统计报表分析等产品设计;
3、基于项目需求,编写技术方案,为公司大数据项目落地提供技术指导;
4、把握大数据最新技术应用及发展方向,开展相应技术预研;
5、跟踪大数据行业进展及市场动态,不断创新完善设计方法论和解决方案,能够突破创新。
任职要求:
1.精通离线和实时数据处理和图计算框架等;
2.熟悉大数据技术生态圈,精通大数据技术架构,有大数据平台构建经验;
3.有实际大规模数据(10TB 级以上)处理经验优先;
4.有数据治理或人工智能相关项目经验;
5.本科及以上学历,4 年以上工作经验; .
6.具有项且管理经验优先
需求
产品应有描述需求, 并浓缩需求为可理解的语言
流程
应有流程图来表示出现问题的各种分支以及重点约定
流程中操作应描述
颜色命名以及使用参考 Vant 主题定制
颜色
应描述颜色的标识以及变种
模块颜色定义
应描述模块的模块使用颜色的各种定义, 以及使用的颜色的标识
机型
ICON
图标的管理以及命名都是 UI 来进行管理
很多 PHP 程序员使用 laravel 创建他们的应用程序。laravel 是一个免费开源的 PHP web 应用程序框架。它基于多个 Symfony 组件,提供了一个开发框架,包括 authentication, routing, sessions, caching 等模块.
去年夏天, 我们介绍了 支持 Blade 。blade 是 Laravel 的模板语言, 对艺术家友好,这个 Laravel 程序员的命令行工具, 可以在 PhpStorm 中工作. 使用 Laravel 插件 和 Laravel IDE 帮助器, 我们可以进一步扩展 PhpStorm 对 Laravel 应用的支持。下面让我们看怎么做!
官方方式
首先确认
Composer
在我们的项目中是可用的, 我们可以使用Composer
|Add dependency…
右键菜单安装 Laravel 5 IDE Helper Generator 到我们的项目. 搜索 barryvdh/laravel-ide-helper,并且点击 Install 下载并添加到项目.
[译注]自助方式
因为我们是在项目中使用, 所以我们在项目中添加这个功能, 在
composer.json
中添加require-dev
分支laravel 4.*
, 这里的版本应该填写1.*
1 | "require-dev": { |
然后使用命令 composer update -vvv
来更新程序包
注册 'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider'
服务到我们的应用, 即写入到 config/app.php
中的 provider 中 , 这样在 artisan list
中便存在了ide-helper
的命令, 运行 artisan ide-helper:generate
, PhpStorm 就会有代码完成功能,并且有 Laravel 的语法高亮.
为了进一步提升我们的 Laravel 体验,我们也可以安装 Laravel 插件. 在 Settings (Preferences)
| Plugins
, 点击 Browse repositories…
按钮并搜索 Laravel. Install plugin 按钮会下载并安装插件到 IDE.
重启 IDE 并启用插件( Settings (Preferences)
| Other Settings
| Laravel Plugin
| Enable Plugin for this Project
). PhpStorm 知道 Laravel 的界面做什么, 并且提供(controllers,views, routes, configuration, translations、等)的代码完成功能!
当然不只是代码自动完成,使用 Ctrl+Click (CMD+Click Mac OS X)
或者 Go To Declaration
(转到定义) (Ctrl+B / CMD+B)
, PhpStorm 将会导航到那里, 比如配置项的声明。
关于使用 Blade 模板,Laravel 插件也可以提高体验, 比如:@section
指令的自动完成.
想了解更多吗? 查看我们的 Laravel 教程,这里包含了 PhpStorm 为 Laravel 开发准备的全部东西, 包括代码自动完成,导航,自动代码检查,命令行工具支持,调试和单元测试!
还可以在composer.json
的post-update-cmd
中加入命令保证 helper
在每次 update 的时候都会更新,如下:
1 | "post-update-cmd": [ |
另外,如果你的 model 是 extend 的 Eloquent,这个插件还可以给项目中的 model 添加 phpDoc,直接显示字段名,便于阅读,用法
1 | php artisan ide-helper:models User |
需要修改composer.json
,在 require-dev
段添加
1 | "require-dev": { |
杜绝使用无意义的单字母命名
1 | if (currentYear > 2009) ... |
命名应该由 26 个大小写字母(A .. Z, a .. z),10 个数字(0 .. 9), $(美元符号)
和 _(下划线)
组成。不要使用国际字符(例如中文, emoji 表情),因为它们可能不易读或者不能在任何地方都能容易理解。不要使用 \
(反斜线符号), $
符号仅仅作为被选择的 dom 进行使用
不要使用 _(下划线)
作为变量名称的首字母。它被用来表示私有,但是它实际上不提供私有性。
文件或类中的 私有 属性, 变量和方法名应该以下划线 _
开头.
大多数变量和方法名应该以小写字母开始。[变量/函数]杜绝使用拼音命名
必须使用 new
前缀的构造函数应该以大写字母开始。JavaScript 不会在省略 new 时报编译期警告或运行时警告。
不使用 new
时会发生坏事情,所以大写首字母规范是我们拥有的唯一的防御。
常量的形式如: NAMES_LIKE_THIS, 即使用大写字符, 并用下划线分隔. 你也可用 @const 标记来指明它是一个常量. 但请永远不要使用 const 关键词,关键词 const, 因为 IE 不能识别, 所以不要使用
声明变量必须加上 var 关键字 . JavaScript 不强求这点,但是这样做会让程序更易读,并且会让探测未声明的可能变成隐式的 globals 的 变量更容易。
var 语句应该为方法体内的第一个语句。
每个变量声明应该自己占一行并有注释。它们应该按字母顺序排列。
1 | var currentEntry; // currentyly selected table entry |
JavaScript 没有块作用域,所以在块里定义变量可能会让有其它 C 家族语言经验的程序员迷惑。在方法顶端定义所有变量。 尽量少使用全局变量。隐式的全局变量应该从来不使用。
所有的方法应该在它们使用前声明。内部方法应该位于 var 语句后面。这让哪些变量包含在它的 scope 里更清楚。
方法体本身缩进 Tab。}
(右大括号)应该和方法声明处对齐。
1 | function outer(c, d) { |
这个规范可以和 JavaScript 很好的工作,因为在 JavaScript 里方法和对象字面量可以放在允许表达式的任何位置。它使用内部方法和复杂结构提供最好的可读性。
1 | function getElementsByClassName(class_name) { |
如果一个方法字面量为匿名的,则在“function”和“(”(左圆括号)之间应该有一个空格。如果省略空格,则它可能看起来方法名是 function”,而这是错误的。
1 | div.onclick = function (e) { |
尽量少用全局方法。
方法中的参数使用 蛇形写法, 这里的方法包含回调函数, 定义函数, 类方法
1 | function getElementsByClassName(class_name) { |
JavaScript 程序应该作为一个.js 文件存储和发布。
JavaScript 代码不应该嵌入在 HTML 文件里,除非那些代码是一个单独的会话特有的。HTML 里的 JavaScript 代码大大增加了页面的大小,并且 很难通过缓存和压缩来缓解<script src="filename.js">
标签应该在 body 里越靠后的位置越好。这减少了由于加载 script 而导致的其它页面组件的延迟。没有必要使 language 或者 type 属性。由服务器而不是 script 标签来决定 MIME 类型。
文件名应该使用小写字符, 以避免在有些系统平台上不识别大小写的命名方式. 文件名以.js 结尾, 不要包含除 - 和 _ 外的标点符号(使用 - 优于 _).
当一条语句不能在单独一行写完时,可能有必要拆分它。在操作符后进行拆分,最好是在逗号后面拆分。
操作符后面进行拆分减少了通过插入分号伪装 copy-paste 错误的可能性。下一行应该缩进 + 4空格
。
慷慨的写注释。留下一些供需要理解你做了什么的人们(可能是你自己)下次阅读的信息是有用的。注释应该书写良好和清晰,就像它们 标注的代码一样。偶尔小幽默一把也是可以的。挫折和怨恨就别写了。
更新注释非常重要。错误的注释让程序更难读懂和理解。
让注释有意义。更多的关注于不能马上可见的东西。不要用如下内容浪费读者的时间:
1 | i = 0; // Set i to zero. |
一般使用行注释。把块注释用于正式文档或外部注释。
修改的重要的注释使用 /* Comment (User)[2014-05-06] */
来进行注释, 其余采用简洁注释
使用 空格 进行缩进, 使用正确的缩进来表明嵌套层次, 4 个空格作为一个缩进
utf-8
空行通过将逻辑相关的代码放到一起来增加可读性。
空格应该用于如下情况:
总是使用分号.
如果仅依靠语句间的隐式分隔, 有时会很麻烦. 你自己更能清楚哪里是语句的起止.
而且有些情况下, 漏掉分号会很危险
如果初始值不是很长, 就保持写在单行上:
1 | var arr = [1, 2, 3]; // No space after [ or before ]. |
初始值占用多行时, 缩进 2 个空格.
1 | // Object initializer. |
比较长的标识符或者数值, 不要为了让代码好看些而手工对齐. 如:
1 | WRONG_Object.prototype = { |
尽量让函数参数在同一行上. 如果一行超过 80 字符, 每个参数独占一行, 并以 Tab 缩进, 或者与括号对齐, 以提高可读性. 尽可能不要让每行超过 80 个字符. 比如下面这样:
1 | // renaming without reindenting, low on space. |
操作符始终跟随着前行, 这样就不用顾虑分号的隐式插入问题. 如果一行实在放不下, 还是按照上述的缩进风格来换行.
1 | var x = a ? b : c; // All on one line if it will fit. |
不要滥用括号, 只在必要的时候使用它.
对于一元操作符(如 delete, typeof 和 void ), 或是在某些关键词(如 return, throw, case, new )之后, 不要使用括号.
使用 '
优于 "
单引号 '
优于双引号 "
. 当你创建一个包含 HTML 代码的字符串时就知道它的好处了.
每行应该包含至少一个语句。在每个简单语句末尾添加一个“;”(分号)。注意一个给方法字面量或对象字面量赋值的赋值语句仍然是一个赋值语句,所以也必须以分号结尾。
JavaScript 允许任何表达式作为语句使用。这可能产生一些错误,特别是在插入分号时。唯一可以当作语句使用的表达式是赋值表达式和调用表达式。
复合语句是包含一个用“{}”(大括号)包围语句列表的的语句。
语句标签是可选的。只有如下语句需要被标签标识: while,do,for,switch。
具有值的 return 语句不应该使用“()”(圆括号)包围值。返回值表达式必须和 return 关键字在同一行从而避免插入分号。
if 语句应该使用如下格式:
1 | # single |
for 语句应该使用如下格式:
1 | # 和数组使用 |
第一种格式应该和数组使用。
第二种格式应该和对象使用。注意添加到对象的 prototype 中的成员将被包含在遍历中。通过使用 hasOwnProperty 方法来区分对象的成员是明智的:
1 | for (variable in object) { |
while 语句应该使用如下格式:
1 | while (condition) { |
do 语句应该使用如下格式:
1 | do { |
不像其它复合语句,do 语句始终使用“;”(分号)结尾。
switch 语句应该有如下格式:
1 | switch (expression) { |
每组语句(除了 default)应该以 break,return 或者 throw 结束。不要 fall through。
try 语句应该使用如下格式:
1 | try { |
不要使用 continue some;语句。它会让方法的控制流程模糊。
不要使用 with 语句。
仅在对象构造器, 方法, 闭包中使用.
this 的语义很特别. 有时它引用一个全局对象(大多数情况下), 调用者的作用域(使用 eval 时), DOM 树中的节点(添加事件处理函数时), 新创建的对象(使用一个构造器), 或者其他对象(如果函数被 call() 或 apply()).
使用时很容易出错, 所以只有在下面两个情况时才能使用:
可选参数以 opt_ 开头.
函数的参数个数不固定时, 应该添加最后一个参数 var_args 为参数的个数. 你也可以不设置 var_args 而取代使用 arguments.
可选和可变参数应该在 [@param ]
标记中说明清楚. 虽然这两个规定对编译器没有任何影响, 但还是请尽量遵守
Getters 和 setters 并不是必要的. 但只要使用它们了, 就请将 getters 命名成 getFoo() 形式, 将 setters 命名成 setFoo(value) 形式. (对于布尔类型的 getters, 使用 isFoo() 也可.)
1 | var ixdcw = {}; |
明确命名空间所有权
当选择了一个子命名空间, 请确保父命名空间的负责人知道你在用哪个子命名空间, 比如说, 你为工程 ‘sloths’ 创建一个 ‘hats’ 子命名空间, 那确保 Sloth 团队人员知道你在使用 sloth.hats. 外部代码和内部代码使用不同的命名空间
“外部代码” 是指来自于你代码体系的外部, 可以独立编译. 内外部命名应该严格保持独立. 如果你使用了外部库, 他的所有对象都在 foo.hats.* 下, 那么你自己的代码不能在 foo.hats.*下命名, 因为很有可能其他团队也在其中命名.
使用{}替代 new Object()。使用[]替代 new Array()。
当成员名字为连续的整数时使用数组。当成员名字为任意的字符串或名字时使用对象。
使用 Array 和 Object 语法, 而不使用 Array 和 Object 构造器.
1 | var a = [x1, x2, x3]; |
不要使用逗号操作符,除了 for 语句的控制部分的严格使用。(这不适合逗号操作符,它应该用于对象字面量,数组字面量,var 语句和参数列表。
在 JavaScript 里块没有作用域,只有方法有作用域。不要使用块,除了复合语句一定需要用到外。
不要在 if 和 while 语句的条件部分做赋值。不要写不易懂的代码。
始终使用===和!==操作符会更好。和!=操作符会做类型强制转换。特别是,不要使用来和“假”值做比较。
注意不要在“+”后面跟“+”或“++”。这种模式令人混淆。在它们之间插入圆括号来让你的意图更清晰。
1 | total = subtotal + +myInput.value; |
这样“+ +”就不会被读错成“++”。
eval 方法是 JavaScript 里最滥用的特性。不要使用它。
解析序列化串是指将字节流转换成内存中的数据结构. 比如, 你可能会将一个对象输出成文件形式:
1 | users = [ |
很简单地调用 eval 后, 把表示成文件的数据读取回内存中.
类似的, eval() 对 RPC 响应值进行解码. 例如, 你在使用 XMLHttpRequest 发出一个 RPC 请求后, 通过 eval () 将服务端的响应文本转成 JavaScript 对象:
1 | var userOnline = false; |
不要使用 Function 构造函数。
不要传递字符串给 setTimeout 或者 setInterval。
{boolean}, {Window}, {goog.ui.Menu}
普通类型的描述方法.
参数化类型, 即指定了该类型中包含的一系列”类型参数”. 类似于 Java 中的泛型.
- 字符串数组
{Array.<string>}
- 键为字符串, 值为整数的对象类型
{Object.<string, number>}
{(number|boolean)}
一个整数或者布尔值. 表示其值可能是 A 类型, 也可能是 B 类型
{myNum: number, myObject}
由现有类型组成的类型. 表示包含指定成员及类型的值. 这个例子中, myNum 为 number 类型, myObject 为任意类型.
注意大括号为类型语法的一部分. 比如, Array.<{length}>
, 表示一具有 length 属性的 Array 对象.
{?number}
一个整型数或者为 NULL 表示一个值可能是 A 类型或者 null. 默认, 每个对象都是可为空的. 注意: 函数类型不可为空.
{!Object}
一个对象, 但绝不会是 null 值. 说明一个值是类型 A 且肯定不是 null. 默认情况下, 所有值类型 (boolean, number, string, 和 undefined) 不可为空.
{function(string, boolean)}
具有两个参数 ( string 和 boolean) 的函数类型, 返回值未知. 说明一个函数.
{function(): number}
函数返回一个整数. 说明函数的返回类型.
{function(this:goog.ui.Menu, string)}
函数只带一个参数 (string), 并且在上下文 goog.ui.Menu 中执行. 说明函数类型的上下文类型.
{function(string, ...[number]): number}
带一个参数 (字符类型) 的函数类型, 并且函数的参数个数可变, 但参数类型必须为 number. 说明函数的可变长参数.
可变长的参数 (使用 [@param ] 标记) [@param ] {…number} var_args
函数参数个数可变. 使用标记, 说明函数具有不定长参数.
{function(?string=, number=)}
函数带一个可空且可选的字符串型参数, 一个可选整型参数. = 语法只针对 function 类型有效. 说明函数的可选参数.
函数 可选参数(使用 [@param ] 标记) [@param ] {number=} opt_argument
number 类型的可选参数. 使用标记, 说明函数具有可选参数.
{*}
表示变量可以是任何类型.
Number new Number(true) Number 对象
1 | 1 |
字符串对象
1 | 'Hello' |
布尔对象
1 | true |
1 | new RegExp('hello') |
1 | new Date |
1 | null |
1 | undefined |
1 | function f() { |
1 | ['foo', 0.3, null] |
1 | {} |
1 | function(x, y) { |
1 | document.createElement('div') |
1 | document.body.firstChild |
1 | htmlDocument.getElementsByTagName('input')[0] |
$
作为前缀1 | // 参数是下划线分隔 |
本文规范合并 html/css 规范
文件编码为 utf-8
更多 UTF-8 内容: http://zh.wikipedia.org/zh/UTF-8
使用 空格 进行缩进
使用 4 空格缩进来表明嵌套层次
网页大小
“网页大小”定义为网页的所有文件大小的总和,包括 HTML 文件和所有的嵌入的对象。用户喜欢快的而不是新奇的站点。网页主体加载速度控制在 3S
以内
注释
注释适用部分参考 公共约定
DOCTYPE
页面文档类型统一使用 HTML5 DOCTYPE, 为每个 HTML 页面添加标准模式(standard mode)的声明,确保在每个浏览器中拥有一致的展现
1 | <!doctype html> |
字符集设置
声明方法遵循 HTML5 的规范, Meta 文件使用 “UTF-8” 浏览器显示编码指定, 通过声明一个明确的字符编码,让浏览器轻松、快速的确定网页内容渲染方式,通常指定为’UTF-8’
1 | <html> |
语言属性
为每个 HTML 页面根元素添加 lang 属性
根据 HTML5 规范:
强烈建议为 html 根元素指定 lang 属性,从而为文档设置正确的语言。这将有助于语音合成工具确定其所应该采用的发音,有助于翻译工具确定其翻译时所应遵守的规则等等。
1 | <html lang="zh-CN"> |
引入 CSS 和 JavaScript 文件
根据 HTML5 规范,在引入 CSS 和 JavaScript 文件时不需要指定 type
属性,因为 text/css
和 text/javascript
分别是它们的默认值
1 | <!-- External CSS --> |
特殊符号使用 HTML 字符实体(实体名称对大小写敏感)
常用如下:
符号 | 实体编码 |
---|---|
空格 | |
© | © |
¥ | ¥ |
® | ® |
> | > |
< | < |
& | & |
td / th 要在 tr 里面,li 要在 ul / ol 里面
1 | <!-- not good --> |
ul / ol 的直接子元素只能是 li,不能包含其他元素
1 | <!-- not good --> |
行内元素里面不可使用块级元素
a 标签是一个行内元素,行内元素里面套了一个 div 的标签,这样可能会导致 a 标签无法正常点击
1 | <!-- not good --> |
可以使用如下代码进行修复:
1 | <a href="../test" style="display: block"> |
不使用重复属性,重复的属性只会取第一个
1 | <!-- error --> |
不要在 https 的链接里写 http 的图片
只要 https 的网页请求了一张 http 的图片,就会导致浏览器地址栏左边的小锁没有了,一般不要写死,写成根据当前域名的协议去加载,用//开头:
1 | <img src="//static.chimeroi.com/hello-world.jpg" /> |
不要在自闭合(self-closing)元素的尾部添加斜线
( HTML5 规范中说明这是可选的)
1 | <!-- not good --> |
不使用属性设置样式(img
, table
等元素)
1 | <!-- not good --> |
自定义属性要以 data-开头
自己添加的非标准的属性要以 data-开头,否则w3c validator会认为是不规范的
1 | <!-- not good --> |
使用尽可能少的元素/嵌套
由于元素嵌套越多会是的浏览器解析速度出现问题, 所以规定元素嵌套不要超过六级, 尽量遵循 HTML 标准和语义,但是不要以牺牲实用性为代价;任何时候都要尽量使用最少的标签并保持最小的复杂度。
尽量避免多余的层级
1 | <!-- not good --> |
兼容性
代码使用 html5 标准代码编写文档, 并且 ie8+, firefox, chrome 做到兼容, 禁止使用不兼容的标签,附录中包含了 html5 不支持的代码和新增的代码,这些标签禁止使用.
禁止使用特殊的标签
协议
如果链接和当前页面一致则忽略链接的协议部分, 建议在指向图片或其他媒体文件、样式表和脚本的 URL 地址中省略 http:, https:协议部分
1 | <script src="//www.taobao.com/fp.js"> |
语义
使用符合语义的标签书写 HTML 文档, 选择恰当的元素表达所需的含义;
1 | <a href="recommendations/"> |
大小写
元素的标签和属性名必须小写, 属性值必须加双引号;
1 | <a href="/">Home</a> |
属性应该按照特定的顺序出现以保证易读性
class
id
name
data-*
src
, for
, type
, href
, value
, max-length
, max
, min
, pattern
placeholder
, title
, alt
aria-*
, role
required
, readonly
, disabled
空格
去除不必要的空格
1 | # Bad |
嵌套和闭合
元素嵌套遵循 (X)HTML Strict 嵌套规则, 推荐使用 Firefox 插件 HTML Validator 进行检查;
正确区分自闭合元素和非自闭合元素.
非法闭合包括:<br>..</br>、<script />、<iframe />
, 非法闭合会导致页面嵌套错误问题
自闭和标签: 以下元素不要求闭合, 原因见: HTML(5) 不要求标签自闭合
非闭合标签:area, base, br, col, command, embed, hr, img, input, keygen, link, meta, param, source, track, wbr
引号
使用双引号来标识 html 的属性
1 | # Bad |
自定义 javascript 属性
通过给元素设置自定义属性来存放与 JavaScript 交互的数据, 属性名格式为 data-xx (例如:data-lazyload-url)
1 | <div class="bg bg-4" data-load="false"></div> |
目的是使用 js 调用时候对元素进行识别使用.
TODO
使用 TODO 来标记待做事情,便于后期搜索.
在 TODO 后添加 (姓名或邮件) 来表示分类
1 | <!-- TODO(Mark Zhao): remove duplicate tag --> |
焦点分离
将表现,行为和结构分离:不要在 html 和模板中加入除了结构以外的东西.例如内联样式, center 等标记.
在文档中引入尽可能少的样式和脚本
1 | # Bad |
block,list 或 table 元素
针对每个 block,list 或 table 元素另起一行,并在每个子元素前缩进。这样可读性好
1 | <ul> |
Table 的写法
</td>
结束标记应该与 <td>
处于同一行,不要换行, 如果换行,浏览器将会解析内容为内容+半角空格.<table>
的标签内<table>
的标签内<td>
标签内实体字符
html 标签<
, >
、空格、特殊符号需要使用 html 实体
SEO 优化
a
元素必须加 title=""
img
元素必须加 alt = ""
建议对超过一屏的代码页面模块进行注释, 以降低开发人员的嵌套成本和后期的维护成本.
1 | <div id="sample"> |
Js 调用的 html 数据
使用 data-
作为前缀
事件驱动
使用事件驱动 js 事件, 不需要写 onclick="function"
而是采用 require
方式调用
id
html
中的 id
仅仅作为js
句柄调用, 仅仅用于调用事件驱动, 不作为样式定义使用
此部分的约定包含 less, sass 等预编译的约定
项目文件规范
文件命名
类命名/模块嵌套
1 | // 大区域命名 |
html 代码
1 | <div class="fe--editor"> |
资源命名
文件夹中的资源图片名称和 文件
名称对应起来
例如是个人资料文件是 user.less
, 这个资源应该放到指定资源目录的 user
文件夹中.
1 | ┝ user.less |
less 中的变量、函数、mixin 等采用驼峰式命名
对于变量的命名采用(定义/模块) 来进行命名, 使用中尽量不要直接调用颜色, 而是调用模块的定义
1 | @mainFontColor: #444; |
常用的标示符
1 | # 大小 |
所有声明语句都应当以分号结尾
最后一条声明语句后面的分号是可选的,但是,如果省略这个分号,你的代码可能更易出错
1 | /* error */ |
为选择器分组时,将单独的选择器单独放在一行
1 | /* good */ |
避免为 0 值指定单位
例如,用 margin: 0;
代替 margin: 0px;
为选择器中的属性添加双引号,例如,input[type="text"]
;
某些情况下是可选的,但是,为了代码的一致性,建议都加上双引号
1 | /* not good */ |
十六进制值应该全部小写,例如,#f3f6fa
不出现空的规则(声明块中没有声明语句)
不要设置太大的 z-index(一个正常的系统的层级关系在 10 以内就能完成)
多写注释,且多使用句子进行描述而不是词语
1 | /* 为了去除输入框和表单点击时的灰色背景 */ |
不要使用*
选择器
适当使用:before
和:after
来画页面的一些视觉上的辅助性元素,如三角形、短的分隔线、短竖线等,可以减少页面上没有用的标签
选择器不要超过 4 层(在 Less 中避免嵌套超过 4 层)
用 border: 0;
代替 border: none;
使用简写形式的十六进制值,例如,用 #fff
代替 #ffffff
对于属性值或颜色参数,省略小于 1 的小数前面的 0 (例如,.5
代替 0.5
;-.5px
代替 -0.5px
)
样式定义可以覆盖公共样式
1 | # a 是公共样式, 这里写的样式会覆盖掉公共样式 |
元素嵌套级别不超过 6 级
J_xxxx
字母 J
加下滑线 _
,并且不要将这些 class 包含到 CSS 文件中。id 不能写 css 样式
由于 id
属性作为仅仅作为 js 来调用, 所以使用到 JS 调用 class 的时候使用 J_
作为调用的句柄
1 | <script> |
logo 最好和 h1 标题使用一个
logo 用背景图标来显示, 必须用“h1”来标识。 .head h1{}
空行
成组的 css 规则使用空行来分隔. 多分组使用多空行来分隔
love/hate 写法
a 标签采用 LOVEHATE
写法
l(link)ov(visited)e h(hover)a(active)te
1 | a:link{} |
混排时候的字体定义
中英文混排时,我们尽可能的将英文和数字定义为 verdana 和 arial 两种字体
这样为了避免字符使用宋体时候出现的各种问题
会将人民币符号(两横)表现成日元的符号(一横)等问题
宋体表现数字和字母不协调
字体字号
一般使用中文宋体 12px 和 14.7px 这是经过优化的字号,黑体字或者宋体字加粗时,一般选用 11pt 和 14.7px 的字号比较合适
尽量使用简写属性
这里 0
不需要单位, 对属性值为 0 的情况省略单位
1 | .col-main .content{ |
元素的隐藏
display:none
隐藏对象浏览器不作渲染,不占用内存。而visibility:hidden
则会对于隐藏元素使用
display:none
颜色使用 16 进制表示
颜色使用 16 进制的值表示
引号
尽可能不使用引号, 迫不得已使用单引号 '
css 精灵
合理使用 CSS Sprite, 并控制质量和文件大小
对图片大小进行优化
RIOT : 图片压缩工具
公共样式
宽度分组, 宽度用 w
前缀表示, 尽量不要定宽
从 w120 开始, 一直写到 12px - 720px 宽度使用 12px 作为步进
1 | .w12{width:12px;} |
位置及监听
css 文件不需要自己去手动创建, 而是使用 compass, sass 来生成并且维护 css 样式
声明块的左花括号前添加一个空格
声明块的右花括号应当单独成行
每条声明语句的 :
后应该插入一个空格
每条样式声明应该独占一行
1 | /* not good */ |
对于以逗号分隔的属性值,每个逗号后面都应该插入一个空格(例如,box-shadow
,transition
)
1 | /* not good */ |
!important
前插入一个空格
注释://
后插入一个空格,/*
后插入一个空格,*/
前插入一个空格
Less 的操作符,在圆括号中的数学计算表达式的数值、变量和操作符之间均添加一个空格
注释统一用/* */
( Less 中也不要用//
)
当使用一些较新的 CSS3 语法时,应注意添加浏览器前缀( FAIS 2 打包工具包含 CSS 预处理,固无需考虑此条)
不要使用 input 的 line-height
来做垂直居中
设置 line-height
为一个很高的值会导致 Safari 浏览器的输入光标变得巨大 (与 line-height
等高)
1 | /* not good */ |
权重的基本规则:
- 相同的权重:以后面出现的选择器为最后规则
- 不同的权重,权重值高则生效
详细了解权重计算方法
!important
,除非原样式使用内联样式或!important
且无法直接修改当你不确定自己写的属性会否影响到其他属性时,应避免使用简写
1 | /* error */ |
当你确定自己的声明不会影响到其他属性时,请使用简写提升代码简洁性
1 | /* not good */ |
使用 transition 做动画的时候不要使用 all 所有属性,在有一些浏览器上面可能会有一些问题,如下:
1 | transition: all 2s linear; |
在 Safari 上面可能会有一些奇怪的抖动,正确的做法是要用哪个属性做动画就写哪个,如果有多个就用隔开,如下代码所示:
1 | transition: transform 2s linear, opacity 2s linear; |
相关的属性声明按以下顺序做分组处理,组之间需要有一个空行
Positioning(影响其他元素和自身位置相关声明)
Box model(自身盒模型相关声明)
Typographic(文本相关声明)
Visual(自身样式)
Misc(其他声明)
1 | .declaration-order { |
v3.0(2021-11-12)
v2.0(2017-08-26)
修改命名规范
整理文档结构和目录
Title : 实习生(student engineer)
[1500-3000]
补充:
可以写出 UI 界面,完成基本需求功能,会用开源框架以及开源控件,甚至会改造成符合自己项目的,了解一些 android 源码,但是知识面比较单一,懂数据结构,设计模式,计算机网络(OSI7 层模型每一层),数据库,服务器,熟练各大开源库,熟悉 Git,会造些轮子,会翻阅 android 源码,会逛各大技术网站,对新技术敏感(RxJava,Retrofit,Dagger,MVP,kotlin……),会反编译去研究别人 APP。
完全掌握 View 绘制过程,消息处理机制,事件分发机制,进程间通讯,NDK 开发。有一些不错的作品。
Title : 菜鸟(junior engineer)
[3000-5000]
Title : 大虾(intermediate engineer)
[5000-7000]
2 年以上 android 开发经验
写一些项目中要用的自定义控件,并优化出部分功能集成到工具类,能把控整体项目架构,搭出基本框架,可能耦合性高,扩展性不抢,看懂过 android 部分源码,知识面比较广。
Title : 大牛/专家(senior engineer)
[7000-9000]
本科或以上学历,计算机软件相关专业;
3 年以上 Android 开发经验;
搭项目框架,解耦,扩展性强,造专业的轮子,优化程序性能,掌握些黑科技,研究 android 源码,知识面设计广而深
Title: 大神/骨灰(android architect)
[9000 以上]
掌握两种以上开发语言或开发平台、全栈等技能
对新技术领域有较强的探索性研究能力
可根据实际需要加入学历,开发年限等附加条件
phpstorm 常用快捷键
1 | ctrl/cmd + alt + L # 格式化代码 |
master : 线上分支 develop : 开发分支
任何人不得直接在这两个分支进行开发, 开发完毕后将代码用 pr
的方式提交合并请求, 由 pr 负责人审核完成后才能够合并到 develop 分支或者
master 分支
必须对接口写单元测试, 否则测试不通过的代码一律打回
(一般情况下来讲)类函数少于或者等于 4 个参数的, 可以直接使用参数传递
1 | // before |
Xdebug 作为 PHP 调试工具,提供了丰富的调试函数和配置,可以直观的看到 PHP 源代码的步进和性能数据,以便优化 PHP 代码。
使用 phpstorm + xdebug 来调试 php 程序是借助强大的 IDE 监听功能, 更方便的调试程序. 提高我们的编码效率, 固然 var_dump, print_r 等函数也能提供相应的功能, 但是自动化的工具更能够事半功倍. 下面我根据自己的使用介绍下如何进行调试和配置.
一种方式是用外部设置的 session, 另外一种是在 phpstorm 中配置页面入口然后使用内置的监听来访问, 原理相同, 下面我们从原理开始讲解
这里使用了最小化配置, 对于 profile 等功能没有配置
1 | [xdebug] |
注意 这里监听端口默认是 9000 , 和 php 默认监听重复, 注意尽量不用使用 9000, 以免出现不生效的情况.
这里是让 phpstorm 通过监听端口的方式获取到 xdebug 断点传送过来的数据
我们这里监听的是 9500 端口, 和 xdebug 配置监听数据端口一致
切换 “开始监听 PHP 调试连接” 按钮。
点击行号右侧空白, 设置断点
debug session 的工具的目的是设置一个 cookie, 让每次发送数据的时候都会携带这个 cookie, 从而识别监听.
安装 chrome 扩展 Xdebug helper
已经设置了 cookie, Key 是 XDEBUG_SESSION
, 值是 PHPSTORM
, 我认为这里的值无关紧要, 对于 phpstorm 来说, 是能够监控到的.
这里我们在断点位置可以看到输出的内容项目
这里的另外一种方式的服务器配置方式和流程完全一致, 就是第四步和第五步有所不同, 实现的原理是在 phpstorm 中设置运行的服务器, 然后通过 debug 模式自动设置 XDEBUG_SESSION
, 并且自动开启监听.
例如我这里的本地域名是 l.dailian.sour-lemon.com
, 我们需要配置一个本地服务器来打开这个页面, 我们首先配置一台服务器.
注意 这里的配置的域名是你本地已经配置好开发环境的域名, 端口号是 本地开发所使用的端口, 我这里是 l.dailian.sour-lemon.com
和 80
我们这里创建的调试页面的类型是 PHP Web Application
, 服务器选择的是刚才已经建立好的服务器
这样运行的情况下上面的 2.2) 开启phpstorm 数据监听
步骤可以忽略掉, 这里不需要开启这个监听.
点击 debug 按钮, 这里会自动打开一个页面并且传递一个唯一的 ID(可能是进程 ID)作为 debug 值
打开的 url 地址是: http://l.dailian.sour-lemon.com/?XDEBUG_SESSION_START=13608
, 这里的数值是会变动的.
打开 debug 面板, 会看到相对应的监听 idekey, 这里和上一步设置的 key 是一致的, 同样也和 cookie 中的设置的 XDEBUG_SESSION
值一致
第一次运行的时候可以通过 phpstorm 自带的工具来检查配置的兼容性.
Run > Web Server Debug Validation
左侧
绿色三角形 : Resume Program
,表示將继续执行,直到下一个中断点停止。
红色方形 : Stop
,表示中断当前程序调试。
上方
第一个图形示 : Step Over
,跳过当前函数。
第二个图形示 : Step Into
,进入当前函数內部的程序(相当于观察程序一步一步执行)。
第三个图形示 : Force Step Into
,強制进入当前函数內部的程序。
第四个图形示 : Step Out
,跳出当前函数內部的程式。
第五个图形示 : Run to Cursor
,定位到当前光标。
框架说明
Frames : 加载的文件列表
Variables : 可以观察到所有全局变量、当前局部变量的数值
Watches : 可以新增变量,观察变量随着程序执行的变化。
首先需要知道的是: 什么是 SameSite ? 这里有文章做了详细的描述
本来计划的是使用 Session 来进行中间存储, 但是由于 Cookie 的安全性问题导致 Session 一直没有获取到, 因为是 严格模式, 所以三方过来的时候是不带任何 Cookie 的, 导致服务器一直生成 SessionID.
软件
开发软件的相关信息
x-os
软件标识, 可选项为 ‘android/ios/h5/webapp/pc/mac/ubuntu/centos’
x-ver
软件版本号, 遵循语义化版本说明 SemVer
x-id
设备 ID, 唯一标示符, 如果是 h5 客户端则应当是自己计算出来的客户端标识, 如果是 android/ios, 则需要实现自己的计算方式
x-app
对于 os, version, id 的 json 字串信息, 以后会废弃(原因是 Nginx 无法解析头数据), 对于其他数据使用 x-app-{ph} 来做替代, 我们现在使用的 header 有
这个在项目中约定, 这里仅仅是举例
1 | x-app-sign : 加密验签版本 |
系统
系统 / 设备相关关键信息
x-sys-name
系统平台. 区分大小写, 例如 Android, iOS, iPad, Windows, Mac, CentOS
x-sys-version
系统版本号, 系统的数字标识. iOS 的可能值为 14.6, Android 可能值为 7
x-sys-device
设备型号. iOS 可能值为 iPhone11,6 / iPad,3, Android 可能值为 HuaWei Mate P40
x-sys-cpu
cpu 架构类型. x86, arm64
附加信息
1 | x-k1 : 屏幕宽度 |
默认/重写
User-Agent
用户标识头, 如果是 h5, 则取标准的 agent 浏览器/Webview 信息, 如果是 iOS/Android, 必要的数据组成为
1 | SmobaHelper/5.71.101 (iPhone; iOS 14.6; Scale/3.00), H5 检查是否在 App 内部可以使用 Project 来进行检测 |
异常
sentry-trace
不做日志搜集
Sentry 允许 H5 进行汇报的标识头, 对接 sentry 之后 web 默认收集信息的头信息, 无需自己设定
config/poppy.php
1 | return [ |
使用
在 poppy 项目中可以使用 x_header('id')
来获取 ‘x-id’ 参数
nginx.conf
1 | etag on; |
任务管理:开发工作量评估、定立开发流程, 技术选型、分配和追踪开发任务
质量管理:代码 review、开发风险判断/报告/协调解决
效率提升:代码底层研发和培训、最佳代码实践规范总结与推广、自动化生产工具、自动化部署工具
技术能力提升:招聘面试、试题主拟、新人指导、项目复盘与改进
文档管理: 对文档进行统一管理, 并要求技术人员在开发过程中完善开发文档
技术评定: 对在岗技术人员进行合理的技术评定, 并有有效的晋升机制
组建平台研发部,与架构师共建软件公共平台,方便各条产品业务线研发
通过技术平台、通过高一层的职权,管理和协调公司各个部门与本部门各条线。
推广落实绩效的有关内容
对员工状态进行跟踪, 异常问题进行处理
关注同事的生活状态, 如果有需要公司帮助的, 及时提出
对技术提升有严格, 要求, 需要有技术部分的进步
1、技术愿景:识别新技术、利用新技术、整合新技术、驱动新技术。驱动商业战略、驱动产品战略
2、技术架构:建立主营业务中的技术架构与实施模式,建立技术体系标准
3、流程制度:建立高质量,高效率的技术团队。健全的项目管理体系;完善的员工能力发展体系
4、知识培训:建立以研发内容为主的知识库管理体系、技术分享与技术文化的体系
5、业务支撑:与其它部门的沟通协作,如 HR、市场、BD、财务、客服等提供技术管理接口;在产品技术层面能够领先于业内同行
6、影响力:在公司内部与行业中具备一定影响力与口碑
7、视野&格局&执行力:看待问题全面,具有强大的学习力,具备技术前瞻力,敏锐的市场嗅觉,战略落地的能力
本文是 JavaScript 编码规范 和 Web 编码规范 的补充版, 涉及到 vue 独立性的内容在此单独说明
本规范旨在为前端程序的开发者提供规范化最新的指导,可用于程序员个人编译环境以及研发团队集成环境等场合的代码规范化检查。
本文约定于 vue3, 不适用于 vue2
Node.js LTS 版本,你可以使用 nvm 或 nvm-windows 在一台电脑中管理多个 Node 版本
使用 Chrome 浏览器并安装 Vue.js devtools 进行调试
文件名应该是大写驼峰, 文件名作为组件名称, 组件内不进行组件名称的定义
单文件组件的文件名应该要么始终是单词大写开头( PascalCase )
应用特定样式和约定的 基础组件 (也就是展示类的、无逻辑的或无状态的组件) 应该全部以一个特定的前缀开头,比如 Base、App 或 V
1 | // not good |
如果一个组件只在某个父组件的场景下有意义,这层关系应该体现在其名字上。因为编辑器通常会按字母顺序组织文件,所以这样做可以把相关联的文件排在一起
1 | // not good |
1 | // not good |
prop
的定义应该尽量详细,至少需要指定其类型
为 v-for
设置键值;在组件上总是必须用 key
配合 v-for
,以便维护内部组件及其子树的状态
在组件上总是必须用 key 配合 v-for,以便维护内部组件及其子树的状态
不要把 v-if
和 v-for
同时用在同一个元素上(大部分时候你可以使用计算属性实现)
模版中的组件名在单文件组件和字符串模板中组件名应该总是 PascalCase 的;
1 | <!-- good --> |
JS/JSX 中的组件名应该始终是 PascalCase 的
Prop 名大小写,在声明 prop
的时候,其命名应该始终使用 camelCase,而在模板和 JSX 中应该始终使用 camelCase
1 | // not good |
1 | // good |
1 | <!-- good --> |
:
表示 v-bind:
和用 @
表示 v-on:
)组件/实例的选项应该有统一的顺序,这是我们推荐的组件选项默认顺序:
el
name
parent
functional
delimiters
comments
components
directives
filters
extends
mixins
inheritAttrs
model
props
/propsData
data
computed
watch
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
activated
deactivated
beforeDestroy
destroyed
methods
template
/render
renderError
元素 (包括组件) 的特性应该有统一的顺序,这是我们为元素特性推荐的默认顺序:
is
v-for
v-if
v-else-if
v-else
v-show
v-cloak
v-pre
v-once
id
ref
key
slot
v-model
v-on
v-html
v-text
单文件组件应该总是按照 <template>
、<script>
和 <style>
的标签顺序
1 | <!-- good --> |
应该优先通过 prop 和事件进行父子组件之间的通信
一个理想的 Vue 应用是 prop 向下传递,事件向上传递的。遵循这一约定会让你的组件更易于理解。然而,在一些边界情况下 prop 的变更或 this.$parent
能够简化两个深度耦合的组件。
问题在于,这种做法在很多简单的场景下可能会更方便。但请当心,不要为了一时方便 (少写代码) 而牺牲数据流向的简洁性 (易于理解)。
应该优先通过 Vuex 管理全局状态
Vuex 提供的不仅是一个管理状态的中心区域,还是组织、追踪和调试状态变更的好工具。
本工作流的主要目的是规范需求, 跟踪项目进度和任务进度, 让项目按照既定的时间有序开发.
参与人
产品部/运营部相关人员
目的
根据公司经营策略和对行业的洞悉, 制定出来相关的开发基调, 确定版本需要开发的功能, 确定版本号, 大概功能周期, 形成有效的产品计划.
过程 :
这里包含两个部分, 原型/交互开发, UI 界面开发
参与人
产品经理 / 产品助理
目的
根据描述的功能点确定产品的原型文档, 满足在需求评审中所有的需求点, 并且使用交互语言的形式将功能告知给 UI/CTO, APP LD, 让开发熟悉整个流程并开始技术储备, 让 UI 设计师懂得功能点, 并且进行界面的开发工作
产出内容
负责人
产品经理 / UI 设计师
目的
形成和原型一致的设计图, 并用交互的方式把功能描述清楚
产出内容
与原型图一致的设计图
根据 UI 清单来进行设计
负责人
产品经理 / UI 设计师
目的
形成交互稿, 动效的对界面之间的步骤进行说明
产出内容
负责人
产品部, 测试部
准备
注意(3.0)
如果是版本在开发中需要新增的需求也需要按照正常流程去给开发/测试进行说明, 在核对的时候需要确定, 新增的功能在任务清单中以不同的颜色标注, 便于开发核对, 注意
负责人
开发小组组长/ 技术经理
流程
团队内部人员(App/Test/Dev) 进行内部协商, 对开发的详细细节进行沟通
结果
[Wps文档]
, 将业务逻辑及开发流程图落实到语雀上. 这里需要和前端确认出来接口参数. 技术实现流程图.产出内容
负责人
项目经理
准备
任务计划(App/Dev/Test)
目的
产出内容
负责人
产品/测试
产出内容
用例主要的目的是保留最新的测试用例, 如果有里程碑, 则在第一个里程碑之前进行核对, 如果没有, 则在完整测试前完成用例核对即可, 确定上线时间, 周期
负责人
开发者
产出内容
开发者需要根据总计划对开发内容进行划分. 根据里程碑/工时 需要确定出来周的开发内容, 并于日报中对今日开发内容以及明日的开发计划进行说明, 需要注明 task # xxx
, 并且需要出具线上的配置文档
由项目经理进行跟踪, 对开发情况进行每日跟踪, 如有延期,由提出申请, 阐明延期理由以及延期时长, 根据原因来评定是否对其延期纳入绩效考核.
通知跟踪
钉通知说明参考规范:
https://kdocs.cn/l/smt1vWKJh?f=101 > [文档] 钉钉通知规范.xls
负责人
项目经理
产出内容
产品交付测试
负责人
项目相关联负责人
轮次 1 : UI 进行验收[动效/状态/机型], 测试进行验收
轮次 2 : UI 复验, 测试复验
轮次 3 : 保障性测试, 压力, 注入, 性能 - 出具测试报告
测试过程中不要对已经部署的代码进行调整(可以切换分支去修改 bug 不要在测试运行的环境中去更新代码)
里程碑说明 : 测试仅仅测试里程碑功能点, 例如 A. B. C. 三个里程碑 , C 测试需要验证 B, C 的功能点.
参与人 : CTO/测试/后端 LD/产品/运营
Test
核对运营需要准备的资料(配置资料), 上线前的沟通
运营
需要准备的线上数据/图片是否完整
后端 LD
核对上线的流程, 测试的流程以及相应的步骤
负责人
测试组长
产出内容
测试报告
测试报告需要包含
总结需要对出现的问题做一下总结, 并且对数据做统计, 并对责任人进行奖惩.
奖惩的话需要有细节做说明, 还必须要有相应的计算方式, 这个需要考核, 主观因素占比降低
测试在钉钉预约时间(时间尽量控制在下班前半小时左右, 不要耽误太多的正常开发时间)
惩罚:确定 bug 严重程度,确定相关责任人的惩罚金额,由人事配和完成;
整理到纸质上线出问题处罚表里,也需要整理到文档里;
项目奖惩制度需要落实绩效制度 [todo] 绩效考评制度
对项目需要的部分进行绩效考核.
线上出现的所有问题全部提交给测试,由测试进行复现/bug 级别定义
bug 版本发布
线上出现的问题经过复测后必现后由产品进行版本规划, 修改完成之后需要记录工时, 便于绩效跟踪[todo] 这里需要有上线跟踪文档以及是否计入工时
Test
测试对整体项目进行总结, 对项目测试/对接中的问题进行汇总汇报
延期人员
由延期人员对延期时间做一个说明
版本负责制(项目跟踪)
开发者/测试/App 开发 对本次项目开发过程中线上出现的问题负责, 测试/前端/后端存在连带责任.
责任界定
这里需要有文档
每晚对工作内容完成度进行核对, 进行任务跟踪, 如果有需要 LD 组织问题进行商讨, 提出相应的解决方案, 如果有差异, 需要当日提出, 并提出相应解决方案
用例模板 测试工作中各类测试用例的简要模板
注意事项
1 | 用例大纲 |
v3.1(2021 年 10 月 25 日)
v3.0(2020 年 11 月 03 日)
v2.3(2019 年 06 月 04 日)
v2.2(2019 年 03 月 24 日)
v2.1(2019 年 02 月 26 日)
v2.0(2019 年 02 月 11 日)
v1(2018 年 11 月 8 日)
功能测试任务
文档任务
性能, 压力
上线
根据产品经理提供的文档对功能进行复核
编写使用说明书
1、软件相关专业毕业,但对工作性质、内容有一定了解,暂时不具备胜任工作的基本技能;
2、掌握软件测试的理论知识,熟悉软件测试相关工具,
3、有成为软件测试工程师的意愿和潜力,值得公司培养;
1、能看懂产品原型、UI 设计,熟悉软件测试工具,对基础知识掌握比较完善;
2、能在指导下根据产品原型、UI 设计发现并提交 bug;
3、熟悉工作的流程,能明确直属上级在工作输出上对自己的要求;
1、能根据产品原型、UI 设计发现并提交 bug;对提交的 bug 进行跟踪和管理,能进行回归性测试;
2、对测试工作的要求、流程有充分认识,能根据流程进行基本的测试,
3、遇到困难能积极寻求帮助、主动查找解决方案,推动项目进展;
4、能明确自己的工作职责,顺利开展工作;
5、能够融入所在部门,能够和同事相互协作;
实施软件测试,并对软件问题进行跟踪,推动测试中发现问题及时合理解决
能独立解决工作中遇到的问题,有自己的主观逻辑思想,能对 BUG 作出明确判断,并且按流程、规范完成所承担测试工作
选择、确定并验证所承担任务的具体测试方案,能够主动和同事进行有效沟通,解决当前问题,推动项目进展
参与项目计划制定
完成所承担工作的文档
完成直接领导分配的其他工作,及时根据工作安排进行合理的优先级改变
1、熟练掌握测试工具和测试方法,能独立完成项目的整体测试,并给出评估报告;
2、针对项目有自己的见解,能够参与项目的整体方案讨论,给出合理建议;
3、能整理出逻辑思维漏洞、常见 bug 类别,给予其他同事技术指导、帮助其完成测试工作;
4、了解行业新的测试技术和测试工具,结合公司的实际情况将其应用到实际工作中,改善测试环境、提高测试效率;
5、能根据测试进展,合理分配时间,安排好测试项目的具体进程;
有较多相关软件测试经验,可以承担多个项目的完整测试工作
可以很快的分析和理解测试用例并可以找到问题,实施软件测试并对软件问题进行跟踪、复现,推动测试中发现问题及时合理解决
针对项目有自己的见解,能够参与项目的整体方案讨论,给出合理建议
了解行业新的测试技术和测试工具,结合公司的实际情况将其应用到实际工作中,改善测试环境、提高测试效率;
5、能根据测试进展,合理分配时间,安排好测试项目的具体进程;
1、参与过中型以上项目测试,对系统的测试方案有所了解;
2、能熟练、高效、准确的完成测试工作,并给出可行性意见报告;
3、能够根据各个测试项目的进展,制定出整个部的详细工作方案,主导工作进展;
3、能够对测试中出现的各种逻辑思维漏洞、常见 bug 进行分类汇总并找出解决方案,能对其他同事进行技术培训;
5、能够制定测试的规范流程,并监督实施;
有较深的相关软件测试的经验,承担多个项目的完整测试工作
对先关行业有较多经验,对程序设计有一定经验,具有技术创新能力,为软件测提供新的方法和新的技术
能够根据各个测试项目的进展,制定出整个部的详细工作方案,主导工作进展;
能够对测试中出现的各种逻辑思维漏洞、常见 bug 进行分类汇总并找出解决方案,能对其他同事进行技术培训;
能够制定测试的规范流程,并监督实施;
有较丰富的软件测试专业技能和工具运用技能,特别是从专业实践中获得的技能
1、拥有丰富的研发、测试经历,能带领团队进行大型项目测试;
2、能建立、建全质量监控管理体系和内部管控系统;
3、能根据公司的发展需求,追踪收集测试新技术,能通过系统培训,提高团队能力;
4、对行业行情有深入研究,能根据公司现状、发展需求对测试部门进行前瞻性的职能规划,满足公司发展需求;
一、UI 设计师(APP)
根据产品经理提供的产品需求,对产品的整体美术风格、交互设计、界面结构等做出设计;
负责项目中各种交互界面、图标、LOGO、按钮等相关元素的设计与制作;
能积极与开发沟通,推进界面及交互设计的最终实现。
对页面进行优化,使用户操作更趋于人性化。
进行界面完成后的尺寸标注工作
辅助开发进行项目进展工作
维护现有的应用产品
二、UI 设计师(网站)
三、广告设计
四、其他部分
UI 标准的指定
用户体验设计
交互设计
视觉设计的基础级别
视觉能力:
交互能力:
这就是初级的 UI 设计师,我相信大部分设计师都是停留在这个阶段,毕竟这样要达到,都有一定的难度的。需要很多临摹,很多实践,才能积累下来的。
视觉设计需要突破到一个新领域的级别
视觉能力:
交互能力: 5. 对于交互有比较深入的理解,并且已经能够胜任交互设计的工作。 6. 有一定的沟通能力,能清晰的表述整个设计的逻辑和交互方式。 7. 能根据产品文档或领导口述进行交互图制作,并且参与 PK 会议,能不能胜出我觉得还是靠别人是不是认可你的,不是靠自己说了就能赢的,哈哈。
用研能力: 8. 掌握用研基础,实时关注用户的反馈,认真去分析用户反馈的真实问题在哪,而不是盲目听从和跟风。 9. 掌握用研的方式和分析其有效性
一个把控和平衡全局级别
综合能力:
作为视觉来说,如果实现皮肤的底层强大,足以支持未来几年的需求,那么之后的工作会顺利很多的。这里又要拿 QQ 输入法举例,当时的底层设计的时候支持蒙板遮罩、Apng 动态图、切图带链接等。所以到今天为之,这个底层可以适应各种皮肤,如相框皮肤、动态皮肤、点击皮肤进入网站等等。而听说搜狗输入法现在的皮肤底层有 3 套架构在支持不同类型的皮肤,这就是当初设计的时候考虑欠缺或是开发时间限定的原因。这会导致安装包臃肿和系统缓慢,或是皮肤实现困难工作量大等问题。 5. 从用户研究中分析出准确的原因,并且提出实效的建议去解决问题。 6. 熟悉各种终端的交互和视觉规范或风格特性等。比如 pc、mac、ios、安卓之类的,并且在上面利用其特性合理的进行设计。
所谓的 S,就是未能划分的,全都丢到 S 去,一般这样的情况的时候,人的能力点都非常突出和饱满了,就会往自己的方向去走了。那就是在这个阶段会孵化出独特的个人能力和魅力,会产生出不同形态的神级设计师。
综合能力:
那么,如果单纯设计一个外形的话,看似是一个视觉的事情,但是要由产品去定义其个性和功能点,交互定义其行为方式,视觉最终去实现的话,通常都会出现很有趣的状态,我把他称为肢解再组合的产物。 2. 自我体现能力,通常这个时候,应该是积累很多的了,会根据经验和能力产生出独特的念能力的。
也就是说,会形成一个独特的神级形态,比如有些是喜欢在级别 B 的基础上,做专攻视觉的大师,把视觉发挥到极致,不管多么不合理的交互,都可以用视觉去弥补。或则是在 A 的基础上,做产品经理,来让引导整个局面等等,这里其实可以不用说特别多的例子,因为在这里去分化的话,是不可控的,结果也是很精彩的。 3. 神级设计师的地位,因为在这个行业里面的时间很长才能达到,所以资格会很老,加上嘴巴也很能说,自然会各有千秋。
以下内容摘抄自 profiling PHP 脚本
xdebug 的 profiler 是一个强大的工具,它能分析 PHP 代码,探测瓶颈,或者通常意义上来说查看哪部分代码运行缓慢以及可以使用速度提升。Xdebug 2 分析器输出一种兼容 cachegrind 文件格式的分析信息。这允许你能使用出色的 KCacheGrind 工具(Linux,KDE)来分析你的 profiling 数据。在 Linux 可以使用你最喜欢的包管理器安装 KCacheGrind。
在 windows 系统上,有预编译的 QCacheGrind 二进制程序(QCacheGrind 是没有 KDE 绑定的 KCacheGrind)。
在 Mac OSX 系统上,这里也有怎样安装 QCacheGrind 的说明。
Windows 用户可以选择性的使用 WinCacheGrind。它的功能不同于 KCacheGrind,所以 这个页面的 KCacheGrind 使用文档章节不适用于这个程序。WinCacheGrind 目前不支持 Xdebug 2.3 引入的 cachegrind 文件格式的的文件和函数压缩。
这也有一种可替代 profile 信息演示的工具叫做 xdebugtoolkit。一款基于 web 前端叫做 Webgrind,和一款基于 java 的工具叫做 XCallGraph。
如果你不能使用 KDE(或者不想使用 KDE)的 kcachegrind 包,可以用 perl 脚本 “ct_annotate”,它能从分析器跟踪文件生成 ASCII 输出。
这里依旧使用最小化配置
1 | ; profiler |
配置完成之后重启 php-fpm
或者 apache
安装 chrome 扩展 Xdebug helper
在上边设定的文件夹中会生成 profiler 文件
Xdebug 生成的结果是 CacheGrind
格式
这里我使用 phpstorm 的分析工具来查看
Tools > Analyze Xdebug Profiler Snapshot
选择生成的 输出文件, 可以看到文件的解析信息, 这个对于分析自己写的php代码会有很大益处
所谓标准化就是必须要要执行的内容是开发的下限, 是本职工作中必须要做的事情, 并且是不能够去违背的, 也就是规则
一些是开发的规则
一些是职业的规则
对于代码部分的规则, 参考代码规范, 这里是对业务部分和职业部分进行标准化约定
对项目负责,负责软件项目的详细设计、编码和内部测试的组织实施,完成分配项目的实施和技术支持工作。
与项目相关人员配合共同完成应用软件的开发工作;
参与需求调研、项目可行性分析、技术可行性分析和需求分析。
熟悉并熟练掌握交付软件部开发的软件项目的相关软件技术。
负责向项目负责人及时反馈软件开发中的情况,并根据实际情况提出改进建议。
参与软件开发和维护过程中重大技术问题的解决。
追踪上线情况已经线上存在问题。
跟踪 IT 技术进展,做好技术储备
精通 OC/Swift 语言基础 精通 UIKIT 熟悉网络通信机制 具备主流开源框架使用经验,研究过源码,并懂得他们的原理,
完成基本的页面搭建,通过三方库的引用于使用完成功能
熟悉常用网络框架并使用网络框架进行上传
熟悉 iOS 常用内置的 API
能根据业务逻辑,完成数据与 UI 的对接
了解视图加载顺序
扎实的编程基础、数据结构、算法基础 深入理解语言机制、内存管理、网络、多线程、GUI、运行时 精通常用设计模式、框架、架构 良好的分析、解决问的能力 熟悉 Core 相关的框架 单元测试
能够接受各种新功能的开发(这里是指,即使你没有做过,但是你仍然可以凭借着学习,解决任何业务需求:例如:蓝牙.AR.摄像头.硬件交互.等)
中级知识点
设计模式
• UIScrollView/UITableView/UICollectionView 的嵌套
• 动态行高
• 通知/代理/block
• 程序启动原理 • 触摸事件/手势
• 图文混编
• Runtime
• NSRunLoop
• GCD
• ReactiveCocoa 开发
• 3DTouch
• 界面渲染
• Charles 花瓶抓包
第三方库安全性评估
架构风险评估,项目风险评估
具备创新并开发出新框架的能力
有自身技术专项领域.在这个领域有积累有造诣,解决公司核心业务.比如项目安全.图形图像处理,音视频.能够帮助公司攻克技术难度,做技术预研.
解决研发过程中的关键问题和技术难题(方案和思路)
调优设备流量、性能、电量
较强的软件设计能力,动态加载,异步绘制框架
对 iOS 内部原理有深刻理解
高级算法:加密等
逆向,OpenGL ES, Metal
iOS 高级知识点
XMPP 加密
Socket
MD5 详解 Base64 加密解密 RSA 非对称加密 AES 对称加密
音频
基础 Core Audio Audio Toolbox OpenAL AVFoundation Speex 语音聊天 AudioQueue/AudioSession Speex 简介
视频
AAC 视频.H264 推流 P2P 传输
直播
直播的技术分析与实现 RTMP 协议 RTMP 直播应用与延时分析 如果做一款 inke 版的 App 推流发布和播放 RTMP FFmpeg 基于 FFmpeg 的推流器 HLS 流媒体传输协议(HTTP Live Streaming) FFmpeg ijkPlayer
算法
简介 冒泡排序 快速排序 插入排序 归并排序 二分查找 希尔排序 动态规划 堆排序
精通底层原理,数据结构等,可以进行二进制重排
能领导公司相关方面的研究、开创业界一些实践
对公司某一方面的战略规划和未来走向产生影响
精通高性能编程以及性能调优(前期性能瓶颈分析)
灵活运用数据结构、算法解决复杂程序设计问题
提供性能优化、日志搜集、统计分析方案
架构、模块设计
App 内核
底层框架的解读;
自身:跨平台技术学习、iOS 开发语言学习(Objective-C、swift)、SQL 使用
运维工程师详细工作内容
1、了解计算机专业的基础知识,懂计算机的基本操作,掌握一门基础的程序语言即可
2、BAT 一般空缺,为非常低端岗位预留
1、熟练掌握一种语言,掌握一种开发环境
2、了解编译器的原理和实现机制,了解操作系统中的内部机制
3、能独立完成复杂任务,能够发现并解决问题
4、在项目当中可以作为独立的项目组成员
1、深入了解一门操作系统,掌握某项领域知识的各种思想原理
2、各种经验、技能、技巧掌握下来,学习一些知名的开源项目
3、对于复杂问题的解决有自己的见解,对于问题的识别、优先级分配有见解,善于寻求资源解决问题
4、可独立领导跨部门的项目;在专业方面能够培训和教导新进员工。
1、做基础研究,研究非数值”计算”
2、在专业领域,对自己所从事的职业具备一定的前瞻性的了解
3、对于复杂问题的解决有自己的见解,对于问题的识别、优先级分配见解尤其有影响力,善于寻求资源解决问题
4、可独立领导跨部门的项目;能够培训和教导新进员工;
5、是专业领域的资深人士;行业外或公司内培养周期较长。
1、在某一专业领域中,对于业界的相关资源及水平比较了解;
2、参与部门相关策略的制定;对部门管理层的在某个领域的判断力产生影响;
3、对事物和复杂问题的分析更有影响力。
4、进行创新。对任何一种简单的东西,需要考虑各种各样的需求,以需求来驱动研究;对各种最基础性的查找结构和算法都了然于胸。
1、是某一领域中的资深专家;对某一专业领域的规划和未来走向产生影响
2、有较大的贡献。(首先解决问题必须是比较重要的,其次你要比前辈们在某方面有一个较大的提高,或者你解决的是一个全新的以前没有解决过的问题;最重要的是,主要的思路和方法必须是你自己提供的,不再是在别人的思路基础上进行的优化和改进。)
1、在公司内部被认为是某一方面的专家或者在国内的业界范围具备知名度和影响力;
2、对公司某一方面的战略规划和未来走向产生影响;
3、在本领域的思想和研究在公司具备较大的影响力;
4、年薪 80-100w,国内约有 2w 人
1、业内知名,对国内/国际相关领域都较为了解;
2、对公司的发展做出重要贡献或业内有相当的成功记录
3、所进行的研究或工作对公司有相当程度的影响;
4、年薪 120-150w,国内约有 0.3W 人
1、在公司内部被认为是某一方面的专家或者在国内的业界范围具备知名度和影响力;
2、对公司某一方面的战略规划和未来走向产生影响;
3、在本领域的思想和研究在公司具备较大的影响力;
4、使命感驱动。
1、业内顶尖人才, 对于国际上相关领域的思想/实践都有独到的见解并颇受尊重,比较有名望;
2、对公司的发展做出重要贡献或业内有相当的成功记录;
3、能领导公司相关方面的研究、开创业界一些实践;
4、所倡导或所开创一些做法对公司的未来有深远的影响;
5、年薪 160w+,国内约有 0.1W 人
事故指的是线上出现的产品质量问题并且对运营造成严重影响的, 或在可预见范围内造成严重影响的.
核心业务重要功能不可用且大面积影响用户
例如:
奖惩
取消年度考评, 取消年度晋升/提薪
核心业务重要功能不可用,但影响用户有限
奖惩
取消季度考评, 取消本季度中剩余月份奖金, 最长 3 个月
核心业务周边功能不可用,持续故障将大面积影响用户体验
奖惩:
取消当月考评, 取消当月奖金
周边业务功能不可用,轻微影响用户体验
其他高于缺陷却无法列入 P0-P2 级别的事故
例如 :
奖惩:
扣减月度绩效 10+ 分值
缺陷定义为已上线, 有日志 / 复测证明该问题存在
系统偶发崩溃、挂起、非正常关闭等导致系统不能继续运行
包括以下各种错误:
奖惩:
扣减 5 分, 超过三次, 本月绩效取消
软件不稳定、或破坏数据、或产生错误结果,或部分功能无法执行,而且是常规操作中经常发生或非常规操作中不可避免的主要问题
包括以下各种错误:
奖惩:
扣减 3 分
系统性能或响应时间变慢、产生错误的中间结果但不影响最终结果等影响有限的问题。
包括以下各种错误:
奖惩:
扣减 1 分
使操作者使用不方便或遇到麻烦,但它不影响执行工作功能或重要功能。界面拼写错误或用户使用不方便等小问题或需要完善的问题。
包括以下各种错误:
奖惩:
扣减月度 0.5 分
缺陷分类目的:
经开发和测试确认, 确定权责
因需求文档缺失, 流程设计不完善等导致的流程不一致的问题, 产品负全责
线上出现界面和设计图不符合问题, 经确认之后出现的问题
开发配置导致的问题, 开发权责, 一般于运维/部署相关
配置文档完善与否导致的错误, 测试/运营/产品确定相关权责
[暂不实行]
[暂不实行] 测试对性能负有 30% 责任, 开发 70%
包含操作易用性, 通用异常
暂时未弄清楚原因的或无法定位问题的及以上原因分类无法包括的;