Yanxi.me 热爱互联网和技术,喜欢探索的终身学习者

从2000年接触互联网开始,一直在做互联网相关的技术开发工作。在这里把目前工作中(凤凰金融)主要用到的技术收集到一起。链接地址大多都是指向国外的英文网站,有一些还需要翻墙才能看到。这些都不应该是问题,因为阅读英文技术文章和懂得翻墙应该是从事互联网技术开发人员的两项必备技能。在这里把目前工作中主要用到的技术收集到一起:

语言:

  • Html, css
  • Javascript
  • markdown
  • Objective-C

Web前端:

Web服务端:

App开发:

数据存储:

运维工具:

如何更好的分配任务、辅导员工

   

自从去年10月发过一篇公众号文章,就再也没有发过了。有朋友询问怎么不写了,主要是因为写文章对我来说太费力(要是能像写代码那么轻松就好了),所以一直没有抽出时间写。今天整理了篇培训笔记,主要是作为自己的备忘录。如果也能给其他人带来一点点帮助,那就更好了。

上周六参加了公司 HR 安排的培训课程《任务分配与员工辅导》,课程是采用老师讲和自由讨论相结合的方式。主要讲的是工作中的沟通问题,听的过程中有不少收获,都是针对平时工作中的问题,但课程完成后回忆起来,却只能想起来几个少数的点。为了能够更系统的记住这些,并运用到平时的工作当中。回来对照教材列了个简单的大纲,算是个总结,便于记忆,也供自己在今后的工作中参考。(据说请老师讲一天课要几万块成本,总得值回票价吧)

Part 1 任务分配

确定任务合适人选

做任务分配,在确定合适人选的时候,主要需要考虑任务接受者下面四个方面的因素:

  1. 工作能力(能不能胜任工作?)
  2. 工作余力(有没有时间做?)
  3. 工作动力(有没有意愿做?)
  4. 发展需要(对个人发展有没有帮助?)

如果能找到四个问题答案都是 Yes 的人选,毫无疑问这就是最优的方案。但在现实中很难完全匹配上这4点,即使对方口头不直说,也要通过观察了解到他的真实想法。先通过同理心表示理解对方的感受,再进行后面的讨论。

同理心(Empathy),又叫做换位思考,指站在对方立场设身处地思考的一种方式。即与人际交往过程中,能够体会他人的情绪和想法、理解他人的立场和感受,并站在他人的角度思考和处理问题。

制定计划

大体上可分为明确职责明确权利给予支持跟进四大步骤:

明确职责

  1. 明确任务目标、重要性和益处
  2. 明确总体范围和具体任务
  3. 绩效期望
  4. 可能的难点和障碍

明确权利

给予员工权利时,需要考虑下面几个因素:

  1. 员工与工作相关的经验能力
  2. 员工完成任务的动力
  3. 任务的复杂性
  4. 任务的重要性和要做的决策
  5. 你必须要消除的潜在负面影响

给予支持

  1. 充分讨论,按实际情况提供辅导和培训
  2. 信息共享
  3. 排除障碍
  4. 寻求其他专业人士的指导

跟进

监控:在员工执行任务时,需要观察和跟踪项目进度。

衡量:设立具体、客观的目标,这样员工就会了解你的期望,并能在执行任务时评估自己取得的成果。

后面还会详细列出任务追踪的流程和方法。

任务分配互动流程

最好能记住下面互动的套路,后面员工辅导流程也是类似。

  1. 开启讨论:描述任务的目的和重要性,为什么是我?

    今天我们要谈一下分给你的工作… 这个工作非常重要,因为… 之所以由你完成是考虑到…

  2. 澄清问题:描述任务详情,确定任务责任、时间要求和期待的结果。解答对方的担心和困惑。

    我对你的期望是…(任务完成的时间、结果、要求等) 你觉得有什么问题不?

  3. 讨论方案:如果对方有疑虑,在这里讨论解决问题的方案,并为其提供资源和支持。

    我们需要解决的问题有… 我们分别谈一下。 对…问题,你有何建议?

  4. 达成共识:制定行动计划、所需资源、追踪方式

    你能否总结一下我们达成一致的要点? 那接下要你打算怎么做?需要我提供哪些支持和协助? 那接下来我们什么时候再讨论一下进展?

  5. 总结讨论:总结讨论要点确认信心

    谢谢你,通过这个讨论,我们达成了…一致 现在你对完成这个工作有信心了吗?

有效沟通三法宝(听、问、说)

一听

二问

  • 收集信息,了解真相
  • 澄清疑虑,核对想法
  • 拓展思维,鼓励参与

下面是常用提问句式:

what

你的建议是什么? 可能遇到什么挑战/困难/障碍? 我们需要知道什么数据/状况才放心?

why

什么原因你会这样建议? 这样建议的理由是? 你认为可能是什么原因?

how

你打算如何开始/进行? 要怎么样做,才可以? 若需要同时满足 A 和 B 限制下还有什么方法、可能性? 下一步概要做什么才能有效面对现在的状况?

when

你认为什么时候可以完成? 我们何时开始进行?

who

谁可以帮忙呢? 哪些人应该进入这个项目计划? 可从谁那边获得资料、资源、协助? 谁能、愿意处理这个部分? 你会推荐谁?

other

假如你是 XX,你会如何处理? 如果拥有充分的决定权级资源,你打算怎么做?

三说

观点理由感受相结合。单纯陈述观点无助于建立互信,有效分享原因及感受将会为你打开另一扇大门。

允许他人更好的了解你,从而消除主管臆断带来的危害。

任务追踪

人们不会做你希望的,只会做你检查的。如果你强调什么,你就检查什么,你不检查就等于不重视。

——郭士纳

追踪流程

  1. 收集资料,了解任务进展情况
  2. 对照之前制定的计划和目标,找出优点和差距
  3. 针对差距进行辅导和纠正

追踪方法

  1. 召集会议
  2. 观察检查
  3. 定期反馈及报告

重点追踪什么

  1. 结果: 可以从质量数量时间成本控制四个方面评估
  2. 行为: 工作中的表现

Part 2 提供卓越辅导

分配任务时,往往很难找到完美的人选(拥有能力余力动力满足个人发展需要)。所以需要提供卓越的辅导,使其能够完成越来越有挑战的工作。按问题发生的时间顺序可分为三大类:

  1. 未雨绸缪。通过培训辅导在错误发生前做好预防,或者在刚有苗头的时候就把错误扼杀在摇篮里。
  2. 亡羊补牢。错误已经发生,通过事后培训来解决问题,并避免再次发生。
  3. 针对屡教不改者的辅导。

越早发现问题并给予辅导,成本越低、效果越好。

辅导流程

  1. 识别需求:观察员工的工作成果,根据实际情况可分为两类。
    • 成功型辅导:当员工接受新的或者具有挑战性的任务
    • 改进型辅导:当员工绩效下滑或者低于预期
  2. 进行辅导:提供反馈、正式讨论
    • 提供正面反馈和改进型反馈,具体见本文 Part 3 部分
    • 将员工的行为和结果与绩效标准相联系
    • 提开放性的问题
    • 及时提供反馈以产生最大影响
  3. 提供支持:鼓励责任感、提供资源、移除障碍
    • 继续监控进展并衡量结果
    • 鼓励员工寻求支持
    • 建立明确的责任分工
    • 确保员工理解你将会提供额资源和支持
  4. 重新回到第一点识别需求阶段,形成循环

行为观察 (STAR 模型)

  1. Situation/Task 情况/任务
  2. Action 行动:是不是有不良的工作方法和行为
  3. Results 结果(质量、数量、时间、成本控制四方面)

追根究底

  • 不会做:缺乏知识、经验、技术、能力
  • 不想做:缺乏意愿、动机、信心、兴趣
  • 不能做:缺乏资源、时间、授权、体力

找到具体原因属于以上哪种情况,根据实际情况展开互动。

互动流程(和任务分配时的流程一致)

  1. 开启讨论:说明这次谈话的目的和重要性
  2. 澄清问题:运用 STAR 模型,了解背景和原因
  3. 讨论方案:讨论解决问题的方案,和所需的资源
  4. 达成共识:制定行动计划、确定所需资源、追踪与监督方式
  5. 总结讨论:总结讨论要点,确认信心

Part 3 提供反馈

及时

48小时内,时间长了对方可能会忘记。

明确

根据 STAR 模型向对方说明:

  • Situation/Task 描述清楚当时对方所处的情况
  • Action 对方采取的行动
  • Results 这些行动带来的结果
  • 对于改进型反馈,需要增加建议的行为(A)和可能的结果(R)

表扬型反馈实例:

半个月前项目组骨干小何病了,你在项目阶段会议无法更改议程的情况下 -ST 连续加班两天,履行小何的职责。收集整合各方材料,准备项目阶段会议所需要的文档, -A 这些付出让会议按原定日程进行,保证了项目按计划时间推进,谢谢你做了这么多的投入使用要求。-R

改进型反馈实例:

刚才接到客户投诉产品时,面对客户的不当职责 -ST 你情绪非常激动的进行了辩驳 -A 结果让客户觉得我们是在推卸责任,投诉没有解决,还引起产品以外客服的问题。 -R 如果你先理解、认同客户拿到有问题产品的感受,然后给客户提供一个解决方案 -A 也许客户的情绪会得到一定安抚,更容易平静的接受我们提供的解决方案和建议。-R

平衡

主要针对改进型反馈,不能让对方感觉自己一无是处。可以考率采用肯定+改进+肯定的三明治方法。


以上就是这次培训课程的主要知识点,内容实在有些多,这里只列出纲要,没有展开去说。总结和记录相对容易,难的是融汇贯通,并灵活运用到日常的工作和生活中。

上次发文章,带来了30个粉丝。再次发文,粉丝数能翻倍么?

standard JS 代码规范和提交代码时检查

   

公司的 Javascript 项目最开始有一个代码规范,也用 jsHint 写了检查脚本。但是随着团队人员的逐渐增加和项目的时间紧迫,有一段时间没有特别强调要去做代码规范的检查。导致后来每次运行 jsHint 脚本都是错误无数,于是更没有人做相关的检查了。由于缺乏代码规范,不同的人有不同的偏好,代码可读性逐渐降低。也出现过几次由于不小心带来的线上 bug,这些完全是可以通过代码检查避免的。于是我决定是时候对代码规范和检查做强制性的要求了。

之前的 JS 代码规范比较简单,也没有涉及到 jsx 部分的规范。不同的人对于 JS 的写法有不同的习惯和看法,其实本没有对错之分。但作为一个开发团队,应该采用相同的规范,不同的人写的代码应该看起来是出自同一个人之手。这样能显著提高代码的可读性,有利于团队合作,避免出现不必要的错误。而且规范一旦制定,一定要有可行的办法强制执行,不然规则再完美再有效,也没有实际的意义。关于代码规范,非常认同下面的几句话:

“对风格的挑刺毫无意义可言。它们必须是指导原则,且你必须遵循。”

–Rebecca Murphey

“成为一个优秀的成功项目管理者的一个条件是,明白按自己的偏好风格写代码是非常不好的做法。如果成千上万的人都在使用你的代码,那么请尽可能通俗易懂地写出你的代码,而非在规范之下自作聪明地使用自己偏好的风格。”

–Idan Gazit

Objective-C 学习笔记

   

趁过年在家有点时间,从除夕到今天终于把 Code School 里的 Try Objective-C 课程学习了一遍。虽然之前看过 OC 语法,但一直觉得比较反人类,这次再学习一遍,收获还是不小.前三个级别对我来说比较容易,后面两个级别还是有些难度的。在这里把其中的主要内容做一下笔记,以备下次可以快速复习。

Level 1: NSLog, NSString, NSNumber, NSArray, NSDictionary

NSString *name = @"yanxi";
NSNumber *age = @33;
NSLog(name);
NSLog(@"%@ is %@ years old", firstName, age);

NSArray *apps = @[@"AngryFowl", @"Lettertouch", @"Tweetrobot"];
NSLog(@"%@", apps[1]);

apps[3] = @"Instacanvas";     // 出错了,NSArray is an immutable object.

// 可以重新赋值
apps = @[@"AngryFowl", @"Lettertouch", @"Tweetrobot", @"Instacanvas"];

NSDictionary *appRatings = @{@"AngryFowl": @3, @"Lettertouch": @5};
NSLog(@"%@", appRatings[@"AngryFowl"]);

ES6 中 import/export 和 require/exports 对比

   

Javascript 最早用于浏览器,处理的逻辑比较简单,没有语言层面的模块化处理方法。 随着 JS 应用的逐渐复杂,人们提出多重模块化规范,其中最著名的当属 CommonJS 和 AMD 了。随着 nodejs 的推出和流行,CommonJS 已经被大家所熟知。最早实践前端模块化的框架 requirejs 使用的则是 AMD 规范。相对 AMD 规范来说,commonjs 在定义和使用上都要简单不少。所以后来推出的 browserify 就是用 commonjs 规范来组织前端 JS 代码。而这两年流行的 webpack 则兼容了以上两个规范。先来回顾一下这两个规范:

AMD (Asynchromous Module Definition)

// 定义模块
define('sum', function() {
    return function(a, b) {a + b}
});

// 使用模块
define(['sum'], function(sum) {});

Redux + immutable.js 学习实践

   

用 react + redux 有一段时间了。之前都是自己写的 reducer,因为每次修改 state 时需要返回新的引用,所以需要特别注意,用起来总觉得不够方便。这两天学习了一下 Immutable.js , 准备把它引入到项目中和 redux 配合使用。先来设计 action 数据存取方法,最主要的几个方法如下:

// 根据 keyPath 设置 value,可以更新任意深位置的数据
// value 是简单值类型或者 Immutable 类型,也可以是函数 (oldValue) => newValue
dispatch(action.set(...keyPath, value)) 

// 删除 keyPath 对应的 value
dispatch(action.delete(...keyPath))

// 根据 keyPath 获取 value
state.getIn(keyPath)

成长在凤金 (北邮校招分享)

   

前晚(周五)作为校友参加凤凰金融在北邮的校招宣讲会,做了一个小分享,主要讲在公司一年半以来的成长,下面是分享的内容。


各位学弟学妹们,大家好。时隔多年回到母校,走进期待已久的教三,感觉很亲切。为什么说期待已久呢,因为从我大一入学的时候开始,这里就是一片空地,那时旧的教三已经拆除了,一直期盼到快毕业新教三才盖起来,所以我很羡慕你们。

先简单介绍一下我自己,我叫阎曦,是我们学校 2000 级电信工程学院的学生,电院应该是现在信通学院的前身。目前我在凤凰金融技术部移动端负责移动 Web 组工作。从毕业到现在转眼 12 年多了,基本都在互联网行业做开发,大概经历了三个阶段。第一个阶段是在亚马逊中国,8年时间经历了个多个团队和项目组。在这里学习到了很多先进的技术和理念,也感受到了他们在中国的不足。第二阶段的3年时间,折腾的事情比较多。开始是自学股票期货知识,做了一段时间期货程序化交易,开始还挣不少,后来因为风险没控制好亏得更多;然后是和朋友尝试做大数据方面的创业,产品上线了两版,由于没有找到投资放弃了;后来又加入了一家微电商创业公司。第三阶段就是今天大家看到的凤凰金融。

微信小程序技术调研

   

这两天抽空看了下微信小程序的官方文档,做笔记如下:

  • 只有先有小程序邀请码,才能试用和体验
  • 开发工具:微信自己的开发工具
  • 并非运行在 Web View 中,体验接近本地应用
  • 全局配置
    • app.js 程序脚本入口
    • app.json 全局配置文件,配置小程序里面的页面
    • app.wxss 全局样式表文件
  • 页面
    • xxx.js 页面的入口文件 (逻辑层)
    • xxx.json 页面配置文件
    • xxx.wxml 页面结构 (View) 支持:数据绑定、条件、列表、模板、事件、引用
    • xxx.wxss 样式表文件 (View)

新办公室第一天, 新的起点, 新的征程

   

从今天开始告别酒仙桥星科大厦, 到位于来广营朝来科技园的新办公楼上班了. 自从去年5月初加入凤凰金融, 就一直在星科大厦办公, 目睹了公司总交易额从10亿到20亿, 50亿, 100亿, 140亿的增长, 并在去年12月份拿到了A轮8000万美元的融资.

公司从我来的时候总共100来人, 发展到现在三四百人的规模, 星科大厦的工位早就不能满足日益扩大的人员增长. 搬家前基本都是1个工位做两个人, 就连公用走廊都堆满了我们的桌椅, 笔试面试都是在走廊进行, 前后门口的小小空隙是我们的办公室. 从最艰苦的环境走来, 盼望新的办公楼已经小半年了, 今天终于看到了, 虽不算豪华, 但还是有些兴奋的, 还是上图了.

有了好的环境, 更需要好的人才. Html5 + node.js 方面继续招聘, 求贤若渴, 欢迎联系, 共创辉煌!

外景,楼上5层 + 地下1层 凤凰金融新办公室

最重要的几条原则

   

最近在看李笑来推荐的必读书籍原则,里面对我冲击最大的几条规则是:

  1. 不要害怕真相,真想在恐怖,也要勇于面对,并基于真相做决策
  2. 要更看中于二三级效应。眼前的一级效应即使痛苦,但对长远二三级效应有帮助的选择,就是好的选择!
  3. 要特别重视反馈:要基于事实来给别人真实的、清楚的反馈,也要对自己做反馈,更要鼓励其他人给自己做反馈。并对反馈结果进行讨论。
  4. 要特别重视问责:如果有错误出现,要实行问责,不是为了追究某人的责任,而是为了避免下次再犯同样的错误
  5. 要极度的透明,对所有人都开诚布公

谈谈一心二用

   

从小就被教育做事情要一心一意,不能三心二意。真的一定是这样吗?举几个简单的例子就会发现其实并非如此。比如我们可以在跑步的时候听歌,不会因为在跑步所以听不到歌曲了,也不会因为听歌而忘记跑步。比如我们可以在吃饭的时候看电视或者聊天,不会因为在夹菜所以看不懂电视,或者不会说话。但是如果在跑步的时候听教授讲授高等数学,或者在吃饭的时候面对数百人演讲恐怕就很难完成了。问题出在哪里呢?因为听歌和听高等数学的难度不同,导致所需要耗费的脑力不同。闲聊和发表演讲的难度不同,所需要耗费的脑力也不同。

我们知道电脑可以同时做多件事情,比如可以一边播放着音乐,一边还可以用浏览器上网。让我们来看看计算机是如何做到一心二用的。熟悉计算机编程的人都知道电脑计算全靠 CPU,就算是单核的 CPU 也能同时完成多个任务。编程世界里把这个叫做多线程,比如有两个任务 A 和 B,完成单个任务不需要也没必要占用 cpu 的全部时间,所以可以同时做 A 和 B 两件事情。其实单核 cpu 在同一个时刻确实只能做一件事情,那是如何实现两件事情并行的呢?那是因为大部分的事情都会有阻塞,对于计算机来说,比如读取磁盘、网络、数据库的数据。cpu 在做事情 A 等待的时候可以做另一件事情 B,在 B 等待的时候又可以回来做事情 A,这样来回切换就可以实现同时做两件事情了。并且做完 A B 两件事情的总时间和单独做 A 和 B 的时候差不多。此时:总时间 = 完成A的时间和完成 B 的时间较长的那个。