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
- 配置参数与优化
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 — 统计信息查看
jmap + MAT — dump 内存,分析内存
jstack — 线程快照,堆栈跟踪
jstat [ generalOption | outputOptions vmid [ interval [ s|ms ] [ count ] ]
sudo -u tomcat jstat -gcutil ${pid} 1000 1000
sudo -u tomcat jmap -dump:format=b,file=memMap.hprof ${pid}
sudo -u tomcat jstack ${pid} > jstack.txt
其他:
-
可视化工具 — jvisualvm、jprofile、your-kit
-
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 ~
看完赶紧弄个 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