人生如逆旅,我亦是行人——八年职业经历小记

前些时间,不同的朋友问起我这几年的工作经历、职业选择,我说我会写下来,结果完全不知道怎么写……

So,我随便写写,你随便看看。
有什么我没写清楚而你想知道的,请港!我一定会回复的(认真脸)。

----

工作前两年
life is like a play.

起止时间:2008.3 - 2010.9
月薪水平:税前2.5K-3K,那时候南京应届生的薪资水平低得惨绝人寰

To be honest,我并不是一开始就清晰知道自己的每一个选择是好是坏,尤其是工作上的选择。

第一份工作,是在校园宣讲会上投递简历,经历笔试及几轮面试最终get。当时并不知道那是怎样一家公司,也没有能力去评估一份工作的好坏,只是不想离开南京,看到招聘要求里明确写了「 985+211院校,英语六级450分以上 」这样的硬性条件,觉着门槛尚可,而自己够得着,就去了。

几年后回顾,这家公司是我工作经历当中,规模最大、管理成熟度最好的一家,就个人职业发展来说,算不上最优选择,但算得上是还不错的选择。

番外故事也顺便一提。

大四找工作的时候,大多数同学都不看行业,只看用人单位品牌知名度之类的,不管有没有拿到offer或者即便多份offer在手,有新的一波名企宣讲会时,都还是会去看看。

那时我还是个沉迷于梦幻西游的网瘾少女,自从决定要去前述的互联网公司之后,便赖在宿舍哪也不去,成天做任务打副本……如果那时候多听几场宣讲会,多投一些简历,以我当时的莽撞,天知道我会选择什么企业、做什么工作。

第一份工作做了一年半之后,我提了辞职,BOSS给了很大的面子挽留我:让我回去考虑一个月,如果选择留下来,当月工资照发,并且从运营部转到产品部。

最后我还是选择离开,但客观来说,其实留下来应该是更好的选择。

之后经历了一份比较短暂的工作。当时看到那个公司一年四季各个岗位都在招人,心里有过一丝犹疑,只是那时候我中二,觉得自己会跟别人不一样,吃得来苦,管得住脾气,自动无视了高得惊人的人员流动率。然而,人们在生活上的喜恶各有特色,在工作上不能忍受的东西却趋于一致。

因为一个人,在一家公司工作了近四年
Everything has its time and that time must be watched.

起止时间:2010.9 - 2014.5
月薪水平:从税前3K,历经普调、个调,保持每半年加薪一次的步伐,勉强到了税前8.5K

2010年9月底,经人内推,我进了一家为运营商做项目的公司,直到2014年才离开。只论公司性质的话,我不觉得它好,但是南京分公司的大Boss是一个我认为可以誓死相随的人,很想在他手底下做事,看看他是怎么思考,怎么运筹,怎么传道授业解惑。

据说他与大老板的老婆一起在摩托罗拉共事过,后来被大老板挖过来。我在的那几年里,他带哪个事业部,哪个事业部就一派欣欣向荣的气象,让我更为好奇他的为人、他的工作方式。只是我几乎没能在他手底下做过事:我以内容部编辑的身份入职,他对我说,你只做编辑有点可惜了,而后建议我一边做编辑,一边琢磨社区推广和SEO;半年后,从我单兵作战开始,逐渐有了运营团队,我也从编辑转为运营经理;然而在此之前,他已经去带另外一个事业部;三年后,我终于调岗到他带的事业部,又赶上公司组织结构调整,他负责内部孵化的创新项目去了。Sigh~

作为背靠大树财源滚滚的公司,规模大了之后,很容易养出来一些混日子的人。我算得上是热爱工作,摊上什么事儿都不嫌麻烦的,所以被定性为骨干员工,参与到一些很重要的工作当中去。当时没觉得什么,但后来意识到如果只是写文案、做活动,很难从基础运营工作中快速成长起来,而参与管理层会议、绩效考核评判依据的制定等等,对于全局意识、整体把握能力,都有一定的积极意义。

六年后,遇上一大堆真爱,只是聚散匆匆
We do our best, god will do the rest.

起止时间:2014.5 - 2015.5
月薪水平:从16K到18K,到20K

人在具体的经验和技能层面,日积月累总归会有一些长进,但在做职业选择时,并不见得一次更比一次好。

第四份工作,是在一家起步就融了一亿人民币的创业公司。老板有着极高到极端的用人要求,他总是强调一流的公司,一流的人才,一流的待遇。招聘工作,他亲自带队,腾讯的、阿里的、小米的…… 挖人挖得很带感。

我多少有一些精英主义倾向,一想公司同事都这么棒,干嘛不去啊,就乐颠颠去了。

这期间带的团队,有三枚歪果仁,分别来自印尼、埃及和亚美尼亚,他们中文好得让我没有机会提升英文水平;还有几只烨然若神人的中国人,多出身于南京表白大学。我很喜欢他们,在我这些年的工作经历当中,感情最深的一个团队,没有之一。

我们经常一起去南京大学吃饭,嗯,就是刚才说的南京表白大学。印尼妹子很喜欢吃饺子,埃及小伙砸信仰伊斯兰教,所以每次都是我带着他一起点菜,反复跟打菜的师傅说不能有猪肉、不能有猪油。

在产品内测阶段,需要找加拿大、阿根廷、俄罗斯、日本、阿联酋等等国家的本地志愿者。因为时差原因,有时候我们夜里两三点爬起来跟志愿者打视频电话say hi,还有时候是一大早。当时24小时待命,几个人除了不会同睡,其它时间几乎是互相绑定状态,要么坐在一起,要么线上联系。

后来,去北京出差做各国文化调查时,听闻北京语言大学的万圣节趴体外国人特别多,但是只有学生狗才能参加。为了混进去,我们厚着脸办了几张北航的学生证(北语的居然办不到!)。印尼妹子想得更为周到,她拿出涂的抹的,把我们一个个画成女鬼。女鬼进电梯的时候,电梯里有人吓得捂住了眼睛;女鬼过马路的时候,一票东北汉子强行拦截要求合影;女鬼坐在酒吧的时候,果然成功引起外国人的注意……

原本是一段非常辛苦的工作经历,但想起来的,是这些开心的、温馨的画面,还有一直都在联系的这几个人。

但事不如意常八九,因为一系列一言难尽的原因,公司各个部门都有人离开或被开,常年“吐故纳新”,后来运营部也四散。如今我们分布在北京、上海、广州、福州和南京,但时常还会在当时的那个工作群扯工作扯生活,最新的群名很不要脸地更为:烨然若神人。

行走八年,还在折腾的路上
Growth and change are the law of all life.

起止时间:2015.5 至今
月薪水平:从26K(按照年薪除以12计算,应为30K),到40K

2015年5月,我离开南京,携家带猫到了上海。当时只看了两个机会,有意思的是,两个老板都是学霸型,一个哈佛出身,做移动医疗APP;一个16岁保送复旦大学,做高端人才招聘。前者给的工作机会是运营合伙人,后者给的机会是市场公关工作。

觉得高端人才招聘这件事似乎挺有趣的,团队成员也都年轻而有活力,最后我选择了后者。不过由于自己背负的包袱太重,加之颈椎病已经严重到影响自己的睡眠和日常,几个月后,就又裸辞了工作。这期间有做得好的方面,也有做得不好的方面,想起来会觉得很有挫败感,深深叹息。

其后不断有工作找我,我都不知道自己这么抢手。有大型集团公司,有刚起步不久的创业团队,还有拉我一起合伙创业的,最后放弃胖友给的年薪50W+期权的offer,接受了一个可以远程办公的,过上了这些年来,最为自由的生活。不过,人生如逆旅,远未是终程。

----

好朋友说,你似乎很看重老板的教育背景,每次你换工作的时候都会跟我说老板是什么学校出来的。

啊,苍天,是这样吗?让我回想一下:

老板NO.1,东南大学;
老板NO.2,东南大学;
老板NO.3,东南大学;(领袖力Max的那位,16岁进东大少年班)
老板NO.4,南京大学;
老板NO.5,复旦大学。(天才少年,16岁保送复旦物理系)

现如今的老板,美籍华人,美国纽约州立大学石溪分校出身,回国创业前,曾担任苏格兰皇家银行副总裁助理、JP摩根大通投行高级经理。

的确,我很在意老板是怎样的人,同时也很在意整个团队是由怎样的一群人所构成,其次才会看是什么产品,以及个人待遇如何。

在个人职业规划方面,没有什么高明之处,只是一直都没有脱离互联网这个行业,并且一直顺着运营这条路走了下来,渐渐有了那么点集腋成裘的意思。

前些天偶然读到柴静在北大的一个演讲,她说,「我觉得人生像一条河流,它的面目不是自己选择出来的,比如说谁要问我从《新闻调查》、《面对面》到《看见》是怎么走出来的,这不是我的选择。我们只是一个水流,然后碰到高山、峡谷、平原,就按照水的本来面目流淌而成。水本身没有变化,水总要入江入海,这是它的规律、本质,就一路流下来了,回头看的时候,河湖海是这个样子的。」

而我自己这些年来,也有一个相似的感受:你是什么样的人,终究还是什么样的人。在不同阶段,可能有起有伏,有放有收;但最后,你是什么样的人,总归还是什么样的人。

Every man's work, whether it be literature of music of pictures or architecture of anything else, is always a portrait of himself.
每个人的工作,不管是文学、音乐、美术、建筑还是其他,都是自己的一幅画像。 —— Samuel Brtler 勃特勒.S.

注:文章最初发布于Alice个人公众号:三分白(i_sanfenbai) 发布时间:2016-03-24
2016-07-08-2102045438.png

ElasticSearch安装及初步研究

环境部署

ElasticSearch安装很简单,解压后直接运行脚本,就能得到一个可访问的测试环境了。
基础环境:

  • JDK 1.7/1.8(数据导入需要)
  • ElasticSearch 2.3.3
  • Marvel 2.3.3
  • Kibana 4.5.1
  • Sense 2.0.0-beta5

插件(Plugin)安装步骤:


初步研究

测试场景
1.数据结构:id + 多列属性;
2.通过多个属性的组合条件,查询对应的id数量。

数据准备
1.通过Python生成逗号分隔的原始文件,共计100万条;

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random

strLine = 'id,sex,age,marriage,income,house,car,cardlevel,index,readeri,sporteri' +'\n'

listSex = [1,2]
list3 = [1,2,3]
list5 = [1,2,3,4,5]

def str_format(*appendStr):
    tmp = ''
    length = len(appendStr)
    i = 0
    while i < length - 1 :
        tmp += appendStr[i] + ',' 
        i = i + 1
    return tmp + appendStr[length - 1 ]

for id in range(1000000):
    sex = str(random.choice(listSex))
    age = str(random.choice(listSex))
    marriage = str(random.choice(list3))
    income = str(random.choice(listSex))
    house = str(random.choice(listSex))
    car = str(random.choice(listSex))
    cardlevel = str(random.choice(list3))
    index = str(random.choice(list3))
    readeri = str(random.choice(list5))
    sporteri = str(random.choice(list5))

    strLine += str_format(str(id),sex,age,marriage,income,house,car,cardlevel,index,readeri,sporteri)
    strLine += '\n'
# print(strLine)
with open('/Users/Edward/Dev/python/test.txt', 'w') as f:
    f.write(strLine)

2.数据导入至MySQL;
3.数据导入至ElasticSearch。

PS:照理来说,应该可以跳过第2步,直接导入到ElasticSearch中,只是懒得研究,力图早点出结果,后面再慢慢学习。

测试结果

kylin   hive    MySQL   ElasticSearch   语句
0.17    18.361  0.402   0.011           select count(*) from id_tag where sex = 2 and index = 2;
0.23    18.354  0.433   0.023           select count(*) from id_tag where sex = 2 and index = 2 and income =1 and car =1 and readeri = 3;
0.14    18.166  0.47    0.011           select count(*) from id_tag where sex = 2 and index = 2 and income =1 and car =1 and readeri = 3 and sporteri=5 and marriage=1;

由此可见,在类似场景中,ElasticSearch的查询能力非常强悍;
而ElasticSearch的能力不仅限于此,结合其它插件,可以做简单的OLAP分析。

Apache Kylin环境搭建(Mac)

Hadoop

官方提供的安装指南非常详细,按照其步骤执行下来,途中没有遇到什么问题。
(直到运行Kylin的Sample时出现无法加载Native Libraries的问题,进而导致无法加载Snappy库;
详细信息请查看“问题汇总部分”;
解决方法请查看历史文章:Mac安装Hadoop单机版/伪集群

前置组件:

  • JDK
  • SSH

参考文档:

dfs启停:

sbin/start-dfs.sh
sbin/stop-dfs.sh

YARN启停:

sbin/start-yarn.sh
sbin/stop-yarn.sh

遇到的问题:
MapReduce报错,跟踪Hadoop日志: $HADOOP_HOME/logs/userlog/...
发现是错误明细:

 /bin/bash: /bin/java: No such file or directory

解决方法:
/bin目录下创建软连接:

ln -s $JAVA_HOME/bin/java /bin/java

注:Mac OS X 10.11 El Capitan需关闭SIP(System Integrity Protection),步骤如下:

  1. 重启Mac,按住command+R,进入recovery模式。
  2. 选择打开Utilities下的终端,输入:csrutil disable 并回车,
  3. 正常重启Mac即可。

Continue Reading...

博客页面自定义

为了迎接老婆大人将文章迁移至此博客,特开辟新的导航菜单。

自定义内容:

  1. 博客主页header从居左调整为居中;
  2. 导航菜单nav-menu从居右调整为居左;

修改文件路径:
WEB_PATH/usr/themes/theme/style.css

#header {
    padding:58px 0 0;
    text-align:center;
}
    
#nav-menu {
    margin:10px 0 -1px;
    padding:0;
    float:left;
}
  1. 导航菜单添加作者导航。

修改文件路径:
WEB_PATH/usr/themes/theme/header.php

<nav id="nav-menu" class="clearfix">
    <a <?php if($this->is('index') || $this->is('post')): ?>
    class="current" <?php endif; ?> 
    href="<?php $this->options->siteUrl(); ?>">
    <?php _e('主页'); ?></a>

<!--添加此段内容--!>
<?php Typecho_Widget::widget('Widget_Users_Admin')->to($users); ?>
    <?php while($users->next()): ?>
        <a <?php if($this->is('author', $users->uid)): ?> 
        class="current"<?php endif; ?>
        href="<?php $users->permalink(); ?>"
        title="<?php _e('%s 的Blog', $users->screenName); ?>">
        <?php _e('%s 的Blog', $users->screenName); ?></a>
    <?php endwhile; ?>

<?php $this->widget('Widget_Contents_Page_List')->to($pages); ?>
    <?php while($pages->next()): ?>
        <a<?php if($this->is('page', $pages->slug)): ?> 
        class="current"<?php endif; ?> 
        href="<?php $pages->permalink(); ?>" 
        title="<?php $pages->title(); ?>"><?php $pages->title(); ?></a>
<?php endwhile; ?>
</nav>

AWS S3&IAM 权限控制研究

常用策略:
1.控制IAM用户只能访问用户名下的资源

{
    "Version": "2012-10-17",
    "Statement": [
    # 释义:
    #   操作对象:Bucket
    #   所属: Bucket context
    #   说明:允许对资源 my_bucket 做所有操作,但只限于操作文件前缀与当前用户名相同的文件。
        {
            "Sid": "Stmt1384767876001",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my_bucket"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "${aws:username}/*"
                    ]
                }
            },
            "Action": [
                "s3:*"
            ]
        },
    # 释义:
    #   操作对象:Object
    #   所属: Object context
    #   说明:允许对文件前缀与当前用户名相同的文件执行所有操作。
        {
            "Action": [
                "s3:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my_bucket/${aws:username}/*"
            ]
        }
    ]
}

相关文章:
How Amazon S3 Authorizes a Request
Overview of Managing Access

研究心得:
目前接触到的S3权限控制方式有:

  • 用户(组)
  • 资源(Bucket)

我最初尝试时两种方式一起使用,本以为是以更严格的权限控制策略来执行。
配置场景如下:

资源(my-bucket)权限设置为: 允许认证的用户对资源做列表、查看、上传/删除操作;
QQ20160624-1@2x.png

用户组权限应用上述策略(控制IAM用户只能访问用户名下的资源)。
QQ20160624-0@2x.png

实际情况是: S3优先根据资源权限控制进行判断,其次才会应用用户组权限控制。
在上述配置场景中,用户组的权限控制实际并未生效,所有用户均可访问已分配的资源:

# 用户能看到的文件列表均相同
userA/
userA/fileA
userB/
userB/fileB

而当我去掉资源(my-bucket)权限设置后,结果为:

# userA能看到的文件列表
userA/
userA/fileA

# userB能看到的文件列表
userB/
userB/fileB

Bingo!