软件工程检查清单
源码管理
默认分支是否锁定
是否通过PR合并分支
PRs引用相关工作项
提交历史是一致的并且提交信息丰富(包含做了什么,为什么)
一致的分支命名约定
清晰的存储库结构说明文档
密码等安全信息不作为提交历史的一部分或者公开
公共仓库遵循OSS 规范
工作项跟踪
所有个工作项在DevOps系统跟踪
工作项内容是有组织的(泳道,特征标签,技术标签)
测试
单元测试覆盖大部分组件(最好大于90%)
集成测试按照 end-to-en测试方案进行
CI/CD
项目运行 CI,并在每个 PR 上自动构建和测试
在合并 PR 之前,Project 使用 CD 来管理到副本环境的部署
主分支总是可以发布的
安全性
仅根据需要授予访问权限
密码存储在安全的位置,而不是签入代码
数据在传输中被加密并且密码做hash
系统是否拆分为具有关注点分离的逻辑段?这有助于限制安全漏洞
可观察性
跟踪重要的业务和功能事件并收集相关指标
记录应用程序故障和错误
系统的健康状况受到监控
可以区分客户端和服务器端的可观察性数据
无需更改代码即可修改日志配置
传入的跟踪上下文被传播以允许生产问题调试目的
通用数据保护 ...
An incomplete list of skills senior engineers need, beyond coding
原文
1. 如何主持会议,不,在会议中发言最多的人和主持会议不是一回事2. 如何在合理的时间内编写设计文档、获取反馈并推动其解决3. 如何指导职业生涯早期的队友、职业中期的工程师、需要技术建议的新经理4. 如何让高级经理想谈论他们并不真正理解的技术内容,而不是翻白眼或让他们觉得自己很愚蠢5. 如何向闭门造车,不愿公开承认自己不理解的高级人员解释技术概念6. 如何影响另一个团队使用您的解决方案而不是编写自己的解决方案7. 如何通过寻求帮助的方式让另一位工程师为你做某事,让他们感到感激8. 即使您不管理任何参与项目的人员,如何领导项目9. 如何让其他工程师倾听你的想法而不让他们感觉受到被强迫10. 如何在不感到被强迫的情况下听取其他工程师的想法11. 如何放弃你的孩子,那个你建立在伟大事物中的项目,所以你可以做其他事情12. 如何教另一个工程师关心你真正关心的事情(操作、正确性、测试、代码质量、性能、简单性等)13. 如何向利益相关者传达项目状态14. 如何说服管理层他们需要投资一个重要的技术项目15. 如何在构建软件的同时在过程中交付增量价值16. 如何制定项目提案,将其社交化并获得支 ...
Centos 7.2搭建NFS集群
使用到的软件列表
名字
说明
DRBD
基于网络的RAID1实现
NFS
网络文件系统
pacemaker
一个群集资源管理器
crmsh
pacemaker cli
pcs
packmaker web ui + cli
corosync
集群成员之间通信管理软件
环境准备
host
ip
vip
os
lvm device
drbd device
nfs directory
node1
10.2.6.41
10.2.6.40
Cetnos7.2
/dev/nfs/work
drbr0
/home/nfs
node2
10.2.6.42
10.2.6.40
Cetnos7.2
/dev/nfs/work
drbd0
/home/nfs
时间同步
123[root@node1 .ssh]# sudo ntp timeserver[root@node2 .ssh]# sudo ntp timeserver
hosts配置
123456789[root@node1 .ssh]# sudo hostnamectl set-hostnam ...
Ubuntu18.4下搭建latex环境
环境
Ubuntu18.4
Vscode + latex workshop
TinyTeX
原本打算安装latex live但是安装需要5G存储空间,后来看到轻量级的TinyTeX,所以放弃使用Latex Live转而使用TinyTeX。
安装
VSCode 安装配置自行谷歌
Latex Workshop 直接在VSCode插件安装配置 12345678# setting中新增"latex-workshop.latex.magic.args": [ "-shell-escape", "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%"],
TinyTeX安装 1wget -qO- "https://yihui.name/gh/tinytex/tools/install-unx.sh" | sh
TinyTeX添加到path ...
LinkedIn的高效代码审查技巧(译文)
原文
Linkedin最近完成了百万次代码审查的里程碑。社交网络服务工具的负责人在此分享了其中的一些经验教训。
前言阅读和审查代码是每个工程师每天都要做的事情。然而,正式的代码审查过程有些许差别,它要求代码在投入生产之前,要由团队其他成员对每次的代码变更都进行正式的审查。自2011年以来,在Linkedin代码审查已经是研发流程的重要组成部分。我们要求代码审核的目标是尽可能顺利地扩大我们快速发展的工程团队。使用有意义的有用注释进行良好的代码审查可以帮助提升整个工程组织的水平。在LinkedIn,这些审查已成为质量保证和知识共享的重要组成部分。拥抱代码审查已经在几个关键方面改变了我们的整个工程文化。
实施公司范围的代码审查的最大好处之一是我们的开发工作流程中的标准化程度提高了。LinkedIn的每个团队都使用相同的工具和流程进行代码审查,这意味着任何人都可以帮助审核或为其他团队的项目贡献代码。这消除了诸如“我可以修复代码中的错误,但我如何构建代码并提交修复程序?”之类的问题。反过来,这有助于增加工程组织中不同团队之间的协作。
通过使代码审查成为强制性流程,我们还帮助培养了公司健康的反 ...
UML类图常用概念
UML类图常用概念UML中包括类图(Class Diagram)、状态图(Statechart Diagram)、用例图(Case Diagram)、对象图(Object Diagram)、构件图(Component Diagram)、序列图(Sequence DIagram)等。这里介绍类图基本概念。
类图由类名、属性、方法组成
接口可以被实现(虚线+三角箭头)、继承(泛化)(实线+三角箭头)
类或接口之间的关系有四种:依赖、关联、聚合、组合
说明假设Car类有三个成员变量,一个Tire类型的变量,一个Door类型的变量,一个Person类型的变量,以及一个方法cleanCar,该方法传入一个洗车设备类型的参数。
我们这里对汽车这个类做一个说明:
汽车是由轮胎Tire组成,就算没有汽车,轮胎也是可以单独存在的
没有了汽车便没有汽车门(这里把门看作是一个空间的概念,而不是看做物理的那种门,就好比没有颜色概念的话也就没有黑色这种说法,这里即:没有车就没有车门,这是为了说明一种关系)
汽车需要人开,车的存在和人的存在没有关系,仅仅是说车需要人来开
有一个洗车的方法,该方法需要传 ...
IP基础知识
ip分类和范围计算IP地址由网络号和主机号组成。全0和全1的主机号无效。
从信息传播角度IP地址有三类:
单播地址(目的为单个主机)
广播地址(目的端为给定网络上的所有主机)
多播地址(目的端为同一组内的所有主机)
互联网IP划分:
子网寻址IP地址除了网络号和主机号外,主机号可以再分为子网号和主机号,用来进行子网划分。
这样做的原因是因为 A类和B类地址为主机号分配了太多的空间,可分别容纳的主机数为224-2和216-2。事实上,在一个网络中人们并不安排这么多的主机。由于全0或全1的主机号都是无效的,因此我们把总数减去 2。子网划分缩减了路由表的规模。
子网掩码主机需要知道有多少比特用于子网号及多少比特用于主机号。这是在引导过程中通过子网掩码来确定的。这个掩码是一个 32 bit的,其中值为 1的比特留给网络号和子网号,为 0的比特留给主机号。
给定IP地址和子网掩码以后,主机就可以确定 IP数据报的目的是:
( 1)本子网上的主机;
(2)本网络中其他子网中的主机;
( 3)其他网络上的主机。
如果知道本机的IP地址,那么就知道它是否为 A类、B类或C类地址(从I P地址 ...
学习计划
JAVA基础
面向对象设计五项基本原则
面向对象设计三大特性
Java语言规范
常用API
集合框架
异常处理
流处理
NIO
AIO
JAVA并发
Java并发编程实践
实战Java高并发程序设计
JAVA高级特性
Java虚拟机规范
深入理解JVM虚拟机
实践
重构
JDK8新特性
设计模式
HeadFirst 设计模式
实践设计模式
网络
基础
IP知识
图解HTTP
TCP/IP 卷一 卷二
计算机网络 自顶向下
HTTP权威指南
数据库基础数学
高数
线性代数
概率论
数值分析
计算机基础
深入理解计算机系统
计算机程序构造与解释
算法
算法图解
算法 第四版
leetcode
大数据机器学习前端pythongolangc软件工程工具问题处理
学习React Redux(译文)
原文
Redux是一个在js应用中用来管理数据状态和UI状态的工具。对于管理随着时间的推移而变得复杂的单页应用程序(SPA)来说,它非常理想。它是框架无关的,虽然它由React编写,但是它同样可以在Anjular或者jQuery应用中使用。
此外,它是从一个“时间旅行”的实验中构思出来的 - 事实是,我们将在以后做到这一点!
正如我们之前的教程所见到的,React通过组件流转数据。进一步说,称之为“单向数据流”–数据从父组件流向子组件。因为这个特性,两个非父子关系的组件如何在React中进行通信并不明显:
React不建议以这种方式直接进行组件间通信。即使它确实有支持这种方法的能力,但它被认为是很糟糕的做法,因为直接的组件间通信很容易出错,并导致意大利面代码 - 一个难以遵循的旧代码术语。
React提供了一个建议,但他们希望你自己实现它。下面是React文档的一部分节选:
对于两个没有父子关系的组件之间的通信,你可以设置自己的全局事件系统。Flux模式是一个可行的方案。
这就是Redux的用武之地。Redux提供了将所有应用程序状态存储在一个地方的解决方案,称为“存储”。组件然 ...
Taiga环境搭建
Taiga环境搭建环境配置unbuntu 16.4
taiga stable
安装
创建taiga用户
sudo adduser taiga
sudo adduser taiga sudo
sudo su taiga
安装依赖软件
sudo apt-get update
sudo apt-get install -y build-essential binutils-doc autoconf flex bison libjpeg-dev
sudo apt-get install -y libfreetype6-dev zlib1g-dev libzmq3-dev libgdbm-dev libncurses5-dev
sudo apt-get install -y automake libtool libffi-dev curl git tmux gettext
sudo apt-get install -y nginx
sudo apt-get install -y rabbitmq-server redis-server
sudo apt-get ins ...