做主程序员是怎样的体验?

程序员觉得自己长期徘徊在业务逻辑上,希望成为一名主程序,不知道主程序需要会哪些东西。是不是每个主程都有自己的框架?是不是要熟悉各种技术的底层内核?

想成为技术负责人是好事,说明你起码是一个有事业心的人,如果真的想成为技术负责人就该卖力工作,多解决工作中实际问题,做到比别人业务更熟练,然后先成为骨干,再有合适的机会成为主程。

自己工作中出成绩,比你写什么框架都强。别搞反了,成天把时间费在和工作无关的事情上,耽误了本职,最终给别人留下一个:知道的挺多的,可惜工作不突出,做东西又慢的印象。

见过的凡是得到提升任命的主程们,无不是出色的解决了工作中各种实际问题,或者优化了性能,或者降低了整体开发成本,引入更多自动化机制,或者解决了效率问题。他们都是主动在工作中争取承当更大责任的人,不是成天钻研各种虚无缥缈的东西的人。

怎么争取承担更大责任呢?一句话,快,做东西要快,别人做两天你做一天,天下武功唯快不破。时不时告诉主程你已经做完了,接下来做什么?多问几次,然后主动跟他提,哪块还需要搞一下,你想把它搞一下,不然以后XXX。

承当了更多责任的时候,就可以象主程提建议说自己这边事情太多,能不能有1-2个实习生或者新人。然后从带好实习生和新人开始,多为组内培养人才,进而成为组内骨干。

Continue reading

Loading

Posted in 大浪淘沙 | Tagged | 3 Comments

使用 Markdown 写 WordPress

使用 Markdown 来再命令行写 WordPress 的感觉很不错,我整合了两个 Python 库,一个叫 blogpost, 另外一个叫做 markdown2,前者可以用来命令行发送 WordPress 文章,但是只支持 .html 或者 asciidoc 格式来写 WordPress,因此又引入了 python 的 markdown2,合成项目:

https://github.com/skywind3000/markpress

但是标准 Markdown转换出来的 html 再 wordpress中高亮不正确,因此费了点时间修改了一版 markdown2 为 markdown3 ,调整了相关的样式,可以很好的在 wordpress 中显示,同时使用了 metadata,再文章中 可以指定标题和类别,使用很简单,首先克隆项目:

 $ git clone https://github.com/skywind3000/markpress.git

然后创建你的工程目录 myblog(用来保存文章和相关中间数据,推荐提交到版本管理系统上来),目录为:

myblog +- wordpress.ini  # 站点配置文件,url,用户名,密码
       +- doc            # 存放 markdown 文章源文件的目录
       +- data           # 自动生成的 postid/html等,丢失会导致重新发文
       +- images         # 保存图片的目录,文章中图片都用 "../images/*" 引用

Continue reading

Loading

Posted in 随笔 | 1 Comment

ATOM 同 Vim/Emacs/Sublime 的深度比较

用过不少编辑器:UltraEdit / EditPlus / (G) Vim / GEdit / NotePad++ / TextMate / ProgrammerPad / Sublime 。确实是工作上用他们写过代码的。而 VSC / Emacs 只是体验了一下基本使用方法,算不上真用。用下来的结论是:Atom 比 Vim 更 Vim,比 Emacs 更 Emacs,同样,比 Sublime 更 Sublime。

Atom 唯一的槽点就是“卡”,不过那是去年的情况了,1.0后性能数次大提升,比起sublime/vsc之类虽不算流畅,但同时编辑20个数千行的文件没有压力。如今让人感觉慢的地方主要是启动loading(也大大短于eclipse, idea),使用时并没察觉它比其他编辑器慢再哪。而文本编辑器的快慢,更重要的是“让你工作更快更有效率”。下面说说为何 Atom比其他更有效率:

兼容VIM模式

这无疑团结了一大班 Vim过来的用户,Sublime虽然也有VIM模式,但是Sublime在 mac下面的vim模式有bug,我习惯用 hjkl来移动光标,sublime再mac下hjkl移动有问题,且我习惯CTRL_[来返回NORMAL,手指不离开主键盘区,而sublime的vim模式只支持ESC返回,加上其作者经常神秘消失,最稳定的2.x版本已三年没有更新,这些问题一直得不到修正。

由于Atom的定制程度直追 Vim/Emacs,它的vim模式能够使用插件来实现,而不像sublime必须builtin,Atom的VIM模式除了官方实现外还有很多用户实现,各有所长,你不喜欢可以换,Sublime就傻逼了,觉得builtin的不行,你就没办法了,而且作者不更新你也没办法。

Atom里的Vim模式并不是强制的,你可以用也可以不用,这样入门用户也不会觉得困难,但是如果你用惯Vim的话,使用Vim模式可以取得更好的效率,我觉得Vim / Atom-VimMode能够提升效率的地方有以下三方面:

1. 手指不离开主键盘区:

所有功能皆能在主键盘区完成,不用去按方向键,不用把手挪去按Home / End,更不用动鼠标。就像咏春中强调中线理论,认为一切动作围绕中轴线开展,守护自己中轴线的同时攻击别人的中轴线。Vim / Atom-VimMode中,双手不但从不离开主键盘,并且八根手指随时守护再HOME位(ASDF, JKL;)有动作就移动,然后马上归位。

2. 细粒度微操作:

星际、dota玩的好,微操是基本功,微操作更精确,效率更高,Vim/Atom-VimMode一样,比如:

if (xxxx) {
}

很多人编写代码的时候都会习惯“成对编码”,写了申请资源的代码,先把释放资源写了,写了左括号,先把右括号给补充完,当你写完第二行代码时,需要用到“再1-2行中间插入一行”,此时你的光标停留在第二行,传统编辑器你需要:按上箭头移动光标到第一行 -> 按END键去到第一行末尾 -> 按回车插入一行,mac下的END键还需要用CMD+右来组合出来,而Vim/Atom-VimMode中,你只需要shift+o即可,手指完全不离开主键盘区,不用像传统编辑器那样,右手先移动到箭头区又移动到HOME的小键盘区,再移动回主键盘区这么麻烦,类似还有:
使用o直接再下一行插入,避免 END/回车
使用I再行首插入,避免移动半天光标。
向前/后移动一个单词到单词头、尾。
快速更改当前单词,用/来快速搜索移动光标。
dd+p来快速移动代码块,取代shift+方向键半天。
shift-j 来两行合并成一行,代替 HOME, back 若干次。
。。。
你再编辑代码的时候,90%的情况可以直接一步完成,这就叫细粒度微操,而且整个过程手都不需要离开主键盘,不像传统编辑器那样,若干笨重的操作组合再一起,操作不够细步骤多的同时手还要再:主键盘区,方向键区,扩展键区 来回移动,效率奇低。而Vim/Atom-VimMode下,手指随时守护在home区(ASDF JKL;),所有微操都是围绕HOME区进行,不会移动到任何主键盘以外的区域,更别说用鼠标、触摸板。

Continue reading

Loading

Posted in 随笔 | Tagged | 4 Comments

Atom 编辑器的插件开发

老王卖瓜,自卖自夸,Atom 比较方便的地方是可以用 javascript/coffee 给 Atom写插件,并且写起来很简单,我刚按说明给 Atom 写了一个插件:
atom-shell-commands

用户自定义 Shell 命令,类似 NotePad++ 中的 “Run Commands”,EditPlus/UltraEdit里面的”User Tool”,以及 GEdit 中的 “External Tool” 和 TextMate 里的 “Shell Command”。

1. 用户可以自定义工具,并且配置到 Atom 中,比如一键调用编译器,一键运行,
2. 输出结果会显示再底部的 bottom panel 中
3. 点击错误输出可以跳转到对应有错误的文件上去
4. 自定义正则表达式匹配错误输出中包含的文件名和行号。
5. 全平台支持,再 Mac/Ubuntu/Windows 下充分的测试过。

初始化时,再你的用户配置中(Atom File->Open Your Config或者 ~/.atom/config.cson),写入类似:

  "atom-shell-commands":
    commands: [
      {
        name: "compile"
        command: "d:/dev/mingw/bin/gcc"
        arguments: [
          "{FileName}"
          "-o"
          "{FileNameNoExt}.exe"
        ]
        options:
          cwd: "{FileDir}"
          keymap: 'ctrl-2'
      }
    ]

的配置,就会创建一条名为 “atom-shell-commands:compile” 的命令,你可以通过 command palette来运行它或者使用快捷键 ctrl-2来直接运行。同时再 Atom 的 packages 目录下面的”Atom Shell Commands” 目录项下面也会多出一个名为“compile” 的命令。

注意,cson格式靠缩进来判断层次,同时 list 需要将 [ 和 key 写在同一行(commands,arguments),否则会被判断成字典。

靠,上面的代码缩进帖过来以后被弄没了,具体可以看:https://atom.io/packages/atom-shell-commands 上面的格式,CSON是靠缩进来判断层次的,同时注意:commands: [ 后面的中括号要和 commands写在一行,后面的 arguments也一样,cson的 list 需要把 [ 和 key 写在一行,否则会被判断为字典。

每条命令可以通过如下字段来表示:

name: 名字(必填)
command: 可执行路径(必填)
arguments: 参数(选填)
options: 扩展参数用来配置当前工作路径,文件是否保存,快捷键,环境变量等 (选填)

所有配置支持如下宏:

{FileName} 当前正在编辑的文件名(不包括路径)
{FilePath} 包含全路径的文件名
{FileNameNoExt} 没有路径和扩展名的文件名
{FileExt} 文件扩展名
{FileDir} 文件路径
{ProjectDir} 工程路径(如果有工程的话)
{ProjectRel} 文件相对于工程的路径(如果有工程的话)
{CurRow} 当前行
{CurCol} 当前列
{CurLineText} 当前行的文本
{CurSelected} 当前选中文本

有了这些宏,你几乎可以做任何事情,比如到工程目录下调用make或者cmake,或者仅仅编译单个文件不必理会负责的工程,或者调用 ant去跑 build.xml,或者调用 java来运行编译出来的.class,调用python来运行当前脚本,或者当前目录下执行下 grep 关键字并且把grep的结果显示再下面的 bottom panel,打开帮助文档跳转到你选中的API上,或者对当前文件调用 svn diff,把结果输出到 bottom panel。

比如:调用 gcc / cl 一键调用编译功能

 

比如:一键运行

比如:一键运行(打开独立窗口运行)

具体见项目主页:
atom-shell-commands

Loading

Posted in 随笔 | Tagged | 1 Comment

KCP同 UDT/ENET的性能比较

如果不丢包那么 KCP(https://github.com/skywind3000/kcp)和 TCP性能差不多,KCP不会有任何优势,但是网络会卡,造成卡的原因就是丢包和抖动,有同学在内网这样好的环境下没有用任何丢包模拟直接跑,跑出来的数据是差不多的,但是放到公网上,放到3G/4G网络情况下,差距就很明显了,公网在高峰期有平均接近10%的丢包,wifi/3g/4g下更糟糕,这正是造成各种网络卡顿的元凶。

感谢 asio-kcp 的作者 zhangyuan 对 KCP 与 enet, udt做过的一次横向评测,结论如下:

  • ASIO-KCP has good performace in wifi and phone network(3G, 4G).
  • Extra using 20% ~ 50% network flow for speed improvement.
  • The kcp is the first choice for realtime pvp game.
  • The lag is less than 1 second when network lag happen. 3 times better than enet when lag happen.
  • The enet is a good choice if your game allow 2 second lag.
  • UDT is a bad idea. It always sink into badly situation of more than serval seconds lag. And the recovery is not expected.
  • enet has the problem of lack of doc. And it has lots of functions that you may intrest. kcp’s doc is chinese. Good thing is the function detail which is writen in code is english. And you can use asio_kcp which is a good wrap.
  • The kcp is a simple thing. You will write more code if you want more feature.
  • UDT has a perfect doc. UDT may has more bug than others as I feeling.

具体见:横向比较这里。截取一段在网络糟糕时,asio-kcp/enet的延迟数据:

worst network lag happen:
asio: 10:51.21
291  295   269   268   231   195   249   230   225   204

enet: 10:51.21
1563   1520    1470    1482    1438    1454    1412    1637    1588    1540

我当年主要测试了 KCP和 TCP/UDT的比较,扫了一眼 libenet觉得协议实现中规中矩,缺乏很多现代传输协议的技术,所以并没有详细测试。而 asio-kcp的作者同时给出了KCP/enet/udt三者的详细比较,为更多犹豫选择使用那一套的人提供了更多指引。

Loading

Posted in 网络编程 | Tagged , | 9 Comments

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》,有朋友问光代码和文字不太真切,能否补充几张图片,今天我们演示一下:

这是第一帧画面:P1(我们的参考帧)

这是第二帧画面:P2(需要编码的帧)

从视频中截取的两张间隔 1-2 秒的画面,和实际情况类似,下面我们参考 P1 进行几次运动搜索:

搜索演示1:搜索 P2 中车辆的车牌在 P1 中最接近的位置(上图 P1,下图 P2)

这是一个演示程序,鼠标选中 P2 上任意 16×16 的 Block,即可搜索出 P1 上的 BestMatch 宏块。虽然车辆在运动,从远到近,但是依然找到了最接近的宏块坐标。

(点击 more 阅读剩下内容)

Continue reading

Loading

Posted in 图形编程, 编程技术 | Tagged | 4 Comments

内存拷贝优化(3)-深入优化

今天继续在原来内存拷贝代码上优化:

1. 修改了小内存方案:由原来64字节扩大为128字节,由 int 改为 xmm,小内存性能提升 80%
2. 修改了中内存方案:从4个xmm寄存器并行拷贝改为8个并行拷贝+prefetch,提升20%左右
3. 去除目标地址头部对齐的分支判断,用一次xmm拷贝完成目标对齐,性能替升10%。
4. 增加测试用例:为贴近实际,增加了随机访问,10MB空间内(绝对大于L2尺寸)随机位置和长度的测试

为避免随机数生成影响结果,提前生成随机数,最终平均性能达到gcc4.9配套标准库的2倍以上:

https://github.com/skywind3000/FastMemcpy

最新代码测试结果(可以对比老的表看新版本性能是否有所提升):

Continue reading

Loading

Posted in 编程技术 | Tagged , | 5 Comments

内存拷贝优化(2)-全尺寸拷贝优化

四年前写过一篇小内存拷贝优化:http://www.skywind.me/blog/archives/143

纠结了一下还是把全尺寸拷贝优化代码发布出来吧,没啥好保密的,

如今总结一下全尺寸内存拷贝优化的要点:

1. 策略区别:64字节以内用小内存方案,64K以内用中尺寸方案,大于64K用大内存拷贝方案。

2. 查表跳转:拷贝不同小尺寸内存,直接跳转到相应地址解除循环。

3. 目标对齐:64字节以上拷贝的先用普通方法拷贝几个字节让目标地址对齐,好做后面的事情。

4. 矢量拷贝:并行一次性读入N个矢量到 sse2 寄存器,再并行写出。

5. 缓存预取:使用 prefetchnta ,提前预取数据,等到真的要用时数据已经到位。

6. 内存直写:使用 movntdq 来直写内存,避免缓存污染。

 

部分理论,见论文:《Using Block Prefetch for Optimized Memory Performance

 

但论文考虑问题比较单一,所以实际代码写的比论文复杂不少,目前在各个尺寸上基本平均能够加速 40%,比较GCC 4.9, VS2012的 memcpy,不排除未来的 libc, crt库继续完善以后,能够达到下面代码的速度。但我看libc和crt的 memcpy代码已经很久没人更新了,不知道他们还愿意继续优化下去么?

行了,具体实现各位读代码吧,需要 SSE2 指令集支持,gcc编译时需要 –msse2 一下,点击(more)展开代码,测试结果附在源文件最后注释部分:

Continue reading

Loading

Posted in 编程技术 | Tagged , | 1 Comment