如何在不同平台下打开新窗口运行程序?

如果可以让自己的工作效率提升一点点,那么即便花费几天来开发一些工具也是值得的。在不同操作系统下自动打开终端窗口来运行指定的命令就是这样一件能提高工作效率的事情。

就像 Visual Studio 调试命令行程序的人都对打开一个新窗口运行命令行程序的模式情有独钟。EditPlus 也提供新窗口运行程序(可惜只限windows)。

而如果你在使用 Sublime/Atom/GEdit/GVim 之类的工具,你就会发现调试程序的时候程序基本上是在下面的面板中运行的,所有输出也是输出到下面的面板中。这时如果程序长时间运行是非常不方便的,又或者程序有交互(需要输入数据),基于GUI面板的运行方式也会显得十分笨重,而Vim/GVim之流更过分,一执行程序整个GUI就定住了,没法一边看代码一边查看一些长时间运行的程序状态,虽然Windows下的GVim可以用!start来解决(见Gim !start),但十分遗憾,Linux桌面或者Mac下面的Vim都没有这个 !start功能。

同时,哪天你切换到Mac/Ubuntu下开发了,你会发现这个问题十分恶心,这时候你往往需要写一些脚本来做这件事情。而在不同的平台下正确的escape并传递参数,正确的生成中间脚本(bash,applescript,batch)并且通过管道传递又是一项比较浪费时间的事情。

所以这两天写了: https://github.com/skywind3000/terminal 这个脚本来做这些,满足了我如下需求:

  • 在 Windows 下打开 cmd窗口执行若干命令
  • 在 Linux 下打开 xterm/gnome-terminal 来执行若干命令
  • 在 Mac OS X 下面打开 Terminal/iTerm 窗口来执行若干命令
  • 不同的操作系统下提供统一的调用接口
  • 可以方便设置:工作目录、窗口标题、窗口配置(Terminal/gnome-terminal/iterm)
  • 新窗口内执行完程序以后可以会等待按任意键才关闭窗口
  • Windows 打开 Cygwin 的 Mintty窗口并执行 Cygwin命令(Windows下编辑,Cygwin下运行)
  • Cygwin 下直接打开 Windows的 CMD窗口执行 Win32程序(Cygwin下编辑,Windows下运行)
  • Cygwin 下直接打开 Mintty窗口并运行cygwin命令(Cygwin下编辑,cygwin下运行)

如此,不管你运行在哪个操作系统下,使用何种编辑器,都可以提供完全一致的调试体验。一边编辑代码的同时,一边查看另一个窗口的程序实时输出。

Loading

Posted in 随笔 | Tagged | 4 Comments

当面试官说「你之前做的项目没有什么难度」,应聘者应如何应对?

很多面试官喜欢在被面试者那里找存在,找面子,如果是这种情况,你和他辩论半天干嘛?继续驳他的面子么?非要让人家生气你才高兴么?

另一种情况是确实很简单,在这种情况下,你又何必强调难呢?非要让人觉得你水平很普通容易的事情都觉得难么?

再有一种情况只是正常压力面试的一个环节,不过技术面试少用。

不管哪种情况,你和别人抬杠都是不明智的,

所以,你得先承认:

“也许这个工作在你们看来很简单,只需要xxxx”

然后说转折部分:

“但是我当时从来没有接触过这一块,第一次做开始完全没有思路,也没有人可以问,查了好多资料,自己又踩了蛮多坑才弄出了一点点效果,比如其中一个坑是xxxxx,搞的的X天X夜,都没有思路,最后突然想起在哪里看过的一篇论文,心想也许可以结合一下,于是又通宵编码,重新设计了XXX,终于XXX”

技术虽然不算难,你可以突出你的学习能力和解决问题能力,然后接着要总结
“通过这个项目,我觉得写程序就应该保持不断学习的心态,就应该XXX,不能XXX,还要自己多尝试,不能光看资料,否则XXX,所以有了这次经验教训以后我在后来的XXX项目中,一开始就XXX,终于,比别人更好的做到了XXX,解决了问题,获得了公司颁发的年度XX奖”

没什么干货,可以多说你碰到挫折,和成长的经历,不能关说挫折,主要要说怎么克服挫折获得成长。当然有些面试官不可能等你说完长篇大论,他们会随时打断你,你需要很精炼的在几次对话中把意思表达清楚。

最后表达下自己的想法:

“自己之前的基本上是一个人工作,一个人编码,很少能跟周围的同事一起交流,所以很低效,很孤独,就像穿着单衣走夜路一般,希望能和更多的聪明人在一起工作,一起交流讨论”

尊重他人,心诚则灵
—-

当然,上面都是瞎扯淡

Loading

Posted in 大浪淘沙 | Tagged | 1 Comment

钉钉真好用

自从用了钉钉,腰也不酸了,腿也不疼了:
* 设置组织架构和通讯录,新同事根据部门自动入企业群。
* 除了部门企业群外,跟微信一样随意建立临时会话,员工离职退出所有群。
* 每个企业群配套“云盘”,可以把部门相关文档传到群的云空间里,供群成员查看。
* 详细查看未读消息,长时间未读的人可以短信提醒。
* 企业内部员工免费电话。
* 全平台:windows,mac,iphone,android
* 配套企业应用:请假,公章申请,报销申请,打卡,工资信息查询

试过:泡泡,RTX,QQ企业,米聊,飞秋 以后最终发现还是钉钉最好用

Loading

Posted in 随笔 | Leave a comment

Vim异步编译工程

针对 Vim的最新版本,7.4.1769+ 写了个脚本:build.vim 来实现异步编译。

主要实现原理是利用 Python 开线程并在后台线程调用脚本(具体执行编译工作的bat/sh文件),实时把stdout/stderr输出的内容投递到队列,而前台UI线程则是使用了Vim最新版本中提供的 timer_start 功能启动一个100ms运行一次的时钟,每次运行时检测队列里面的东西并把他们取出来输出到Vim的 Quickfix窗口。

几处细节处理是避免后台任务瞬间输出上千行的内容,批量塞入Quickfix的时候把vim 给卡死掉,此处增加了一个限制,即每次时钟发生时最大只塞入Quickfix中50条信息。

如此,整个世界清静了,以前Vim一编译代码就完全无法编辑的情况可以得到很好的解决了。你可以绑定到外部命令:job-1 job-4 这四个不同的脚本(windows下是 job-1.cmd – job-4.cmd),用来执行外部命令,每次执行前,把当前编辑的文件名等信息写入环境变量,这样后台job-n.cmd的批处理就可以根据环境变量决定需要编译的文件或者工程信息了:

let $VIM_FILEPATH = expand("%:p")
let $VIM_FILENAME = expand("%:t")
let $VIM_FILEDIR = expand("%:p:h")
let $VIM_FILENOEXT = expand("%:t:r")
let $VIM_FILEEXT = "." . expand("%:e")
let $VIM_CWD = expand("%:p:h:h")
let $VIM_RELDIR = expand("%:h")
let $VIM_RELNAME = expand("%:p:.")
let $VIM_CWORD = expand("<cword>")
let $VIM_VERSION = ''.v:version
let $VIM_MODE = ''. a:mode
let $VIM_GUI = '0'
let $VIM_SCRIPT = g:vimmake_path
let $VIM_SVRNAME = v:servername
if has("gui_running")
    let $VIM_GUI = '1'
endif

上面这些环境变量初始化工作可以在每次调用后台脚本之前设置,这几个应该已经足够大家使用了。

每次编译完还可以调用一下外部程序,播放一个音效(比如windows的感叹号音效),让你知道编译工作成功完成,方便你打开 Quickfix查看编译效果。

Loading

Posted in 随笔 | Tagged | Leave a comment

GVim 中更好的运行程序

GVim(Windows)下面使用!运行程序是非常恶心的事情,比如调用python运行当前脚本:

:!python %

你会发现,整个VIM界面被冻结了,然后弹出cmd窗口,退出cmd后,还要返回GVim中按任意键才能编辑状态。

比如你正在调试一个程序,这个程序运行起来不是一分钟能出结果的时候,你想边对照输出结果,边在 GVim 里面查看和修改你的代码,你就会发现傻逼了。正确的做法是:

:!start python %

这样就不会卡住 Vim了,但是这个做法有个问题,程序结束的时候窗口马上关闭,因此还需要再进化一下:

:silent !start cmd /c python % & pause

这时你会发现优雅的调用了 python 来跑当前程序,并且GVIM不会被挂起,照样可以编辑,当程序结束的时候,CMD窗口还会pause等待你按任意键一下,这就比较清爽了,你可以把这条命令map到你常用的快捷键上,和 EditPlus里面一样一键运行之。

然而还是有几处需要完善的地方,首先直接使用 % 展开当前文件名不妥当,如果文件名包含空格就会错误,需要用 shellescape 来进行处理,同时我们有时候还希望运行前跳转到文件所在的目录,运行完又跳转回来,又或者需要运行前保存一下没有保存的文件。

我写了个函数来做这个事情,放到你 .vimrc里即可使用,同时支持 GVim和终端 Vim:

Continue reading

Loading

Posted in 随笔 | Tagged | 1 Comment

更好的使用 Vim 标签(Tab)来切换文件

更好的使用 Vim7.0 以后推出的标签(TAB)功能,同现代编辑器一样用标签(TAB)来管理多文件,代替传统 Buffer List:

让 Minibufexplor/tabbar 这些上个世纪的插件都退场吧,直接使用标准的标签功能会更加舒服。

快捷键切换 TAB

第一件事情就是要搞定标签快速切换问题,不管是 :tabn X 还是 Xgt 都十分低效,我们需要更快速的在各个文件之间切换。最简单的是设置 0-9 来快速切换 tab(默认 leader 是反斜杠,即先按下 \ 键,再按数字键),不管终端还是 GVIM 都兼容:

noremap <silent><tab>m :tabnew<cr>
noremap <silent><tab>e :tabclose<cr>
noremap <silent><tab>n :tabn<cr>
noremap <silent><tab>p :tabp<cr>
noremap <silent><leader>t :tabnew<cr>
noremap <silent><leader>g :tabclose<cr>
noremap <silent><leader>1 :tabn 1<cr>
noremap <silent><leader>2 :tabn 2<cr>
noremap <silent><leader>3 :tabn 3<cr>
noremap <silent><leader>4 :tabn 4<cr>
noremap <silent><leader>5 :tabn 5<cr>
noremap <silent><leader>6 :tabn 6<cr>
noremap <silent><leader>7 :tabn 7<cr>
noremap <silent><leader>8 :tabn 8<cr>
noremap <silent><leader>9 :tabn 9<cr>
noremap <silent><leader>0 :tabn 10<cr>
noremap <silent><s-tab> :tabnext<CR>
inoremap <silent><s-tab> <ESC>:tabnext<CR>

其次,GVIM/MacVim 下设置 ALT-0-9 来切换TAB:

" keymap to switch table in gui
if has('gui_running') 
    set winaltkeys=no
    set macmeta
    noremap <silent><c-tab> :tabprev<CR>
    inoremap <silent><c-tab> <ESC>:tabprev<CR>
    noremap <silent><m-1> :tabn 1<cr>
    noremap <silent><m-2> :tabn 2<cr>
    noremap <silent><m-3> :tabn 3<cr>
    noremap <silent><m-4> :tabn 4<cr>
    noremap <silent><m-5> :tabn 5<cr>
    noremap <silent><m-6> :tabn 6<cr>
    noremap <silent><m-7> :tabn 7<cr>
    noremap <silent><m-8> :tabn 8<cr>
    noremap <silent><m-9> :tabn 9<cr>
    noremap <silent><m-0> :tabn 10<cr>
    inoremap <silent><m-1> <ESC>:tabn 1<cr>
    inoremap <silent><m-2> <ESC>:tabn 2<cr>
    inoremap <silent><m-3> <ESC>:tabn 3<cr>
    inoremap <silent><m-4> <ESC>:tabn 4<cr>
    inoremap <silent><m-5> <ESC>:tabn 5<cr>
    inoremap <silent><m-6> <ESC>:tabn 6<cr>
    inoremap <silent><m-7> <ESC>:tabn 7<cr>
    inoremap <silent><m-8> <ESC>:tabn 8<cr>
    inoremap <silent><m-9> <ESC>:tabn 9<cr>
    inoremap <silent><m-0> <ESC>:tabn 10<cr>
endif

或者在 MacVim 下还可以用 CMD_0-9 快速切换,按着更舒服:

if has("gui_macvim")
    set macmeta
    noremap <silent><c-tab> :tabprev<CR>
    inoremap <silent><c-tab> <ESC>:tabprev<CR>
    noremap <silent><d-1> :tabn 1<cr>
    noremap <silent><d-2> :tabn 2<cr>
    noremap <silent><d-3> :tabn 3<cr>
    noremap <silent><d-4> :tabn 4<cr>
    noremap <silent><d-5> :tabn 5<cr>
    noremap <silent><d-6> :tabn 6<cr>
    noremap <silent><d-7> :tabn 7<cr>
    noremap <silent><d-8> :tabn 8<cr>
    noremap <silent><d-9> :tabn 9<cr>
    noremap <silent><d-0> :tabn 10<cr>
    inoremap <silent><d-1> <ESC>:tabn 1<cr>
    inoremap <silent><d-2> <ESC>:tabn 2<cr>
    inoremap <silent><d-3> <ESC>:tabn 3<cr>
    inoremap <silent><d-4> <ESC>:tabn 4<cr>
    inoremap <silent><d-5> <ESC>:tabn 5<cr>
    inoremap <silent><d-6> <ESC>:tabn 6<cr>
    inoremap <silent><d-7> <ESC>:tabn 7<cr>
    inoremap <silent><d-8> <ESC>:tabn 8<cr>
    inoremap <silent><d-9> <ESC>:tabn 9<cr>
    inoremap <silent><d-0> <ESC>:tabn 10<cr>
    noremap <silent><d-o> :browse tabnew<cr>
    inoremap <silent><d-o> <ESC>:browse tabnew<cr>
endif

这下很舒服了,和大部分主流编辑器一样切换tab十分轻松。那终端下 alt没法很好的映射怎么办呢?

终端下映射 ALT-0-9 快速切换标签

不推荐把中断里的 ALT 键设置成 ESC+,大部分终端(XShell, SecureCRT, iTerm, gnome-terminal)都提供 ALT 键改为 ESC+ 的模式,即按下 ALT-A,终端会连续发送 ESC(27)A(65) 两个字节,正确设置见:

终端里正确设置 ALT 键和 BS 键

不需要 ALT 键的话可以继续往下。

设置标签文本

默认的标签文本包含文件路径,十分凌乱,需要进一步修改,让它只显示文件名:

" make tabline in terminal mode
function! Vim_NeatTabLine()
    let s = ''
    for i in range(tabpagenr('$'))
        " select the highlighting
        if i + 1 == tabpagenr()
            let s .= '%#TabLineSel#'
        else
            let s .= '%#TabLine#'
        endif
        " set the tab page number (for mouse clicks)
        let s .= '%' . (i + 1) . 'T'
        " the label is made by MyTabLabel()
        let s .= ' %{Vim_NeatTabLabel(' . (i + 1) . ')} '
    endfor
    " after the last tab fill with TabLineFill and reset tab page nr
    let s .= '%#TabLineFill#%T'
    " right-align the label to close the current tab page
    if tabpagenr('$') > 1
        let s .= '%=%#TabLine#%999XX'
    endif
    return s
endfunc

" get a single tab name 
function! Vim_NeatBuffer(bufnr, fullname)
    let l:name = bufname(a:bufnr)
    if getbufvar(a:bufnr, '&modifiable')
        if l:name == ''
            return '[No Name]'
        else
            if a:fullname 
                return fnamemodify(l:name, ':p')
            else
                return fnamemodify(l:name, ':t')
            endif
        endif
    else
        let l:buftype = getbufvar(a:bufnr, '&buftype')
        if l:buftype == 'quickfix'
            return '[Quickfix]'
        elseif l:name != ''
            if a:fullname 
                return '-'.fnamemodify(l:name, ':p')
            else
                return '-'.fnamemodify(l:name, ':t')
            endif
        else
        endif
        return '[No Name]'
    endif
endfunc

" get a single tab label
function! Vim_NeatTabLabel(n)
    let l:buflist = tabpagebuflist(a:n)
    let l:winnr = tabpagewinnr(a:n)
    let l:bufnr = l:buflist[l:winnr - 1]
    return Vim_NeatBuffer(l:bufnr, 0)
endfunc

" get a single tab label in gui
function! Vim_NeatGuiTabLabel()
    let l:num = v:lnum
    let l:buflist = tabpagebuflist(l:num)
    let l:winnr = tabpagewinnr(l:num)
    let l:bufnr = l:buflist[l:winnr - 1]
    return Vim_NeatBuffer(l:bufnr, 0)
endfunc

" setup new tabline, just like %M%t in macvim
set tabline=%!Vim_NeatTabLine()
set guitablabel=%{Vim_NeatGuiTabLabel()}

在 GUI 模式下,还可以配置标签的 TIPS,鼠标移动到标签上,会自动显示该 TIPS:

" get a label tips
function! Vim_NeatGuiTabTip()
    let tip = ''
    let bufnrlist = tabpagebuflist(v:lnum)
    for bufnr in bufnrlist
        " separate buffer entries
        if tip != ''
            let tip .= " \n"
        endif
        " Add name of buffer
        let name = Vim_NeatBuffer(bufnr, 1)
        let tip .= name
        " add modified/modifiable flags
        if getbufvar(bufnr, "&modified")
            let tip .= ' [+]'
        endif
        if getbufvar(bufnr, "&modifiable")==0
            let tip .= ' [-]'
        endif
    endfor
    return tip
endfunc
set guitabtooltip=%{Vim_NeatGuiTabTip()}

快速在标签中打开文件

除了 :tabedit 外,Vim 自带 netrw 插件可以浏览目录,是代替 nerdtree 的好东西,使用 :Explore 打开 netrw 的文件浏览器后,选中文件按t键即可以再新标签打开对应文件了。

快捷键在标签打开新文件

我们配置按下 ALT-O 的时候在当前位置打开文件浏览器:

" Open Explore in new tab with current directory
function! Open_Explore(where)
    let l:path = expand("%:p:h")
    if l:path == ''
        let l:path = getcwd()
    endif
    if a:where == 0
        exec 'Explore '.fnameescape(l:path)
    elseif a:where == 1
        exec 'vnew'
        exec 'Explore '.fnameescape(l:path)
    else
        exec 'tabnew'
        exec 'Explore '.fnameescape(l:path)
    endif
endfunc

这样可以把 call Open_Explore(2) 映射成 ALT-O,这样如果在编辑一个文件时候按下 ALT-O,那么会在该文件的路径下展开一个新的 tab 并显示 netrw 的文件列表。

如果使用 GVIM/MacVim 可以更优雅点,直接在当前文件的路径下,使用系统的文件查找窗口,选中文件后在新的 Tab 里打开:

function! s:Filter_Push(desc, wildcard)
    let g:browsefilter .= a:desc . " (" . a:wildcard . ")\t" . a:wildcard . "\n"
endfunc

let g:browsefilter = ''
call s:Filter_Push("All Files", "*")
call s:Filter_Push("C/C++/Object-C", "*.c;*.cpp;*.cc;*.h;*.hh;*.hpp;*.m;*.mm")
call s:Filter_Push("Python", "*.py;*.pyw")
call s:Filter_Push("Text", "*.txt")
call s:Filter_Push("Vim Script", "*.vim")

function! Open_Browse(where)
    let l:path = expand("%:p:h")
    if l:path == '' | let l:path = getcwd() | endif
    if exists('g:browsefilter') && exists('b:browsefilter')
        if g:browsefilter != ''
            let b:browsefilter = g:browsefilter
        endif
    endif
    if a:where == 0
        exec 'browse e '.fnameescape(l:path)
    elseif a:where == 1
        exec 'browse vnew '.fnameescape(l:path)
    else
        exec 'browse tabnew '.fnameescape(l:path)
    endif
endfunc

然后把 call Open_Browse(2) 映射成 ALT-O。

寻找Tag时在新标签打开

以前寻找tag时使用 <C-]> ,现在改为 <c-w><c-]> 即可在新标签打开 tag 定义。

Quickfix 中在新标签打开文件

编译或者 grep 的时候,信息输出到 Quickfix 窗口中,按回车就容易把 buf 给切换走,使用标签后设置下面一项,即可更改 quickfix 行为为:如果有已打开文件,先复用,没有的话使用标签:

set switchbuf=useopen,usetab,newtab

如此Tab已经很好用了,再配置一些快捷键按 ALT-方向键 来 tabmove,ALT-w 来关闭标签,基本上和其他现代编辑器行为很类似了。

Loading

Posted in 随笔 | Tagged | Leave a comment

BasicBitmap:比 SDL/DirectDraw/GDI 更快的位图库

开源一个高性能位图库,之前对我的二维图形库 pixellib 的部分代码进行了精简和重写,最终形成一个只包含两个文件(BasicBitmap.h, BasicBitmap.cpp)的图形基础库。

在今天 GPU 绘制横行天下的时候,任然有很多时候需要使用到纯 CPU实现的图形库,比如图像处理,视频预处理与合成,界面,以及GPU无法使用的情况(比如某个应用把gpu占满了,或者无法通过gpu做一些十分灵活的事情时),纹理处理,简单图片加载保存等。

支持 SSE2/AVX 优化,比 DirectDraw 快 40%(全系统内存绘制),比 SDL 快 10%,比GDI快 38%。如果你需要一个方便的高性能位图库,足够高性能的同时保证足够紧凑。

如果你有上述需求,那么你和我一样需要用到 BasicBitmap,只需要把 BasicBitmap.h/.cpp 两个文件拷贝到你的代码中即可。我正是为了这个目的编写了这两个文件。

项目地址

特性介绍

  • 高度优化的 C++ 代码,可以在任意平台编译并运行
  • 多重像素格式,从8位到32位:A8R8G8B8, R8G8B8, A4R4G4B4, R5G6B5, A8, 等.
  • Blit (Bit Blt) ,包含透明和非透明的模式。
  • 像素格式快速转换
  • 使用不同的 Compositor 进行 Blending
  • 使用不同的过滤器进行缩放(nearest, linear, bilinear)
  • 高质量位图重采样(Bicubic/Box)
  • 支持从内存或者文件直接读取 BMP/TGA 文件
  • 支持从内存或者文件直接读取 PNG/JPEG 文件(Windows下)
  • 保存图片为 BMP/PPM 文件
  • 核心绘制函数可以被外部实现通过设置函数指针重载(比如 SSE2实现)
  • 比 DirectDraw 快 40% 的性能进行绘制(打开 AVX/SSE2支持)
  • 比 GDI 的 AlphaBlend 函数快34%的性能进行混色
  • Self-contained, 不依赖任何其他第三方库
  • 高度紧凑,只需要拷贝 BasicBitmap.h/.cpp 两个文件到你项目即可

Blit 性能比较

Full window (800×600) blitting (both opacity and transparent), compare to GDI/SDL/DirectDraw:

32 Bits Blit Opacity Transparent
BasicBitmap C++ fps=2325 fps=1368
BasicBitmap AVX/SSE2 fps=2904 fps=2531
GDI fps=2333 fps=1167
SDL fps=2671 fps=1015
DirectDraw fps=2695 fps=2090

Note: use BltFast with DirectDrawSurface7 in System Memory to perform Opacity & Transparent blit. BitBlt and TransparentBlt(msimg32.dll) are used in the GDI testing case.

16 Bits Blit Opacity Transparent
BasicBitmap C++ fps=4494 fps=1253
BasicBitmap AVX/SSE2 fps=9852 fps=2909
DirectDraw BltFast fps=5889 fps=861

Blitting performance in SDL & GDI are slower than DirectDraw, just compare to ddraw as well.

8 Bits Blit Opacity Transparent
BasicBitmap C++ fps=11142 fps=1503
BasicBitmap AVX/SSE2 fps=18181 fps=5449
DirectDraw BltFast fps=14705 fps=4832

DirectDrawSurface in Video Memory takes the benefit of hardware acceleration which is definitely faster than BasicBitmap. If you really need hardware acceleration, use OpenGL/DX as well.

BasicBitmap is a software implementation which aims to achieve the best performance in all other software implementations: like GDI/GDI+, SDL/DirectDraw in System Memory, for examples.

So just compare to DirectDrawSurface in System Memory. Use it in the condition that you only need a lightweight software solution: GUI/Cross Platform/hardware unavailable/image processing/video compositing, etc.

混色性能比较

SRC OVER FPS
BasicBitmap C++ 594
BasicBitmap SSE2 1731
GDI (msimg32.dll) 1137

note: 800×600 full window src-over blending vs GDI’s AlphaBlend function (in msimg32.dll).

Loading

Posted in 图形编程 | Tagged , , | 2 Comments

后端工程师招聘启示

创业一年多,走过不少弯路,公司最近终于开始有了点收入,说起来有点老泪纵横。虽然没有完全覆盖成本,但证明产品方向没有大问题,运营开展后,后端团队急需进一步扩大,方向是两个:

第一是游戏社交,陪玩竞技的APP,提供游戏用户专有的沟通工具。

第二是为云技术,为游戏或者其他应用开发商提供更好的即时通讯云技术,这点我在知乎里面阐述过:https://www.zhihu.com/question/32228281/answer/55844291

公司坐落在广州市科韵路,现在团队规模35人左右,后端主要技术是java/python/c,熟悉任意即可,有需要用别的语言学就是。

公司是有很强技术基因的公司,后端团队我会亲自带,创造和分享是我们一直以来秉持的理念。希望同更多有识之士共同进步和成长。

具体需求如下:

  1. 后端开发1-3年经验,基础扎实。
  2. 熟悉:Python / Java / C (任意一种语言)
  3. 互联网或者游戏开发背景不限。

如果有兴趣,请加我QQ:贰三五六柒五贰。

Loading

Posted in 随笔 | 1 Comment