Be a proficient and pragmatic programmer


主要内容


  • Linux 生存环境
  • JVM 
  • 测试、运维工具
  • 脚本语言
  • 其他


问题背景


  • proficient -- 不要浪费自己的、别人的时间
  • pragmatic -- CS 学科涉及太多知识、技能

Linux ?


Linux、Windows、Mac OS X 并无尊卑之分

  • Windows 长于办公、游戏
  • Windows 不适合『折腾』.NET 之外的开发
  • Linux 长于配置开发环境(服务器环境都是 Linux)
  • Linux 的桌面软件体验差(字体、办公软件、输入法 ...)
  • Linux 与办公有关的东西略折腾
  • Mac OS X 综合体验不错,但是略贵~(推荐)
  • Windows + 虚拟机 Linux,综合平衡(推荐)

Linux -- distro

发行版的区别从日常体验来看主要是:包管理、服务管理

  • 和机房环境统一,用 CentOS;想尝鲜,用 Fedora
  • 软件、资料支持较好:Ubuntu,但是小白也多
  • Geek 范儿:Slackware、Gentoo、LFS
  • 我个人使用 Arch Linux,五年(综合平衡)

Linux -- ssh

ssh 连接、认证工具 != Struts/Spring/Hibernate
ssh 内容本身就够一本书,pragmatic 部分:
  • ssh-keygen
  • .ssh/config
  • 免密码登录
  • ssh-copy-id
  • 跳板机
  • 持久化连接共享
  • ssh 连接参数优化
  • ssh 安全:换端口,禁用 root密码连接,白名单
  • ssh tunnel(科学上网简便方案)
  • (ftp/vpn/...) over ssh

Linux -- tmux

tmux 是一款终端多路复用工具

  • 可以省掉开多个窗口
  • 可以对窗口屏幕分区
  • 可以保持打开的窗口(衍生的管理工具)
  • 可以保持运行的程序(理解父子进程)
  • 可以脚本化操作上述内容(变化出各种监控工具)
  • 可以较为方便的查找、复制、拷贝屏幕内容
  • 可以 session 共享,结对编程神器
  • 不支持古老协议:serial、zmodem(screen 支持)
  • 操作不当易残留程序

Linux -- editor

  • vim 和 emacs 至少会一个(在服务器上生存)
  • 不要参加『圣战』
  • 简化配置,be pragmatic(不要华丽、臃肿)
  • 团队统一(四空格缩进、无尾随空格 ...)
set sts=4 ts=4 sw=4 et si ai
set ruler
set hlsearch
syntax on
filetype plugin on

sed、awk 等流编辑器
  • 管道思想
  • 无交互编辑,批量运维

Linux -- command

  • man
  • pwd、readlink
  • file、less
  • head、tail、grep、sort、uniq、tee
  • sed、awk
  • tree、find、locate
  • chmod、chown、chattr
  • ps、top、jobs、bg、fg
  • telnet、nc、ssh、scp、rsync
  • autojump、ag


找场景多练习,写 wiki 分享好用法(一千零一夜)

Linux -- shell

  • bash ? zshell ?
  • shebang、set -e、set -x
  • 理解、会用管道(神器 pv)
  • 会组合命令
  • 理解环境变量
  • 理解标准输入、输出、错误流,重定向
  • 会定义变量
  • 会使用函数
  • 会写判断、循环

Linux -- network

  • ifconfig
  • ping
  • dig
  • mtr
  • nc
  • socat
  • route
  • iptables
  • dnsmasq
  • tcpdump

Linux -- package

当工具不全或不够好用时,需要安装扩展

  • 包管理:yum、apt-get、pacman
  • 手动安装:
./autogen.sh
./configure --args=xxx
make
make install
  • 可以自己下载 Nginx、PostgreSQL 编译安装体验一下
  • 注意编译工具链的完整
  • 注意依赖库和版本
  • 出错不要逃跑,先看官方资料
  • 另外,各种编程语言也有扩展包和管理工具

Linux -- git & svn


  • git: config/clone/branch/add/commit/push/pull/merge
  • git 简明教程:no deep shit
  • github,自己建立 repository 体验一下(dotfiles 分享)
  • svn: cp/co/ci/up/merge
  • 结合 shell,维护自己常用操作的快捷方式(merge)
  • 养成良好提交习惯、注释习惯
  • 冲突不可避免,但可以追求最小化,处理冲突『慎、细』
  • 探索好用的扩展工具(tig)
  • Be pragmatic,我们不是配管人员,无须研究冷门知识

Java -- JVM

  • JVM 与操作系统的关系
  • 类加载器
  • 指令、字节码、执行引擎
  • 线程类型、状态
  • 内存模型
  • GC
  • 配置参数与优化

参考资料:

  1. Java Virtual Machine: the Essential Guide
  2. Understanding JVM Internals
  3. Understanding Java Garbage Collection

Java -- vm args

java \
-server -Xms10240m -Xmx10240m -Xmn1024m -Xss256k -XX:PermSize=256m \
-XX:+DisableExplicitGC -Xnoclassgc -Xverify:none \
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled \
-XX:+CMSClassUnloadingEnabled -XX:+UseCompressedOops \
-XX:CMSInitiatingOccupancyFraction=75 \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintTenuringDistribution \
-Xloggc:$CATALINA_BASE/logs/gc.log\
-Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false \
-Djava.util.Arrays.useLegacyMergeSort=true \
-XX:+TieredCompilation \
-XX:CICompilerCount=4
参考资料:

Java -- tomcat

  • source /etc/profile
  • CATALINA_HOME
  • CATALINA_BASE
  • server.xml
  • startenv.sh
  • CATALINA_OPTS
  • JAVA_OPTS
  • TOMCAT_USER
  • $CATALINA_HOME/bin/startup.sh

Java -- tools

jstat — 统计信息查看
jstat [ generalOption | outputOptions vmid [ interval [ s|ms ] [ count ] ] 

sudo -u tomcat jstat -gcutil ${pid} 1000 1000
jmap + MAT — dump 内存,分析内存
sudo -u tomcat jmap -dump:format=b,file=memMap.hprof ${pid}
jstack — 线程快照,堆栈跟踪
sudo -u tomcat jstack ${pid} > jstack.txt
其他:
  1. 可视化工具 — jvisualvm、jprofile、your-kit
  2. Trace 工具 — Btrace

测试、运维工具 —— 压测

  • http_load(固定 url 列表)
-p	-parallel	并发的用户进程数
-f	-fetches         总计的访问次数
-r	-rate            含义是每秒的访问频率
-s	-seconds	        连续的访问时间
url	url文件
  • python + gevent(编程,动态参数)
def process(url):
    r = requests.get(url, timeout=1)
    print r.text

def main():
    worker_num = 3
    pool = Pool(worker_num)    
    sites = ["google.com", "bing.com", "duckduckgo.com", "stackoverflow.com"]
    for url in sites:
        pool.apply_async(process, args=(url,))
    pool.join()
~~ 不要在办公网对生产环境进行压测 ~~

测试、运维工具 —— 流量拷贝

  • 重构代码测试覆盖
  • 修改算法测试效率
  • 寻找可优化的点


以上场景需要把线上流量导入测试环境中 —— tcpcopy

  • TCP/IP 基础知识
  • tcpcopy 安装
  • iptables 
  • route  配置

~~ 注意流量拷贝的连带影响 ~~

测试、运维工具 —— 批量运维

from fabric.api import run

def host_type():
    run('uname -s')
$ fab -H localhost,linuxbox host_type
[localhost] run: uname -s
[localhost] out: Darwin
[linuxbox] run: uname -s
[linuxbox] out: Linux

Done.
Disconnecting from localhost... done.
Disconnecting from linuxbox... done.
  • 批量上传、安装软件
  • 添加帐号、修改 crontab
  • 统计日志、监控数据


~~ 注意属组、权限 ~~

脚本语言 —— python

看完赶紧弄个 python 环境,幸福生活从此开始:

  • 数据抓取、清洗
  • web UI、HTTP 接口
  • 科学计算、统计、机器学习、NLP
  • 系统运维
  • 图像处理
  • 数据库、cache、队列管理
  • 各种开发、测试小工具


如果做上述任务,且无其他拿手语言,请用 python

脚本语言 —— others

Lua 
  • 易于嵌入其他运行环境(nginx、redis)
  • 利用脚本的灵活性来实现逻辑
  • 如 openresty(nginx + ngx_lua + lua scripts)
  • 生产 nginx 中较复杂的转发规则由它实现

HiveSQL
  • Hadoop 环境数据处理工具
  • 利用 SQL + streaming 机制实现大数据处理
  • 本部门的数据统计任务、报表都由它来完成

其他

  • 学会科学上网,freedom is not free
  • 学会提问,懂得先 STFW & RTFM
  • 技术问题不要看国内搜索引擎、二手资料
  • 多逛官网、社区、邮件列表、stackoverflow
  • 多逛 github、ycombinator、reddit
  • 优先看英文资料(书籍、文档、论文)
  • 多看源码,尽量去了解原理
  • 遇到错误别逃跑,bug、故障都是成长好机会
  • 做好 GTD,要事为先
  • 欢迎多鼓捣、交流、分享(wiki、blog)
  • perfect practice makes perfect






Questions ?




Thank you !

Be a proficient and pragmatic programmer

By songchao

Be a proficient and pragmatic programmer

做个有效率的程序员

  • 1,068