分类
职业

再见,OpenResty Inc.

被前司(现在是前前司了)裁员之后,我受罗辑思维鼓动,想尝试知识付费,于是折腾了大半年。发现这样下去养不活自己和家庭之后,我又开始找工作,刚好看到春哥在微博上招人,因为事先对 OpenResty 有所耳闻,知道这是个很厉害的产品,春哥也是个很厉害的程序员,就去应聘。于是幸运的得到这个机会,加入了 OpenResty Inc.。

时光荏苒,一晃又是四年多,到了说再见的时间。

在 OpenResty 的工作整体来说是紧张而快乐的。春哥应该是很多程序员最向往的样子,至少对我来说是如此:

  1. 有成功的作品
  2. 有厉害的技术
  3. 有很高的业界声望
  4. 有良好的个人家庭生活

所以能为春哥工作对我来说是一件幸事,因为可以近距离观察这样一位成功的程序员,能从他身上学习,指导自己接下来的发展。我也的确从他那里学到很多东西。

不过相应的,在 OpenResty 工作也面临很大压力。一方面,OpenResty 是创业公司,我们要从零开始搭建很多产品,应对很多挑战;另一方面,春哥又会对产品的实施细节进行多方位多角度的监督和审视。所以,虽然过去几年都是远程工作,我面临的工作压力却一点也不小,工作时间也一点都不短。

这样紧张而快乐的生活在本月末画上了句号。接下来,我会为金山文档效力。希望接下来的新旅程能为我带来新的成长,希望我可以给新东家带来超出他们预期的价值吧。

聊聊远程

接下来聊聊远程。很多同学听说我放弃远程工作,转投一家集中办公的公司,表示不理解,所以今天借此机会聊两句。

远程工作爽么?爽,但也就那么回事。正像我在前面一篇博客中说的:没有工作会让你很爽。如果你工作的很爽,要么你有问题,要么工作有问题。

有人为财务自由划定了若干标准,比如菜场自由、超市自由、便利店自由、电子产品自由、车自由、房子自由等。这个做法其实很科学,因为很多事情本就不是非黑即白的,是否两头中间存在大量中间地带。

我也仿效 ta 来制定一些新的“自由”标准吧。远程工作可以带来很多平价自由,比如:

  • “穿衣自由”:我在过去四年里,85% 的时间只穿一条内裤
  • “食物自由”:韭菜盒子、臭豆腐、大蒜想吃就吃
  • “厕所自由”:几千块的卫立洗只有我一个人用
  • “空调自由”、“电影自由”、“青轴自由”、“听歌自由”等等等等

这些自由你说没价值吧,肯定不对;但是如果有人觉得应该抛弃其它要素来追求这些自由,那就完全跑偏了。因为很明显,还有很多更有价值、价格也更高的自由,比如“孩子上学自由”、“买电脑自由”、“买房自由”等。

所以,当一份工作,能够提供其它更有价值的加分项,只是缺少远程工作能带来的平价自由的话,我们当然应该好好考虑这个机会。尤其对于我这种年纪越来越大,机会越少越少,机会成本越来越高的中年男子来说,更是如此。

“远程工作工资会低么?”

多半会低。我们的工资是老板决定的,也是市场决定的,里面包含着地理位置溢价。比如,在北京,一个月至少要大几千块才能保证生活质量,那么一个靠谱的程序员就不可能接受万把块的工资;而比如我,假如在郑州老家的话,有房有车有老妈,一个月节省 1w 块的开销,收入一万就能抵两万。

所以同样技术水平、工作态度的两个人,一个在北京一个在郑州,两个人对工资的要求完全不同。集中办公时,他们俩不产生交集,无所谓;远程办公时,他们俩直接竞争,老板很可能更倾向于后者。

所以,远程工作的工资会明显低于一线,持平或略低于二线。除非候选人有他人没有的竞争优势。

“我没有在大城市工作过,想在老家找个远程工作,可以么?”

我不敢把话说死,说一定不行;但我必须说,这非常难。

对于程序员来说,自己的努力固然重要,公司带来的产品压力与用户压力同样重要。比如我的博客,一天几百访问,随便弄个月租$10 的小 VPS 就能跑起来。WordPress + 本地 MySQL,简单配置下缓存就好。如果你只搞过这个级别的服务,突然要你分库、读写分离、上缓存,你就没法搞。

前端也一样。我因为只考虑放客是开发者,所以只关心最新 PC/macOS Chrome 能不能看。但是真正的生产环境,哪家公司不得兼容最近三年所有系统和浏览器版本?到时候一堆兼容性和性能问题就折腾死人了。

没有大城市大公司的工作经验,往往就欠缺解决这些问题的技能和经验。于是跟那些大城市退回老家的人比起来,也就缺乏竞争力了。现在真正意义上的远程岗位并没有很多,大多数其实是接单和基础外包,所以我要说,很难。

总结

时光如流水,突如其来一个拐弯,我也步入下一个阶段。简单与前面告个别,希望下一个五年,能不负时光,继往开来。

分类
招聘

OpenResty 再次开启招聘!

以下内容来源于老板春哥,关键词:一流的技术实力研发全新的技术远程工作模式

OpenResty Inc. 公司诚邀有追求的工程师加入我们的研发团队。

我们的技术栈是 Nginx, OpenResty, Lua, C/C++, Perl, Python 等等。从高性能网关系统和 CDN 系统,小语言编译器的开发,再到内核开发和动态追踪,以及数据库分析和调优,还有视频生成和处理,可按能力和兴趣选择。我们有世界一流的技术实力,研发全新的技术,解决工业级别的挑战,服务全球众多企业级客户。

工作地点不限,国家不限。我们不纠结于学历和专业,只看能力和经验。远程工作模式,自由度高。我们在深圳也有办公室。

有兴趣的朋友欢迎发送简历至 talents@openresty.com

详情请戳:网页链接


另外老板说,前端也可以聊,欢迎投简历。

分类
服务器端

nginx 笔记

基础配置

# daemon on;
# worker_processes 1;
error_log logs/travis.error.log error;
pid logs/travis.nginx.pid;

events {
    accept_mutex off;
}

http {

    server {
        listen 9000;

        include mime.types;

        location / {
            rewrite ^ /static/edge/index.html last;
        }

        location /admin-api/ {
            proxy_pass https://admin-dev.openresty.com.cn;
            proxy_set_header Host admin-dev.openresty.com.cn;
            proxy_ssl_name "admin-dev.openresty.com.cn";
            proxy_ssl_server_name on;
        }

        location /static/ {
            alias fe/dist/static/;
        }
    }
}

启动 nginx

nginx -p $PWD -c conf/travis.conf

其中,-p $PWD 指定当前目录为工作目录。-c 指定配置文件。

reload

找到配置中的 pid 文件,从里面找到 pid

kill -s HUP ${pid}
分类
OpenResty

我的第一段 OpenResty 代码

前端同学需要一个上传文件的后端做一些调试,我刚好有,就给她用了。然后遇到跨域问题,一般来说我会在 PHP 里解决,不过这次我想挑战一下 nginx,于是找到这个答案。照做之后,OPTIONS 请求按照预期返回了正确的头,但是 POST 不行。

于是我在群里请教同事,结果被老板批评:

  1. 在 nginx 里,“IF is evil”,因为要在一些特定条件下,它的行为会跟预期完全相反;有时候甚至会引起 segfault
  2. 我厂是 OpenResty,没理由不用 OpenResty

行吧,本来就是为了跨出舒适区,不妨走远一点,OpenResty 就 OpenResty。

0. 用 OpenResty 替换 Nginx

我的系统是 Ubuntu 18.04,所以先按照 官方文档 安装最新版本的 OpenResty。

安装完成之后,可以通过 service --status-all 查看服务列表,不出意外的话,能看到 openresty 服务。

停掉 nginx,然后启动 openresty:

service nginx stop
service openresty start

此时 openresty 的配置位于 /usr/local/openresty/nginx/conf/nginx.conf,默认的 web 服务地址是 /usr/local/openresty/nginx/html/,所以我们需要修改一下,以便继续使用 /var/www/html,也就是之前 nginx 的网页文件。

1. 继续使用 nginx 的配置

修改配置的方式很简单,OpenResty 本来也兼容 nginx 的配置。对于我而言,最简单的做法是干掉 server 的部分,然后加载 nginx 的网站配置,也就是这两句:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

此处会有个小问题:PHP 网站的配置里需要加载 snippets/astcgi-php.conf,默认使用的是相对路径,需要改成绝对路径 /etc/nginx/snippets/fastcgi-php.conf

至于其它配置,比如 gzipssl 等,酌情拷过来即可。

2. 增加配置以自动输出请求头

最后就是写 lua,这部分难度不大,基本就是普通的 lua 和 nginx lua API。写好的配置是这样的:

location / {
  access_by_lua_block {
    if ngx.req.get_method() == 'POST' then
      ngx.header['Access-Control-Allow-Origin'] = '*';
      ngx.header['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS';
      ngx.header['Access-Control-Allow-Headers'] = 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      ngx.header['Access-Control-Allow-Expose-Headers'] = 'Content-Length,Content-Range';
 
    elseif ngx.req.get_method() == 'OPTIONS' then
      ngx.header['Access-Control-Allow-Origin'] = '*';
      ngx.header['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS';
      ngx.header['Access-Control-Allow-Headers'] = 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      ngx.header['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS';
      ngx.header['Access-Control-Allow-Headers'] = 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      ngx.header['Access-Control-Max-Age'] = 1728000;
      ngx.header['Content-Type'] = 'text/plain; charset=utf-8';
      return 204;
    end
  }
  # First attempt to serve request as file, then
  # as directory, then fall back to displaying a 404.
  try_files $uri $uri/ /index.php$args;
}

首先,使用 access_by_lua_block 添加 lua 代码块。这里注意,一定要用 access_by_lua_block,不能用 content_by_lua_block,因为我们后面还要用 proxy_pass 把请求反向代理给 php-fpm 处理,而 content_by_lua_block 就直接返回了。

然后,因为要添加 headers,所以要在能输出其它内容前先输出头。所以这个代码块要放在最前面,前面不能有其它输出。

3. 总结

需求不大,代码也比较简单,不过还是花了大约一天的时间调试。将来可能会写更多的 OpenResty lua,到时候再慢慢分享咯。

另外我也搞不清楚为啥 nginx 这么流行的一个软件竟然有 if 这种问题。有知道的同学请指教。

分类
服务器端

树莓派4 安装 OpenResty + PostgreSQL

为了给 OpenResty.org 添加论坛链接,在本地搭建开发环境,选择用树莓派搞。记录一下,以备将来回顾。

分类
招聘

OpenResty Inc 招聘前端工程师

我们 OpenResty Inc 的中国大陆子公司诚邀前端工程师加入。希望能和对前端技术有激情,有想法,有追求的年轻人一起构建优美而强大的各种 Web 应用。不要求非得是大牛,但需要有强烈的求知欲和强大的学习能力。可以致力于 Vue、d3.js/SVG、three.js/WebGL、WebExtensions、CodeMirror 等各种技术栈的创造性的前端工作。拥有一定的美感和品味。不拘一格,喜欢挑战。曾做过酷炫的前端应用可以展示给我们。我们不纠结学历、学校和公司工作经历。远程工作模式,工作地点随意。我们会签订正式的劳动合同,会提供五险一金。会提供丰厚的美国公司的期权。对于还在学校的同学,也提供兼职职位和毕业后的转正途径(如果能胜任工作的话)。欢迎有兴趣的朋友投简历到 talents@openresty.com 邮箱,记得附上自己最酷的作品哦。

发给我也可以 meathill@openresty.com。

分类
招聘

OpenResty Inc. 招聘销售工程师

我们 OpenResty Inc 公司( https://openresty.com/cn/ )的中国子公司诚邀优秀的销售工程师加入。OpenResty Inc.公司总部在美国,致力于通过机器编程、机器测试、机器调试和机器演示等技术更好地服务于各行各业的企业客户。这是一个全职职位,我们可以在当地提供五险一金。初创团队成员会获得优厚的股票期权。薪资面议。工作地点不限,可在家办公,也可以到我们的珠海办公室。需要有很强的学习能力、思考能力、沟通能力和工作热情,有一定的互联网和企业软件相关的技术背景;能帮助我们规划和拓展 OpenResty Edge、OpenResty Trace 等多条产品线在中国乃至亚州的市场,并维护在该地区的企业客户。有 to B 销售经验者优先,有三年以上销售经验者优先,有组建销售团队经验者优先。有兴趣的朋友,请将简历发至 talents@openresty.com

分类
公司

Welcome to Navlang

过去两天,我厂在杭州召开了 OpenResty Con 2018,很多 OpenResty 的社区的小伙伴分享了很多使用 OpenResty 的心得。春哥也分享了 OpenResty(包括商业公司 OpenResty Inc)接下来的计划和未来的方向。说实话我已经很长时间不参会也不关心会了,因为很多会营养太少,商业太过。不过我不得不说,我厂的会干货真的多。

回到主题,我也趁机搞了一个闪电演讲,介绍我厂的小语言之一——Navlang。遗憾的是,准备的不算充分,时间也比较短,所以介绍的不够清楚,导致好几个同学来问细节。

既然已经公开我以后也会分享一些实现细节和心得。感兴趣的同学可以先看 Slide:

开发这个语言的时候,我不太适应 Perl,也不太适应在春哥的要求下写代码,所以表现并不理想。如果有机会我还是希望能继续贡献 feature。

另外,受到 Navlang 的启发,我觉得可以搞一个 TechLang,用编程的方式录制视频教程。将来有机会搞一下。 

分类
公司

新司两月记

现在时间过得飞快,一眨眼在贵司已经工作两个月了。这俩月也挺忙的,适应不同的框架,适应不同的开发习惯,适应不同的工作节奏,等等。今天觉得应该总结一下,以便来日回顾,就写个流水帐吧。

1. 远程工作

贵司全员远程,老板和几位同事在美国,国内的几位同事也分布在各处。两个月干下来,有一些感想。

远程的好处:

  1. 不用考虑通勤。据说现在广州地铁也开始全员安检,队伍也排起来了。
  2. 不要求准点上下班。可以自行安排,工作日看场电影也无妨。
  3. 企业用人成本比较低。

远程的坏处:

  1. 大家工作时间不统一,时常找不到人。
  2. 物理距离太远,沟通不够顺畅
  3. 工资低于京沪深一线标准。

2. 公司和老板

春哥是位牛人,以前技术领域不太重合,所以不知道,合作之后发现真是牛。

跟牛人合作压力就很大,尤其是春哥和 Wei 是完全不同风格的两种老板。Wei 嘴边天天挂着“快糙猛”,一句话“你不用弄那么细说不定明天公司就没了”,强调大干快上,用智商差干掉竞争对手。春哥也是用智商差作战,不过他的风格是靠高端的产品设计,动不动小语言、机器编程,面试的时候就问编译原理,希望能用 JS 实现后端小语言的编译器……

而且他的产品设计也是高端,动不动就升华到“语言”层面,想的都是超出现有工具链的方案。当然,(严肃脸)我觉得现有的技术方案大多有历史原因和现实原因,不是那么好超越的。——不过,我也非常希望能跟春哥一起超越一把。

压力大压力大。

3. 工作状态

还有一部分压力来源于远程工作。和坐班不一样,远程更依赖于人与人之间的信任,为维持这份信任,不得不付出更多努力。

坐班的时候,只要人在工位上,干的好一点坏一点,项目进度快一点慢一点,并不会有特别明显的差异——因为整个公司都是这样。那么多人帮忙垫底,还有背锅的各种开会,偶尔划划水摸摸鱼,并不是非常困难。下了班,更是全部时间自由安排,想打游戏打游戏,想看电影看电影,理直气壮,坦坦荡荡。

远程不是如此。老板当然都嫌进度慢效率低,但是更令他不安的,则是大家每天到底在干嘛。万一有人拿钱不干事儿,简直亏到姥姥家。所以老板就会把进度把任务挂在嘴边,死命的催赶每个人。别人怎样我暂时不知道,对于我来说,压力就很大。我希望证明自己,不要让牛皮落空,所以就必须全天全周准备投入工作,几乎不得放松。

我感觉现在的压力比坐班时候大多了。

4. 对未来的希望

贵司几乎符合我对新工作的一切预期(除了工资……),我希望能跟公司有更好的发展。许几个愿望吧:

  1. 提供设备金,升级下鸟枪
  2. 租工位,一年也能省不少
  3. 年会
  4. 涨工资……
分类
职业

再次出发

去年前司裁员,我等外地工人终于也没逃脱,在年前和平分手。

在创业公司连续工作五年,虽然遇到很棒的老板,但还是有点累。加上被罗辑思维蛊惑,再加上看到一些同行做培训做得很好,所以我就打算先不去找工作,尝试做一下培训。再不济,也能给将来的生活带来一笔客观稳定的被动收入嘛。

如果你有看过我之前的文章应该已经知道结果了。总之,不好搞啊不好搞。

前几日突然看到 OpenResty Inc. 在招前端工程师,而且是远程。我对这个项目早有耳闻,对远程工作也很感兴趣,于是马上投简历过去。经过数轮面试,顺利得到这个职位。

于是从本月中开始,我成为 OpenResty Inc 的一员!


我对这份工作很满意,原因有四:

  1. 远程
  2. 技术型老板,技术型公司
  3. 开源项目,商用收费,在国内应该还很少见,国外比较多,比如 WordPress,感觉很有趣的样子
  4. 具体到细分领域,OpenResty 在行业内名气似乎很响亮,甚至可能是最响亮的一个

祝自己大展鸿图。