小公司的前端应该怎么做?

作者:叶小钗(@欲苍穹)

链接:http://www.cnblogs.com/yexiaochai/p/5311712.html

前言

近期工作生活比较漂泊,从上海换到了成都,这个是以家庭为单位的重大决定,离开一线城市对于职业生涯和技术前沿来说是有一定问题的,但是出于房价考虑(主要是买不起房子)与生活舒适度来说,回蓉似乎是一个比较好的选择,何况成都的互联网也还行。

随着能力的提升,负责的工作种类会逐渐增多,考虑的方向也会有所不同,这个时候不太会有太多单独的知识点成为阻碍了,工作中碰到的问题要么太“大”,总结起来费力,要么太“小”,不适合单独整理成文,这种现象反而造成了一段时期的博客空白期,总的来说就是又开始懒了,思维又开始懈怠,人又开始想待在安逸区了。

因为开始懒了,所以没能学习到新知识,自然出不了新文;因为开始懒了不愿意再对工作中的问题一个个深入研究、深入挖掘自然出不了新文。

所以人还是得不停的鞭笞自己啊,不能让自己陷入“瞎忙”的境地,得有效的利用时间,才能走的更远!!!

现在我在一家小公司做前端,因为公司以及职位的变化,对于在小公司如何做前端有一些心得,拿出来与各位做个分享,希望对处于小公司的前端有一定用处,也鞭笞自己重新学习总结。

什么是优秀的前端团队?

团队初期缺什么

在公司中,层级越高对业务关注比例越高,反而不太关注个人成长,所以评价一个leader是以团队为单位,团队成员比他强是应该的;对于个人来说的话,要多关注自身能力成长,然后能力匹配自己的职位,甚至超出自己的职位,这样的团队的话,战斗力是比较强的。

主管(包括前端主管)设定目标必须可量化 ,比如你做一个业务,kpi是多少,那么技术就需要考虑如何才能达成,细化到研发甚至前端层级,就是所谓技术kpi了。

比如,今年H5站想达到单日平均出票量10000,那么这个就是业务目标,需要消化分到各个业务团队,可以是:

① SEO优化

② SEM优化

③ 营销广告

④ 微信&支付宝&手机百度流量接入(微信钱包是十分优秀的流量入口,可以极大程度的增加流量)

⑤ 实地推广

……

以上当然只能解决部分问题,具体到前端,可能我们就要从页面转换率入手,建立订单漏斗模型,做性能优化,做交互优化,每一个具体的层面都需要转化目标。

这些都是直接可量化的东西,因为当前业务已经到了一个瓶颈,或者公司已经到了一个瓶颈,业务上就需要做不停的尝试,对应到技术就是需要你快速迭代,低成本迭代,不断的容错试错。

这个时候就会提出很多问题:

第一是你的团队在类似高压下会不会主动加班去实现公司的目标、个人的kpi。

第二是你的团队在这轮高压拼搏后有没有留下什么东西?

根据之前经验,没有团队可以无休止的承受高压加班的压力

以之前携程无线高压迭代的经历来说,就算是那么优秀的团队事实上到后期也是疲惫不堪,疲惫的时候容易犯错,亢龙有悔,盈不可久。

第三是如何帮助新人快速的融入团队,如何让1+1=2。

我们都清楚,好的项目绝不是堆人可以堆出来的,如何让一个项目可以分解到各个人手中,如何让良莠不齐的同事可以更好的协作,这个是我们需要考虑的。

要解决这些问题是要靠平时的积累,具体体现到前端是:

1 在不停的迭代中,你的业务流程是不是最优(产品到设计到前端到最终上线流程)

2 在不停的迭代中,是否沉淀出来了公共服务与工具化服务

好的前端是什么样的

首先,好的前端是一定愿意加班的,同时,好的前端是会找办法让团队少加班的。

和一些朋友做过交流,很多好的点子,改善工作效率的点子都是几个人讨论后私下晚上搞出来,然后反复实践用于生产的。

一般来说业务kpi对于能力强的朋友来说不会太难,所以对他们的期待也会更多:

有强烈的意识,能深刻了解到当前项目性能的缺陷,开发效率低下的原因,并会找寻处理办法

很多团队在快速迭代中会开始“欠账”,时间久了就不愿意还,问题的存在搁置需要想办法去解决,团队成员是看得到问题的,没人说,没人做是因为知道那是坑,你如果能解决的话,一到二次便能提升自己在团队中的位置。

好的前端应该有良好的架构设计能力

首先,好的前端能向人清晰有条理的描述自己的技术方案,并且让人听得懂!

然后架构设计能满足长久的需求发展,就算业务频道扩大了10倍,用户量增加了100倍,也不会有根本的变动。

好的前端应该具有良好的交流能力

对内,好的前端需要了解团队成员的性格与能力,做出适当的任务分配分解;对外,需要抢占业务还不能产生利益冲突,这类人是项目推进的主力。

小公司的前端应该怎么做

不是所有的小公司都这样,但是我见过的小公司的前端都在扑业务,并且疲于奔命,这个是个恶性循环,第一次做业务:

加班赶业务-业务结束轻松一周-加班赶迭代-业务结束轻松一周-加班新业务-业务结束轻松下……

偶尔你会问这些朋友为什么没有什么积累,得到的答案基本是一致的,忙啊!他们忙起来的时候是真的很忙,但是第二次如果依旧这么忙的话就有问题,第三次还这样就是团队不健康了,一个好的做法是:

① 完成前后分离,这步做不到,后面也不用做了

② 形成几套UI库

③ 根据业务形态,形成公共业务

④ 前端重复工作工具化

⑤ 形成优化体系

⑥ 形成统计体系

⑦ 建立页面转化漏斗模型

⑧ 做ABTesting方案

……

首先,无论出于什么考虑,前后一定要做分离,如果有SEO需求,那么再后续推进nodeJS方案,毕竟现在不给钱想排前面还是很难,SEO基本没意义。

其实,小公司有很多坑可以占住,这个会帮助你建立团队威望,下面我举几个细节点说一说。

UI库

UI库的形成与UI库的多少将决定你后续项目重复工作量的多少,这个UI库需要注意几点:

① UI是否可重用

② UI是否可定制

比如让很多朋友去做这个时间选择器,做出来就真的是时间选择器,如果让他换成城市选择器,就全傻眼了:

③ UI是否可拆分,可聚合

还是以上面UI为例,这个组件事实上是一个聚合组件,由一个select组件与一个弹出层组件组成,你的UI是不是可拆分是评价他质量的一个很大考虑点。

……

公共服务

公共服务可以说成一个大一点的“UI组件”,但是他是与业务相关的,UI来说一般不会与业务产生耦合,以上面的日期选择器来说,无论他装的是日期还是区域都是可以的,并且不应该请求服务,他是纯净的UI组件。

而公共服务是不纯净的是一定与业务相关的,移动端比较常见的公共服务是:

passport

包含登录注册、个人资料管理,甚至包含一些认证相关的,与公司账号相关的操作,登录注册是各种活动,各种业务频道都可能会使用的业务,这种东西是必须服务化的,但是很多小公司都没做。

因为公共的特点,页面设计最好中性一点,其中几个常用的页面,比如登录需要包含以下设计:

① 样式可定制化(弹出层、独立页面什么的都是常事)

② 回退可定制,其实所有的公共服务回退按钮都是需要定制的,登录成功去哪个URL登录失败去哪个URL,点击浏览器回退去哪个URL都得约定,少一个都不是公共服务

③ 单点登录,事实上初期根本用不到什么单点登录,甚至大家都不是跨域的,所以后续需要再支持即可

还有很多与passport一样的公共业务,比如:

① 钱包服务,包括用户支付订单相关管理

② 城市列表,这个要考虑参数如何传递

③ 反馈系统

④ 公司介绍

除了面向C端的公共页面服务,还会有面向B端的统计平台相关。

前端工具化

静态资源处理

评价一个前端团队是否优秀成熟的评判多以团队工具化的程度,一个简单的例子是:

① 你们前端静态资源是如何组织的、如何打包的

② 你们前端静态资源是如何解决缓存的(比较好的方案是MD5)

上面两点可以使用grunt/gulp一类的构建工具轻松做到,如果有公共框架文件还会需要引入种子文件的概念

跨域问题

另外,所有前端团队都会遇到跨域问题,特别是前后分离后,服务器端只提供API接口,前端代码随便在哪都能运行,那么这个时候你是怎么做呢?

① 使用fiddler&charles做代理

② 提供测试服务器

③ 支持jsonp跨域

④ 支持cors跨域

那么这些方案,哪种最适合团队,哪种成本最低(一般来说是代理),是我们需要考虑的

tips:我之前使用fiddler,现在换mac了使用charles,两款工具十分优秀,正则一块的处理很好,推荐使用

移动端适配

从后端转到前端的同学一般在业务逻辑上有一些天生的优势,但是往往在CSS一块比较弱,如何在开发人员无感的情况下引入rem,如何与现有机制无缝的使用less,如何处理单页应用中css的污染,这个是框架底层需要考虑的。

模块化&组件化开发

团队上规模后,如何使用模块化开发处理协作问题;业务代码复杂度上升后,如何使用组件化编程思维简单开发复杂度,这些需要应用到项目实践中,并且路径是可复制的;

一些优化手段,也需要工具化,框架化,让开发人员无感。

前后端协作

前端与服务器端,开发速度未必同步,事实上很多时候都不是同步的,在已经约定了接口格式的情况下,接口还没有写好,但是前端依然能写交互,团队是如何写这种假数据,这个方面实现会大大的提升工作效率。

订单下降分析

如果在某一个时间段,全站的流量或者全站的订单量下降了,你如何跟踪这次下降的原因,如何最大程度上避免下次出现类似的现象,这个时候数据统计会避免我们成为瞎子,所以得尽快建立统计平台,转换率模型。

快速迭代,通过迭代来优化产品,但是如果每一个迭代都完全颠覆了之前的设计,很多时候公司就是原地踏步,每迈出一步你要清晰的知道前一个版本哪里出了问题,针对问题做优化,而不是频繁改版。

这次改版后,你如何知道这次优化就比上一次的好,而不是其它因素造成,ABTesting方案应该是每一个成熟团队必须的,持续优化这些都是建立在有效的数据监控与意见反馈机制上的,我们不能做完网站变成瞎子。

结语

因为很久没有写博客了,又因为最近刚好来到了小团队,有一些想法以水文的形式发出来与各位讨论,希望对各位有用。

诚然,对于一个前端来说,要推动上述工作还是有一点难度的,但并不是不可能,前端对自己的定位要变,从前端工程师到软件工程师。

我常常听到很多前端自己都在质疑自己,或者就是膨胀到觉得自己团队没有什么可以做了,那么这个时候可以考虑下:

你们团队的自动化、安全性已经到位了吗,效率就真的完全没有上升空间了?

前端的重视程度需要你我一并努力,在大公司做前端难,在小公司做前端更难,你我共勉,最后补充下为什么回成都,以及回来的一些感受。

从一线城市到二线城市

几年前,怀着想学点新东西的想法,我来到了上海,在这边也确实学到了很多东西,关于学习有几个必要条件:

① 好的项目

② 好的团队

③ 加班总结

很多时候不是一些朋友不努力,但是PV上亿的项目国内真的不多,创业团队这种机会就更少,所以根本没有这种机会,这个时候看人家做的很多优化就是看热闹,似乎懂得了什么,其实什么都没懂。

就算是携程最好的时光,依旧有很多团队没有跟上好时候,比如不在无线的团队,那么无线团队的经验包,如果不是真正好学的人是接收不了的,就算我处于无线团队,native团队中很多经验包都是遗漏状态,而且无论怎么打听都是打听不出来的,就比如native资源更新机制,我就前前后后关注了两年,从各处零碎的得到了很多知识,现在看来依旧不够系统,不可谓不遗憾。

又比如有一次携程全站出现了一个重大BUG,因为是server端的问题,自己当时目光短浅没有去深入,到现在想深入都没有案例了,只能说机会稍纵即逝啊!!

所以就算后来进入百度了解到了fis的好,但是真正想去深入的话怎么都摸不着门道,只能学习一些思想走;这个也是一个框架成型后如果后面的人来维护怎么都维护不好的原因,因为他们找不着精髓,后来的人甚至会喷框架的各种不好,自己却找不出方案。

这个就是一线城市的一大好处:

一线城市,具有好项目(PV过亿),好团队的机会要好很多,只要你努力上进,就能收获很大的经验包。

这就意味着,只要你愿意学,就一定可以收获很大的经验礼包,这里有很多热心的大神,愿意与你讨论,愿意与你分享,而你的分享也会带给你快乐与成就感。

另外,外面的薪酬包也要比二线城市大得多,就我而言,回成都薪酬包只有原来的70%不到,如果这次没回成都的话,待遇应该会有长足的涨幅,但是最后还是选择的归蓉。

关于机会好的伪命题

很多人到一线城市打拼是觉得那里机会好,事实上这是一个伪命题(在我看来),不可否认沿海的机会很多,但真心说不上好。

职场这个东西真心不好说,你能力强需要人赏识你,你上去了还得你的老板上去,你老板上去了,还得你老板的老板也上去了,如果中间有一个老板失势了,那么新的老板可能会洗牌,情况好的话你留下,并且依旧令人尊敬,但是更多的情况是可能你得卷铺盖走人,互联网离职率高不是开玩笑的。

能力强不等于职位高,因为一般来说你的能力还没有那么强,能玩转公司的毕竟是少数,搞技术的更多的情况还是比较实在,想安安静静写代码,很少搞政治斗争,又心高气傲,又比较脆弱,面对不合理的KPI,或者被产品无限制的坑,是非常容易离职的。

外面优秀的人扎堆,所以真的机会只是相对的,你如果抱着学习收获经验包的想法出来会收获很大,如果你经验包已经够了,想更往上发展,那么这个是很难的,因为管理或者交流未必是开发擅长的。

再往上会关注业务发展,关注KPI,需要大量的产品知识,自己甚至会成为产品,这个时候搞技术的时间就会相对变少,但技术不好又很难让技术员工服众,光是技术好又上不去,竟然有点矛盾。

我身边就有几个人出去做CTO,结果团队刚刚上轨道就被扫地出门了……

另外,就是外面leader很辛苦,特别是团队上升期,好的leader会陪着团队加班,会很晚,我们之前好的老板(35岁左右)都是陪着团队加班的,总之钱不好赚,如果leader偷懒,几年下来可能会废掉,被淘汰掉,这个中年危机是不可忽视的。

虽然如此,一线城市的机会和成功的几率依旧比二线城市好得多,而你愿意拼搏,善于思考,是可以发展的很好的,那么我们为什么要去二线城市呢?

为什么去二线

去二线城市主要原因就是房价贵,房价太贵,同样的钱可以在成都买三套房子了,而且一线城市买的房子很偏远,上班得一个多小时,下班又得一个多小时,这样来说是相当令人疲惫的。

然后外面工作节奏太紧张,甚至已经紧张到没有生活了,有追求的人995是常态,996也是有可能的,这个会不断的透支你的身体,年轻点还好,稍微上点年纪,有了家庭的话就不行了,会考虑的更多了。

比如在一线城市落户的条件比较苛刻,小孩教育问题、父母养老问题都是你需要考虑的,想着想着,就会有一个想法,要不回老家算了,又不是找不到工作,于是就回来了。。。。。。

回成都后的感觉

回成都后,第二天便出差去北京,整个清明节都在加班,完了回成都也一直在加班,尼玛这边的工作强度一点也不比一线城市低啊!!!

但是,周末可以过得很惬意,一个月老妈也会来一次做些好吃的给我们吃,这种幸福感和归属感是外面没有的。

今天,我8点就下班,在软件园区信步而走,走了10多分钟,然后坐着公交车20分钟回家了,这种感觉还是很不错的。。。。。。

二线城市依旧会面临外面的各种挑战,不想面对依旧上不去,在哪都是面对,那就回老家面对咯。。。。。。

数据狂人必备的10本全球畅销书

2016-05-13 丑灿 大数据技术

来自:化学数据联盟

对于一位数据科学的狂热粉丝而言,可供选择阅读的书籍内容很多,包括大数据、机器学习、数据科学以及数据挖掘等等。除了这些技术范围内的书籍之外,也有很多工具类和语言类的书籍,比如Hadoop、Spark、Python和R语言等。关于数据的书籍和专题时常更新,所以只有你掌握了最新的信息才可以让你掌握这个领域内最先进的技术和技能。幸运的是(或者也可以称之为不幸?)关于数据科学与技术领域的各种专题从来不会缺少响应的书籍,所以你大可放心随便选取。

和数据有关的数据有很多具体的类目,而且每种类目都有很多畅销书列表可供你参考。实际上我们最近为读者列举了很多书籍列表,比如关于数据挖掘、数据库与大数据、统计学、AI和机器学习以及神经网络。但是以上这些枚举的列表都是根据Amazon书籍畅销榜的比较狭隘的分类得出的推荐结论,而且没有这些书籍缺少编辑决定权或者没有考虑到内容是否可以免费获取以及是否有电子书的格式。

首先,让我们把一个问题弄清楚:本文的标题有些误导性。为数据狂人(或者专业人员)推荐的必备书籍列表中的内容比较泛泛,我们向读者推荐的这10种类别的书籍当中,每一种类别的书籍内容都是与付费资源和免费资源有关的畅销书籍。尽管我们的工作内容涉及到的数据通道数量有限,但是我们通常情况下会想主动去了解比现有数据通道更加庞大的数量,你的初衷可能是为了工作的实践操作也可能是出于兴趣的目的。

所以,一位Hadoop专业人士可能不会对深度学习进行更加专业水准的洞察,他们只不过是对某些专题感兴趣。这篇文章可以让读者巩固自己的兴趣,并为那些想拓宽个人知识层面的数据狂人提供具体的建议。

需要大家注意的是,这些数据类目所涉及的内容有所重叠,这种情况无法避免。通常情况下书籍内容所专注的领域决定了他属于哪个类目。

01.数据科学DISCOVERY

畅销付费书籍推荐:

Data Science for Business

《商业数据科学-关于数据挖掘和数据分析思维你需要知道的一切》

当你尝试学习新的领域的时候,最常见的难题就是找到一本内容深度正合适的书籍。读者要么因为内容过于简单或者内容过于说教的学术性质而对买到的书籍“始乱终弃”,尽管书籍内容具有权威性和综合性,但是最终还是被读者放置于书架之上与尘埃为伴。但是《商业数据科学》这本书却一针见血,恰到好处。

——来自Amazon用户m I的读后感


畅销免费书籍推荐:

The Art of Data Science

《数据科学的艺术之美》

这本书用通俗易懂的词汇向读者描述了分析数据的具体过程。本书的作者不仅在管理数据分析方面拥有丰富经验,并且还能够指导团队进行数据分析。这本书集成了他们所有关于数据分析经验的精华,并通过较强的可应用性向数据科学的专业人士和管理者介绍了他们的经验。

——来自官方网站的书评


02.大数据DISCOVERY

畅销付费书籍推荐:

《大数据:可扩展的实时数据系统的原则和最佳实践》

Big Data:Principles and Best Practices of Scalable Realtime Data Systems

我几乎很少能有幸遇见这样一本优质的书籍。这本书对于数据建模、数据分析、数据处理需求分析以及数据架构和储存实施问题(还同时稍带了传动的数据库概念的介绍)的重要性进行了详尽而周全的讨论。这本书向广大读者传递了新鲜的整体解决方案。

——来自Amazon用户Kirk D. Borne的读后感


畅销免费书籍:

《大数据即刻出发:2015版》

 Big Data Now: 2015 Edition

在O’Reilly发布一年一度的《大数据即刻出发》年度报告的四年时间内,大数据领域已经从呱呱坠地的婴儿成长为年轻气盛的青少年。数据已经成为一些行业的领军人,而在其他行里中数据已经成为创新的驱动力。那些使用数据极其分析来制定决策的公司正在突飞猛进的超越同行的竞争对手。

——来自官方网站的书评


03.Apache HadoopDISCOVERY

畅销付费书籍推荐:

《Hadoop:通用指南》

Hadoop: The Definitive Guide

我很欣赏的一点就是这本书对你所需要了解的Hadoop设计、执行以及日常运行以及与之相关的各种技术,不仅涵盖了高层次的概念并且对技术细节的解释也非常接地气。

——来自Amazon用户AI Gordon的读后感


畅销免费书籍推荐:

Hadoop Explained

Hadoop对于那些建造在数据基础上的世界而言是至关重要的一种技术工具。在这本书中你可以发现很多有用的指导性意见,你可以发现他处理大数据挑战的手段的发展和进步。

——来自官方网站的书评


04.Apache SparkDISCOVERY

畅销付费书籍推荐:

《学习Spark》

 Learning Spark

互联网上可以获取的信息非常棒,但是这本书把大部分这些信息整合到了一处。如果你想学着像一名Spark编程人员一样思考问题,而不是单纯的像程序员一样思考问题,那么从这本书开始,作为Spark用户的你,你的思维方式即将开始发生改变。

——来自Amazon用户BrianCastelli的读后感


畅销免费书籍推荐:

《掌握Apache Spark》

Mastering Apache Spark

这本书是我们收集关于使用Apache Spark的各种具体细节的最后一块终极瑰宝。

­——来自官方网站的书评


05.机器学习理论DISCOVERY

畅销付费书籍推荐:

《模式识别与机器学习》

Pattern Recognition and MachineLearning (Information Science and Statistics)

该书的作者为一名专家,因为它可以通过机器学习算法背后隐含的复杂数学体系向读者提供独一无二的见解和领悟。我本人已经从事神经元网络方面的工作很长时间了,并且发表过线性代数、概率和回归分析方面的论文,我发现这本书中的确可以为你找到更多的启发。

——来自Amazon用户Sidhant的读后感


畅销免费书籍推荐:

《统计学习基础》

Elements of Statistical Learning

好消息来了,这将是全世界你读到的一本最重要的书籍。这本书将每一件重要的内容绑定在一起。只在此书,别无它有。

——来自Amazon用户Enceladus Transit的读后感


06.实用机器学习技术DISCOVERY

畅销付费书籍推荐:

《Python机器学习技术》

Python MachineLearning

即使对于像我这样一个机器学习技术新手来说,这本书也相当了不起。在第一次读这本书的时候,我的第一感觉就是无论从广度还是从深度,这本书将理论和实践完整的融合到了一起。

——来自Amazon用户Brian M. Thomas的读后感


畅销免费书籍推荐:

《统计学习在R语言中的应用介绍》

An Introduction to StatisticalLearning with Applications in R

这本书介绍了统计学习的基本方法。这本书主要为非数学科学专业的本科生、研究生以及博士生准备。这本书还包含大量的R实验研究,并详细的解释如何执行各种方法。对于有实践需求的数据科学家而言,这本书的确很有价值。

——来自官网的书评


07.深度学习DISCOVERY

由于目前关于深度学习优质的付费书籍资源非常少,所以这里向大家推荐两本畅销的免费书籍:

畅销免费书籍推荐第一名:

《神经网络与深度学习》

Neural Networks and Deep Learning

这是一本在线免费书籍,这本书可以教会你:

  • 一个绚烂的受生物学启发得到的程序设计范例,可以让计算机从所观察到的数据进行相应内容的学习
  • 深度学习,神经网络中强大的学习技术

——来自官网的书评


畅销免费书籍推荐第二名:

《深度学习》

Deep Learning

这本由Ian Goodfellow,、Yoshua Bengio和Aaron Courville合著的书籍正在筹备阶段,有可能是未来最佳的关于深度学习的书籍。这本书的开发版每月都在更新,在最终出版的时候读者可以免费获取。


08.数据挖掘DISCOVERY

畅销付费书籍推荐:

《据挖掘:概念与技术,第三版(摩根考夫曼数据管理系统系列)》

Data Mining:Concepts and Techniques, Third Edition

数据挖掘是对这个领域的综合性概览,我认为这本书是数据挖掘专业毕业生的绝佳之选,或者也可以做为一本参考书来使用。该书以技术为焦点(比如如何分析数据,包括准备),而且这本书包括了该领域内涉及数据存储和预处理在内的所有主要专题。然而这本书真的是非常好的方法分类资源,在第二章你可以发现非常强大的聚合分析的方法。

——来自Amazon用户SusanKatz的读后感


畅销免费书籍这本书推荐:

《巨型数据库的挖掘》

Mining of Massive Datasets

这本书的设计是在没有正式先决条件的本科计算机科学水平基础上进行。为了满足读者的进一步学习,很多章节都从读者参考的方式进行补充。

——来自官网的书评


09.SQLDISCOVERY

畅销付费书籍推荐:

《SQL 第二版》

Learning SQL,Second Edition

如果你正在编写任何种类的数据库驱动代码并且你认为你不需要懂SQL,你需要读这本书。之后你会发现你需要懂得SQL并且这本书可以很好地辅导你。

——来自Amazon用户Jack D. Herrington的读后感


畅销免费书籍推荐:

《SQL的艰难学习之旅》

Learn SQL The Hard Way

这本书可以教会你80%你所需要使用的SQL语言,同时会将数据建模的理论混杂在其中进行讲解。如果你还在因为无法了解SQL而摸索如何建立网站。桌面系统或者移动应用的话,那么这本书就是为你准备的。这本对那些之前不懂数据库和编程,但是知道至少一种计算机编程语言的人有很大的帮助。

——来自官网的书评

10.数据科学统计学DISCOVERY

畅销付费书籍推荐:

《用白话文解释何为统计学,第三版》

Statistics inPlain English, Third Edition

作为一名数据分析师并且日常工作就是处理统计学数据,我很期待知道更多的算法和模型。尽管统计软件可以我们完成每件事,但是识别出软件咀嚼后得到的结果的确是这个工作最难以拿捏的部分。我主修生物技术专业并且对这些我生命中遇到的大部分的统计学像白痴一样。长话短说,我真的需要这本书帮助我理解更多的统计学概念。

——来自Amazon用户Shyam Goli的读后感


畅销免费书籍推荐:

《Think Stats:程序员需要的概率论统计学,第二版》

Think Stats:Probability and Statistics for Programmers, Second Edition

Think Stats强调了让你使用简单的技术进行数据和有趣问题答案的开发。这本书介绍了美国国家卫生研究院使用数据进行的案例的研究。

——来自官网的书评

一位数据分析师的职业规划

2016-05-12 大数据技术

来自网络

2012年就在网络上传,原作者不详

我小时候的理想是将来做一名数学家,可惜长大了发现自己天赋不够,理想渐

行渐远,于是开始考虑现实,开始做一些人生规划,我一直在思考将来从事何种职业,专注什么样的领域,重新定义着自己的职业理想。我现在的职业理想,比较简单,就是做一名数据分析师。

为什么要做数据分析师?

在通信、互联网、金融等这些行业每天产生巨大的数据量(长期更是积累了大量丰富的数据,比如客户交易数据等等),据说到2020年,全球每年产生的数据量达 到3500万亿GB;海量的历史数据是否有价值,是否可以利用为领导决策提供参考依据?随着软件工具、数据库技术、各种硬件设备的飞快发展,使得我们分析 海量数据成为可能。

而数据分析也越来越受到领导层的重视,借助报表告诉用户什么已经发生了,借助OLAP和可视化工具等分析工具 告诉用户为什么发生了,通过dashboard监控告诉用户现在在发生什么,通过预报告诉用户什么可能会发生。数据分析会从海量数据中提取、挖掘对业务发 展有价值的、潜在的知识,找出趋势,为决策层的提供有力依据,为产品或服务发展方向起到积极作用,有力推动企业内部的科学化、信息化管理。

我们举两个通过数据分析获得成功的例子:

(1) Facebook广告与微博、SNS等网络社区的用户相联系,通过先进的数据挖掘与分析技术,为广告商提供更为精准定位的服务,该精准广告模式收到广大广 告商的热捧,根据市场调研机构eMarketer的数据,Facebook年营收额超过20亿美元,成为美国最大的在线显示广告提供商。

(2) Hitwise发布会上,亚太区负责人John举例说明: 亚马逊30%的销售是来自其系统自动的产品推荐,通过客户分类,测试统计,行为建模,投放优化四步,运营客户的行为数据带来竞争优势。

此外,还有好多好多,数据分析,在营销、金融、互联网等方面应用是非常广泛的:比如在营销领域,有数据库营销,精准营销,RFM分析,客户分群,销量预测等 等;在金融上预测股价及其波动,套利模型等等;在互联网电子商务上面,百度的精准广告,淘宝的数据魔方等等。类似成功的案例会越来越多,以至于数据分析师 也越来越受到重视。

然而,现实却是另一种情况。我们来看一个来自微博上的信息:在美国目前面临14万~19万具有数据分析和管理 能力的专业人员,以及150万具有理解和决策能力(基于对海量数据的研究)的管理人员和分析人员的人才短缺。而在中国,受过专业训练并有经验的数据分析人 才,未来三年,分析能力人才供需缺口将逐渐放大,高级分析人才难寻。也就是说,数据分析的需求在不断增长,然而合格的为企业做分析决策的数据分析师却寥寥 无几。好多人想做数据分析却不知道如何入手,要么不懂得如何清洗数据,直接把数据拿来就用;要么乱套模型,分析的头头是道,其实完全不是那么回事。按俗话 说就是:见过猪跑,没吃过猪肉。

 我的职业规划:

对于数据分析,有一句话说的非 常好:spss/sql之类的软件、决策树、时间序列之类的方法,这些仅仅就都是个工具而已,最重要的是对业务的把握。没有正确的业务理解,再牛的理论, 再牛的工具,都是白搭。做一名合格的数据分析师,除了对数据需要有良好的敏感性之外,对相关业务的背景的深入了解,对客户或业务部门的需求的清晰认识。根 据实际的业务发展情况识别哪些数据可用,哪些不适用,而不是孤立地在“真空环境”下进行分析。

为此,我对自己的规划如下:

第一步:掌握基本的数据分析知识(比如统计,概率,数据挖掘基础理论,运筹学等),掌握基本的数据分析软件(比如,VBA,Matlab,Spss,Sql 等等),掌握基本的商业经济常识(比如宏微观经济学,营销理论,投资基础知识,战略与风险管理等等)。这些基础知识,在学校里尽量的学习,而且我来到了和 君商学院,这样我可以在商业分析、经济分析上面领悟到一些东西,增强我的数据分析能力。

第二步:参与各种实习。研一开始我当时虽然有课,不 过很幸运的找到一份一周只需去一两天的兼职,内容是为三星做竞争对手分析,当然分析框架是leader给定了,我只是做整合资料和往ppt里填充的内容的 工作,不过通过兼职,我接触到了咨询行业,也向正式员工学习了很多商业分析、思考逻辑之类的东西。之后去西门子,做和VBA的事情,虽然做的事情与数据分 析无关,不过在公司经常用VBA做一些自动化处理工作,为自己的数据分析工具打好了基础。再之后去了易车,在那里兼职了一个多月,参与了大众汽车销量数据 短期预测的项目,一个小项目下来,数据分析的方法流程掌握了不少,也了解了企业是如何用一些时间序列模型去参与预测的,如何选取某个拟合曲线作为预测值。 现在,我来到新的地方实习,也非常幸运的参加了一个央企的码头堆场优化系统设计,其实也算数据分析的一种吧,通过码头的数据实施调度,通过码头的数据进行 决策,最后写成一个可操作的自动化系统。而这个项目,最重要的就是业务流程的把握,我也参与项目最初的需求调研,和制定工作任务说明书SOW,体会颇多。

第三步:第一份工作,预计3-5年。我估计会选择咨询公司或者IT公司吧,主要是做数据分析这块比较强的公司,比如Fico,埃森哲,高沃,瑞尼 尔,IBM,AC等等。通过第一份工作去把自己的知识打得扎实些,学会在实际中应用所学,学会数据分析的流程方法,让自己成长起来。

第四步:去自己喜欢的一个行业,深入了解这个行业,并讲数据分析应用到这个行业里。比如我可以去电子商务做数据分析师。我觉得我选择电子商务,是因为未来必将 是互联网的时代,电子商务必将取代传统商务,最显著的现象就是传统零售商老大沃尔玛正在受到亚马逊的挑战。此外,电子商务比传统的零售商具有更好的数据收 集和管理能力,可以更好的跟踪用户、挖掘潜在用户、挖掘潜在商品。

第五步:未知。我暂时没有想法,不过我希望我是在一直的进步。

总结:数据分析师的能力和目标:

能力:

1、一定要懂点战略、才能结合商业;

2、一定要漂亮的presentation、才能buying;

3、一定要有global view、才能打单;

4 一定要懂业务、才能结合市场;

5、一定要专几种工具、才能干活;

6、一定要学好、才能有效率;

7、一定要有强悍理论基础、才能入门;

8 一定要努力、 才能赚钱;最重要的:

9 一定要务实、才有reputation;

目标:

1-做过多少个项目?

2-业务背景有哪些,是否跨行业?

3-做过多少种类型的模型?做了多少个模型?

4-基于模型做过多少次完整的marketing闭环?

以上四个问题,足以秒杀95%以上的忽悠和菜鸟!

我仅以此为努力之坐标,时刻提醒自己。

路在前方,漫漫前行。

机器学习常见面试题整理

By:kubiCode

Source: http://kubicode.me/2015/08/16/Machine%20Learning/Common-Interview/

有监督学习和无监督学习的区别

  • 有监督学习:对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。(LR,SVM,BP,RF,GBRT)
  • 无监督学习:对未标记的样本进行训练学习,比发现这些样本中的结构知识。(KMeans,DL)

正则化

正则化是针对过拟合而提出的,以为在求解模型最优的是一般优化最小的经验风险,现在在该经验风险上加入 模型复杂度这一项(正则化项是模型参数向量的范数),并使用一个rate比率来权衡模型复杂度与以往经验风险的权重,如果模型复杂度越高,结构化的经验风 险会越大,现在的目标就变为了结构经验风险的最优化,可以防止模型训练过度复杂,有效的降低过拟合的风险。

奥卡姆剃刀原理,能够很好的解释已知数据并且十分简单才是最好的模型。

过拟合

如果一味的去提高训练数据的预测能力,所选模型的复杂度往往会很高,这种现象称为过拟合。所表现的就是模型训练时候的误差很小,但在测试的时候误差很大。

产生的原因

  1. 因为参数太多,会导致我们的模型复杂度上升,容易过拟合
  2. 权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征.

解决方法

  1. 交叉验证法
  2. 减少特征
  3. 正则化
  4. 权值衰减
  5. 验证数据

泛化能力

泛化能力是指模型对未知数据的预测能力

生成模型和判别模型

  1. 生成模型:由数据学习联合概率分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。(朴素贝叶斯)
    生成模型可以还原联合概率分布p(X,Y),并且有较快的学习收敛速度,还可以用于隐变量的学习
  2. 判别模型:由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。(k近邻、决策树)
    直接面对预测,往往准确率较高,直接对数据在各种程度上的抽象,所以可以简化模型

线性分类器与非线性分类器的区别以及优劣

如果模型是参数的线性函数,并且存在线性分类面,那么就是线性分类器,否则不是。
常见的线性分类器有:LR,贝叶斯分类,单层感知机、线性回归
常见的非线性分类器:决策树、RF、GBDT、多层感知机

SVM两种都有(看线性核还是高斯核)

  • 线性分类器速度快、编程方便,但是可能拟合效果不会很好
  • 非线性分类器编程复杂,但是效果拟合能力强

特征比数据量还大时,选择什么样的分类器?

线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分

对于维度很高的特征,你是选择线性还是非线性分类器?

理由同上

对于维度极低的特征,你是选择线性还是非线性分类器?

非线性分类器,因为低维空间可能很多特征都跑到一起了,导致线性不可分

ill-condition病态问题

训练完的模型测试样本稍作修改就会得到差别很大的结果,就是病态问题(这简直是不能用啊)

L1和L2正则的区别,如何选择L1和L2正则

他们都是可以防止过拟合,降低模型复杂度

  • L1是在loss function后面加上 模型参数的1范数(也就是|xi|)
  • L2是在loss function后面加上 模型参数的2范数(也就是sigma(xi^2)),注意L2范数的定义是sqrt(sigma(xi^2)),在正则项上没有添加sqrt根号是为了更加容易优化
  • L1 会产生稀疏的特征
  • L2 会产生更多地特征但是都会接近于0

L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。L1在特征选择时候非常有用,而L2就只是一种规则化而已。

特征向量的归一化方法

  1. 线性函数转换,表达式如下:y=(x-MinValue)/(MaxValue-MinValue)
  2. 对数函数转换,表达式如下:y=log10 (x)
  3. 反余切函数转换 ,表达式如下:y=arctan(x)*2/PI
  4. 减去均值,乘以方差:y=(x-means)/ variance

特征向量的异常值处理

  1. 用均值或者其他统计量代替

越小的参数说明模型越简单

过拟合的,拟合会经过曲面的每个点,也就是说在较小的区间里面可能会有较大的曲率,这里的导数就是很大,线性模型里面的权值就是导数,所以越小的参数说明模型越简单。

追加:这个其实可以看VC维相关的东西感觉更加合适

svm中rbf核函数与高斯和函数的比较

高斯核函数好像是RBF核的一种

KMeans初始类簇中心点的选取

选择批次距离尽可能远的K个点

首先随机选取一个点作为初始点,然后选择距离与该点最远的那个点作为中心点,再选择距离与前两个点最远的店作为第三个中心店,以此类推,直至选取大k个

选用层次聚类或者Canopy算法进行初始聚类

ROC、AUC

ROC和AUC通常是用来评价一个二值分类器的好坏

ROC曲线

曲线坐标上:

  • X轴是FPR(表示假阳率-预测结果为positive,但是实际结果为negitive,FP/(N))
  • Y轴式TPR(表示真阳率-预测结果为positive,而且的确真实结果也为positive的,TP/P)

那么平面的上点(X,Y):

  • (0,1)表示所有的positive的样本都预测出来了,分类效果最好
  • (0,0)表示预测的结果全部为negitive
  • (1,0)表示预测的错过全部分错了,分类效果最差
  • (1,1)表示预测的结果全部为positive

    针对落在x=y上点,表示是采用随机猜测出来的结果

ROC曲线建立
一般默认预测完成之后会有一个概率输出p,这个概率越高,表示它对positive的概率越大。
现在假设我们有一个 threshold,如果p>threshold,那么该预测结果为positive,否则为negitive,按照这个思路,我们多设置几个 threshold,那么我们就可以得到多组positive和negitive的结果了,也就是我们可以得到多组FPR和TPR值了
将这些(FPR,TPR)点投射到坐标上再用线连接起来就是ROC曲线了

当threshold取1和0时,分别得到的就是(0,0)和(1,1)这两个点。(threshold=1,预测的样本全部为负样本,threshold=0,预测的样本全部为正样本)

AUC

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积不会大于1(一般情况下ROC会在x=y的上方,所以0.5<AUC<1).

AUC越大说明分类效果越好

为什么要使用ROC和AUC

因为当测试集中的正负样本发生变化时,ROC曲线能基本保持不变,但是precision和recall可能就会有较大的波动。
http://www.douban.com/note/284051363/?type=like

测试集和训练集的区别

训练集用于建立模型,测试集评估模型的预测等能力

优化Kmeans

使用kd树或者ball tree(这个树不懂)
将所有的观测实例构建成一颗kd树,之前每个聚类中心都是需要和每个观测点做依次距离计算,现在这些聚类中心根据kd树只需要计算附近的一个局部区域即可

数据挖掘和机器学习的区别

机器学习是数据挖掘的一个重要工具,但是数据挖掘不仅仅只有机器学习这一类方法,还有其他很多非机器学习的方法,比如图挖掘,频繁项挖掘等。感觉数据挖掘是从目的而言的,但是机器学习是从方法而言的。

备注

题目主要来源于网络,答案主要来源于网络或者《统计学习方法》,还有自己一小部分的总结,如果错误之处敬请指出
如果想要了解关于常见模型的东东可以看这篇机器学习常见算法个人总结(面试用)文章

startup web developer

startup现招web developer,要求:

1.有extensive worldpress experience并且能非常熟练运用;

2.如果有subscription web的经历会非常好,否则需要十分了解这一块的网页开发并且很有兴趣边学边做;

3.design experiences/skills a plus;

4.entrepreneurial mind
这个职位是兼职flexible hours,远程操作,直接和CEO沟通。符合要求并有意者请发简历到tianzhe31@gmail.com
邮件主题请注明web developer

科学表明女性更适合当程序员:男码农情何以堪

文章来源:煎蛋

美国的研究人员分析了开源项目共享服务Github里约140万用户的资料。他们发现女性提出的请求代码合并通过率比男性更高。该研究正在等待同行评议。这意味着这一结果尚有待其他专家点评。

这些来自加州州立理工大学和北卡罗莱纳州立大学的研究人员们,从2015年4月1日登入Github中的400万名用户中抽取了140万名用户。Github是一个庞大的开发者社区,并不要求其1200万用户填写性别信息。

不过该团队依旧能够辨别他们抽取的这140万人的性别,因为用户资料或者他们的邮箱地址都能透露蛛丝马迹。研究人员们也承认这有隐私风险,因此他们并不打算公布原始数据。

该团队发现女性提出的请求代码合并接受率为78.6%,而男性提出来的仅74.6%。研究人员们考虑了各种因素,比如女知道某些问题的可能性是否更高,她们贡献的代码更短或者她们做的任务更容易以及她们使用的编程语言等等,但研究人员没有找到相关联系。

然而那些在Github社区里并不出名的人中,性别资料显示自己是女性的人提出的请求代码合并通过率比那些性别不明显的人低得多。

性别偏见

从局外人的角度来看,我们看到了性别偏见的痕迹:当女性的性别资料中立的时候,她们提出的请求代码合并通过率为71.8%,可一旦她们表明自己是女性,她们的通过率立刻降至62.5%。男性的通过率也有相似的下降,但并没有这么明显。

总体来看女性提出的请求代码合并通过率比男性更高,可当她们成为外来者且她们的性别可被鉴定出来的时候,她们的通过率比男性低。研究人员们总结道:“我们的结果表明虽然Github里的女性总体来说更能干,但她们还是会遇到性别偏见。”

虽然有各种高调的倡议,但科技公司依旧面临着员工多样性的问题(从性别和种族这方面来看)。根据2015年的数据,脸书的技术人员里仅16%为女性,谷歌仅18%。

计算机科学家Sue Black OBE博士表示,即便如此这一结果依旧令人鼓舞。她说:“我认为这些表明女性对编程的兴趣在复苏,在接下来的几年时间里,女性也会慢慢对其它与技术相关的 职业感兴趣。知道女性擅长编程,会让更多女性进入科技领域工作。最开始提出软件概念的Ada Lovelace也是一名女性,知道这一点才能更好地鼓励并支持女性进入软件行业。”

如何从菜鸟程序员成长为高手

2016-02-24 蛋疼的axb ACSE
关注上方“ACSE”来及时了解中国理工科留学生联盟的最新动态以及新鲜科技好文章
小编有话说
从今天开始ACSE公众号每天会更新一篇科技相关的精选好文章来帮助大家了解科技前沿以及提高自己的技术水平。
今天这篇文章是由大神级别程序员总结的学习方法,值得收藏起来每周看一遍,只要照着一一做到,总有一天能够成为高手。
1.摘要
最近有一些毕业不久的同事问我:“你工作的时候有没有什么窍门?怎么才能快速成为高手?”
想起当初刚入职,新人培训的时候,也跟其他同事讨论过这个问题:如何才能成为业界大牛?当时自己只是觉得兴趣是最好的老师,思路方法什么的没有多想。
加 入微博平台架构部的时间也不短了,趁着快过春节总结了一下自己入职微博以来的工作情况,从互联网开发的半个门外汉,到如今能设计一些架构、排查一些问题、 分享一些经验,收获颇多,感想颇多,也逐渐意识到思路和方法的重要性,在此跟大家分享一下。主要分为学、做、想三方面。
2.学会学习
学习无疑是程序员最为重要的素质之一,尤其是互联网这种日新月异的行业,把学习当做工作的一大半也不为过。
2.1.自主学习
最近发现身边的人并不是不想学习,只是每天都在纠结自己到底学什么好:简单的没挑战,复杂的看不懂;旧技术怕过时,新技术没方向…… 
讲 讲自己毕业后的经历,毕业之后去了个不大不小的公司,工作主要是做一些XX管理系统之类的东西,没什么挑战,也用不上什么技术,基本上前端用个extjs 后面套个sql server就解决了。工作稳定了几年,业余时间除了wow没别的事情做,觉得这么闲下去不是办法,于是之后一年的时间里,用上班摸鱼和下班休息的时间学 了这些东西:
1. 闲着无聊想做个小游戏,发现游戏相关的书大多是英文的,看不懂,一咬牙翻译了《Real-time rending 3rd》的前几章,刚开始前言都看不懂,只能一个词一个词的翻字典,一句话要琢磨几个钟头到底作者说的到底是什么意思。翻译了几百页英文书之后,发现自己 看英文书没什么障碍了,于是开始每天用休息和摸鱼的时间看书。
2. 看完游戏引擎的书之后,把irrlicht引擎的代码看了一遍,然后自己山寨了一个3d渲染的场景管理器,还有个朴素的渲染引擎。
给自己的游戏引擎写了个基于脚本语言的解释器,为此看了不少编译原理和虚拟机的书,了解了程序究竟是什么东西,这是我觉得收益很大的一件事情。
3. 看编译原理的书的时候发现操作系统的知识有些欠缺,又去看了linux内核相关的书。之后买了个开发板天天修改内核玩,毕业以后又一次了解了内核的cpu 调度、内存管理和文件系统,了解了应用是怎么跑在操作系统上,操作系统又是怎么运行在硬件上的,这也是收益很大的一件事情。
4. 看完操作系统又顺着看网络相关的书,之后把lighthttpd的代码看了一遍,用c写了个linux下的http服务器,把几种网络编程模型挨个实现了一遍。
5. 实现http服务器的过程中觉得自己编码能力还是有欠缺,把代码大全翻了一遍,顺着又去看了设计模式的书,并且用自己的理解把每个模式用文字重新描述了一遍。
6. 中间还看了很多语言和框架相关的书,就不一一列举了。可以参考这里。
我把学习的方向分为三类:
1. 为了工作,满足当前工作所必备的知识
2. 为了提升,与当前工作相关的知识(深度)
3. 拓展视野,与当前工作无关的知识(广度)
学习(1)之后只是个熟练工,2和3才是提升自己的途径,伴随着知识储备的提升,接触新事物时更容易找到相似的知识加以类比,加快理解,也更容易掌握本质。如果每天都在纠结“到底学什么”,那么只能说明还是学的太少了。(真正没什么可学的大牛们应该不会读到这里吧……)
所 以,如果觉着没什么东西可以学的时候,那么可以考虑一下学一下更有深度的知识(比如虚拟机或编译器),或者完全不同的知识(新的语言或当前比较火的方 向),甚至完全不相干的知识(单纯练习英文阅读,学习ppt排版之类)吧。随着知识储备增加,自己的不足和未来的学习的方向也会更加明确起来。
2.2.向历史学习
以微博为例,在微博发展的过程中经历了不少波折,并逐渐衍生出了目前的系统架构。很多新人最喜欢问的问题便是“现在线上是怎么做的?”
这 个问题不错,但是还不够好。在程序员的世界里罕有能解决所有问题的“银弹”,当前的做法用不了多久也会被替换掉,如果想了解一件事情,那么就多关注一下 “它是怎么变成今天这样的”吧。学会用发展的眼光看问题,了解一些经历过的经验教训,收获会比单纯学会一件什么事情多的多。
那么,如何向历史学习?
1. 公司内部的资料库、wiki等大都会有旧时的资料,刚入职时大多不会太忙,这些资料库简直是挖不完的宝藏
2. 部门内部分享,比如我当初入职时经常去听“微博XXXX架构演化历程”之类的内部分享
多问一下自己”它为什么不那么设计“
3. 老员工忆苦思甜吹牛逼的时候多奉承几句_(:з」 ∠)_
2.3.向他人学习
这里有两个极端,
1. 有的人喜欢自己闷头捣鼓,什么也不问,这必然是不利于自己提高的;
2. 也有人碰到问题就问,这也有问题,浪费他人时间不说,更关键的是说明这人向他人学习的思路错了,要学习他人的并不是具体某个知识(要学知识看书就能解决了),而是学习别人的思维方式。
但是思维方式这种东西很难通过交流的方式学到,后来我发现有个很简单的学习方式:口头禅。举几个例子,大家体会一下:
“这个其实是两个问题”
“有没有更好的方案”
“能不能举个例子”
“能不能给个一句话总结”
除了口头禅,很多牛人都会有非常鲜明的思维方式和处事原则,如果有幸与业界的大牛共事,那么恭喜你,只要多交流、多观察、多思考,那么提升速度会提升好几个数量级。
3.多做有意义的事情
有的人每天时间浪费在跟问题本身无关的事情上,比如我要设计架构的时候还要考虑架构图怎么画,写完代码还要反复部署测试好几轮才pass,查bug的时候把时间浪费在扫日志上。人的精力总是有限的,把时间浪费在这些事情上面,让自己提高的时间就变得少了。
3.1.练习,更多的练习
这里有个误区:“做有意义的事情”不等于“只做自己没做过的事情”。
对于程序员来说,写代码是基本功中的基本功,编码的规范、设计的权衡、甚至顺手的IDE快捷键都要靠平日的试错和积累,很难通过几本书或者几天培训领悟到。
曾 经目睹一些人写代码一年之后开始做一些小项目的设计,然后就迫不及待的把重心全都转移到设计甚至架构上,这种没有基础能力支撑做出的设计和架构最多只能算 是高级意淫,大多没等落地就荒废了,意义不大。究其原因,大多是设计出来的东西“不好做”或者“不好用”,就像是只看过一遍课本就去参加高数考试,现实 吗?(学霸们我错了……)
举 个例子,几年前在看设计模式的过程中,用qt做了个看漫画的应用,把能用的模式都试了一遍,当然有很多用的不合适的地方,正是这些不合适的地方让我对面向 对象编程和设计模式的思考深入了很多,如何权衡灵活性和复杂性也有了新的认识。之后在设计很多系统的时候少走了很多弯路,既保证了时间点又保证了质量。如 果当时指望着“用的时候再说”,大概已经被项目坑的不能自理了。
3.2.善用工具
工具能解决的事情就用工具去解决,好的工具能节约大把的时间用在更有意义的事情上。
工具的范畴很广,比如linux的各种命令、比如团队内部的各种系统、比如顺手的应用、甚至包括上下班骑的自行车。只要能节约时间、提高效率,那就值得一试。
在这里我列举几个大幅度提升了我的效率的东西:
1. 双屏显示器
2. 顺手的键盘
3. google(不是baidu!不是bing!)
4. mac
5. mac上的应用:idea、alfread、omnifocus、甚至synergy和istats menus之类跟开发本身关系不大的应用。
我更倾向于把“使用工具”作为一种生活态度:是否希望让自己的生活专注于有意义的事情。如果你认同这个观点,那么想一想投入和回报比例,还是很可观的。
(当然,为了不花钱而自己破解应用的大神也是极叼的……)
3.3.提高时间的利用率
时间是所有期待提升自己的人最宝贵的资源,效率再高,没时间做也没意义。
网上有个流传挺广的图:打扰程序员的成本。事实上我每天的工作时间非常碎片化,来到公司之后可能不断的接电话、被问问题、被拉去开会、回复邮件等等;也经常会有时间不够用或者没事做的困惑,这里分享一下心得:
1. GTD可以整合很多碎片时间。除了把事做完之外,把上下文相关的事情集中在一起完成也很有帮助。比如把几件想去其他办公室做的事情整合成一趟完成。
2. 减少无意义的时间浪费,比如家住在公司边上可以每天节省几个小时的时间用来学习或者做别的事情。(但如果节省下来的时间用来刷微博,那就没有必要了。)
另外一个很有趣的现象:一个软件的注册费就10几刀,贵些的几百刀,把日常用到的所有工具的费用全加起来都顶不上一个肾6贵,但是很多人还是坚持着没有破解不用的观念,为了几百块钱浪费了大把时间。
3. 加班可以创造很多时间,并且能有效减少被打扰的几率,但是也会给身体和精神带来很大负担。因此加班做的事情必须能对个人进步产生足够多的收益。如果加班只是用来处理无意义的工作的话,那应该是日常工作出了什么问题。
4. 事情可以分成紧急重要、紧急不重要、重要不紧急、不重要不紧急四类,在todo列表里随时要有重要不紧急的事情。
4.学会思考
4.1.深究
当有什么问题解决不了的时候,很多人会有畏难或者拖延的情绪,典型口头禅就是“就这么凑合着用吧”或者“先这样吧,以后有时间再研究”,说这些话的人大多并不是真的那么忙,甚至有人一边刷着微博一边跟我说没时间研究……(你tm在逗我?)
要克服畏难情绪其实很简单,找一个具体的似懂非懂的问题,想尽办法把问题研究清楚,体会几次解决问题时的愉悦感,建立自信。
大部分问题其实没有什么高深的科学原理,甚至只要翻几页书就解决了,但是遇到问题不深究,久而久之会形成自我暗示:这些问题是我懂的,那些是我不懂的,自己反而把自己进步的路给堵上了。
说到如何深究,也有几条心得:
1. 遇事多想为什么,并且要反复问为什么。很多貌似理解了的问题过一阵再重新想想,往往会发现之前还有没考虑到的地方
2. 问题要有明确答案,哲学之类的就别纠结了
3. 查找资料时选权威的书籍或者网站,避免被误导
4. 找人讨论,或者直接拉小伙伴入伙,既可以互相交流,又可以互相监督
5. 分享你的成果
6. 不要所有事情全都深究,会给自己太多压力
4.2.多说,多写,多交流
平常工作中有一个感受,有交流和写作习惯的人思路会更清晰一些,能接触到的观点也会多一些。这方面其实属于我的弱项,大概总结几个观点。
1. 隔一段时间最好能书面形式总结一下最近的工作,比如说写个心得感悟,或者持续更新自己的简历
2. 写作的时候有两个难点:对要说明的事情做总结和抽象,形成观点统一、调理清晰的主线;从对方的视角考虑,把事情说明白,避免自言自语。
3. 找人讨论之前自己先要有个基本完整的思路,否则大部分的时间都要耗在解释原理之类的上网查反而更快的事情上。
4. 讨论之后要有一句话就能说明白的结论和描述清晰的时间点。
5. 有些人喜欢纠结于“这个不是我的问题,为什么要我处理”之类的事情。在我看来这是很好的机会。既能增长见识,又能展示水平,还能留个认真负责的好名声,何乐而不为呢。
5.最后
最后分享一下关于我理解的程序员的自我修养,在我看来,可以总结为:负责任,重名声。
负责任,说的更具体些:写的代码自己有没有测过、做的框架自己有没有用过、设计的架构自己有没有认真权衡过。
重名声,说的直接些:没有测过的代码、没有用过的框架、没有权衡过的方案有没有脸交付给别人。
与各位共勉。
作者:蛋疼的axb

原网址:http://blog.2baxb.me/archives/1077
中国理工科留学生联盟(ACSE)
致力于推动留美各校理工科留学生间的相互交流以及资源共享和对接

程序员,你的安全感呢?

作者:杨栋

链接:http://www.cnblogs.com/yangdong/p/5190818.html

同病相连

最近跟一位同事谈心,他非常热爱技术,是一个不折不扣的极客,不仅如此他有很强的执行力,并能持之以恒,从他的身上我看到了未来几年将会成长起来的一个技术牛人。但是,他有比较严重的焦虑症,比如:几天没有看书就会非常纠结,通常情况是他需要花时间来陪孩子和家人,他会感觉自己浪费了宝贵时间,精力无法集中在当前所做的事情上。我接触的同事中,越是对技术有追求,好像越是有这样的感觉,算起来这种不安的感觉应该属于特定程序员群组中一种典型现象,其实做为导师的我也是常年被这种感觉所困扰。 他是这么描述自己的:

我已经工作4年了,但是我在数据库底层,HTTP协议,并发,分布式系统都没有深入地理解,我觉得特别害怕。

不用讨论工作4年的程序员应该有什么样的表现,掌握多上技术,深度如何,视野是否开阔,我们来看看别人眼中的他吧:

  • 对技术极度有热情
  • 学东西非常快,几周时间就搞定了Ansible, Chef, Puppet
  • 阅读非常广,除了技术之外,涉足项目管理,金融,心里,社会等

看看他的书单(我截取了其中1/4的一年要读完的书单,实际上他读完的书比计划要多),也会对他有更深刻的认识:

  • 像外行一样思考,像专家一样实践:科研成功之道(修订版)
  • 古今数学思想(新版·典藏本)(套装全3册)(第1~3册)
  • 思考,快与慢
  • 数据化管理:洞悉零售及电子商务运营
  • 探索复杂性
  • 日志管理与分析权威指南

心理学上的安全感

安全感是心理学研究中的重要概念之一,最早见于弗洛伊德精神分析的理论研究。虽然国内外对此做过诸多研究,然而对于“安全感”至今尚未达成共识,以下列举了一些关于安全感的定义:

  • 弗洛伊德认为当个体所受到的刺激超过了本身控制和释放能量的界限时,个体就会产生不安全感。换句话说,在弗洛伊德的精神分析理论中,冲突、焦虑、防御机制等是由个人幼年、成年阶段某种欲望的控制与满足方面缺乏安全感造成的。
  • 人本主义心理学家马斯洛最早对安全感作出了明确界定,指出“安全感”是一种从恐惧、焦虑中脱离出来的信心、安全和自由的感觉,特别是满足一个人现在和未来各种需要的感觉。
  • 安莉娟等对精神分析理论、人本主义心理学理论中的安全感理论进行总结,提出安全感的定义为:安全感是对可能出现的对身体或心理的危险或风险的预感,以及个体在应对处置时的有力无力感,主要表现为确定感和可控制感。

从以上的定义我们大致能够看出安全感大致有两大要素:负面的外部刺激,正面的内在能量。简单来说当内部能量能够抵消负面的外部刺激,人是有安全感,因为我的“能量结界”没有消散,反之则没有安全感,没有人会在“能量结界”被打穿之后还怡然自得。那么这个“能量结界”的大小就是所谓的舒适区域了,如果用绿色表示很安全的话,那么舒适区域应该是中心是深绿色周边是浅绿色的圆。理所当然,随着它的范围的增大,个人的舒适区域也就不断的增大。

为什么会焦虑

人为什么会焦虑,当某一件能够刺激内心产生负面影响的事情发生时,人们就有可能会产生焦虑的情绪。这是一种缺乏安全感的情绪和典型表现。在学生时代,我们会因为惧怕考试失败而焦虑;在职场上,我们会因为无法完成某项工作而焦虑;在孩子的教育过程中,我们会因为担心无法找到合适的学校而焦虑;在人到中年时,我们为因为身体的退步而焦虑。因为我们无法确定能否处理这种情形。因此对于一些场景,我们到会显得十分从容,“开卷考试,有书在手心中无忧”,“跟自己的下属沟通绩效问题,轻车熟路”,“住在一个教育资源较为发达的地区,孩子的教育问题就显得不那么明显”,“每天花半小时来做慢跑,非常显著的改善身体状况”。

奇普•康利(Chip Conley)在他的《如何控制自己的情绪》很好的阐释了为什么会焦虑:

焦虑 = 不确定性 * 无力感

在讲述如何控制焦虑者众情绪时,他分享了一段TED上的经历:

TED曾要求我谈谈幸福的无形资产,以及商界和政界领导人应如何开始学习衡量和重视人生最有意义的东西。这似乎是一个无情的讽刺,我的任务是登上讲坛,以一个专家的身份,探讨一个那时连我自己都觉得难以捉摸的主题。尽管我在《巅峰》一书中宣称要以自我实践的方法来经商,但我已经失去了那种神奇的感染力。“我陷入了觉得自己无用的思维定式,而能够克服这一挑战的唯一办法就是写下有关我人生经历的演讲词并练习无数遍。我以为追求完美是缓解焦虑的良药。你也许有过类似的遭遇,认为设定目标会让自己舒服。但事实是,追求完美只会放大焦虑。在接下来的几个月里,我一直痛苦地写着一份以幸福为主题的演讲词,这一次和我正常准备演讲的经历完全不同。我的风格是倾向于即兴发挥和贴近听众,而非机械式和反复演练。于是越临近TED大会,我就变得越焦虑。我的演讲被安排在会议的最后一天(就在电影导演詹姆斯·卡梅隆之前)。所以当我抵达会场时,我还有5天痛苦难熬的日子,要在聆听其他演讲者发言中度过,这使我越发焦虑。”

因此,越是不确定或者超出自己能力的事情,焦虑的情绪就越容易产生,而越是这样,从这种焦虑情绪正挣脱的信心就越低,不安全的感觉就越强。

哪样的程序员更有安全感

每个人都有一个自己的舒适区域,结合内部舒适区域和外部期待,下图能说明一些问题:

根据上图所示,具有安全感的程序员一般长这样:

跃跃欲试,接受挑战, 扩展自己的舒适区。我们的身边总是不乏这样的人,他们跃跃欲试,脸上总是挂着自信的笑容,总是各种场合中的焦点,从来不满足现状,每每有新挑战时,总会看到他们的身影。 如果用动态的眼光来看待他们的话,我们会发现他们的舒适区域始终处于一个动态的过程——始终在扩张之中,或者说他们在不断GET新技能。随着舒适区域的扩张,个人追求不断实现,而个人追求的实现,又带动其自身的扩张,还有什么比实现自己目标多带来的自信和成就感更足呢。等待的,将是社会期待的增加,也就是你的同事,领导对你有了认可,并提升了他们对你的期待,随之而来的将是更有挑战的工作,又一个扩展自己舒适区域或者GET新技能的机会便发生了。

快速学习, 迅速减小社会期望和舒适区的差别。程序员的一个非常厉(ku)害(bi)的技能就是学习能力。除去被逼迫的成分外,这是一个非常实用,堪称看家本领之一。因为IT行业技术迭代速度之快令人发指,当某一项技术还没有熟悉的时候,关于该技术的缺陷以及改进方案已经吵的很热了;当你刚刚为掌握某个软件开发实践而洋洋得意时,突如其来的xxx已死之说,真是让你死的心都有了。其中的例子数不胜数,我们不妨看看(一个例子说明)。ThoughtWorks对员工有这么一个要求,每年至少学习一门编程语言,其实真是不多,实际上每年学习的都要远远多于要求。因此,强悍的快速学习能力,能够快速武装自己,胜任新的工作,提神核心竞争力,迅速扩大舒适区同时减小社会期望与其的差别。当然,并非所有新技术都值得学习,但是有两点值得提出:1. 新技术的思想能够扩展自己的视野,拓宽自己的思路;2.新技术的获取,能够大大提升自己的学习能力,你会越学越快,这个加速度会一直保持到你的大脑达到生理水平的巅峰。

很强的执行力, 减小不确定性. 它的反义词大概是“拖延症”,俗称懒病。某百科上给出了这样的解释:

严重的拖延症会对个体的身心健康带来消极影响,如出现强烈的自责情绪、负罪感,不断的自我否定、贬低,并伴有焦虑症、抑郁症等心理疾病,一旦出现这种状态,需要引起重视。

看到这里,相信很多人都中招了吧。无限的拖延,无法正面改变即将发生的事情,但是它却能极大的增加事情的不确定性,并且随着事情的临近,这种不确定性在内心中的焦虑反应呈指数级增长,反过来,这种情绪又反哺拖延,除非有强大的外部力量介入,强行打破这种负能量闭环。说的这么高端,有没有实际的例子呢。不仅有,而且非常多,很多人大概都有这样的经历吧,在年终总结的截止日期的前一天晚上,奋笔疾书加班加点的写总结,又或者在做演讲的前一天晚上,开始写PPT。

获取安全感

Rule #1: 学习那些自信满满地程序员们

当然也需要甄别一下啦,有的人可能只是看起来很自信。不过上面提到的三个特征应该是妥妥的能够提升你的安全感的办法。其实我在写这条建议是,很是纠结。纠结在哪呢?我觉得内心没有安全感的程序员极度“肤浅”的分成两类:懒和其他。据非常不负责任统计(看看周围的人),其实很多时候还是因为懒,如果是真的懒,那就没救了。

Rule #2: 通过焦虑情绪公式来提升安全感

发动数学天赋,当某人或事情让人感到焦虑时,这两件事情能够帮忙:

制作一张平衡表列出你知道的和你能影响的,它可以帮助你消除不确定性,去掉你对不知道的事情的神秘感,明确你所面临的是什么。因为焦虑只会潜藏在黑暗中,人们对不了解的事物有一种天然的恐惧,就好比美味的螃蟹在一开始的时候并不是每个人都敢吃的。然而黑暗中的不明事物也有可能真的是你所恐惧的事物也说不定,但这又有什么关系呢!当你知道原来在黑暗之中潜藏了一个恐怖猎人——霸王龙,你的对手已经清晰了,接下来要考虑的是你是否有能力对付的了它。你的焦虑情绪现在全部由无力感组成了。

当你把所有的相关因素归类到这四个象限后,也就意味着能够帮助你消除的计划产生了:你不需要对不能影响的事情做出任何反应,因为只是徒劳而已;你需要做两件事情,弄清楚那些不知道的因素,做一些能够对解决当前问题产生正面影响的行动。

想想最极端的结果,降低无力感,如果最快的结果也是能够承受的,那还有什么是输不起的呢,更何况通常最坏的结果都不是最坏的,最坏的是由最坏的结果所引发的内心恐惧,焦虑和不安的负面情绪。当然每个人的无力感是不同的,因为每个人的舒适区域是不同的,舒适区域越大,无力感想对会越小。这很好理解,因为从概率的角度来讲,你能处理的问题范围,把握度会随着舒适区域的增大而增强。但直面极端结果是一个普适的方法。一方面,往往当最坏的事情发生时,你却释然了,反而一身轻松,能够坦然面对。这正是该公式所表达的核心思想之一,当结果发生时,不确定性为0,焦虑的情绪得到了释放,你当然会前所未有的轻松,这也是为什么人们到了让TA抓狂的事情发生时,却能坦然处之,临危不乱。另一方面,想想最极端的结果,有助于你评估失败的代价,很多时候人都是被自己或者他人吓怕了,一旦评估的结果并没有那么不可接受,自然也就没有必要战战兢兢的过着了。

Rule #3: 匹配外部期待和个人能力

左图是一张耶基斯-多德森定律图,其中包含三个要素:效率,动机和任务难易程度。在一般情况下,动机愈强烈,工作积极性愈高,潜能发挥的愈好,取得的效率也愈大;与此相反,动机的强度愈低,效率也愈差。因此,工作效率是随着动机的增强而提高的。然而,心理学家耶基斯和多德森的研究证实,动机强度与工作效率之间并不是线性关系,而是倒U形的曲线关系。具体体现在:动机处于适宜强度时,工作效率最佳;动机强度过低时,缺乏参与活动的积极性,工作效率不可能提高;动机强度超过顶峰时,工作效率会随强度增加而不断下降,因为过强的动机使个体处于过度焦虑和紧张的心理状态,干扰记忆、思维等心理过程的正常活动。

因此,你需要做的是让别人更好的了解自己,如果你觉得自己很厉害但是确没能让别人知晓,那么别人对你的期待就会低于你的预期,你将要做的工作的难度也不太可能匹配你所掌握的技能,当然面对这样的工作,估计大部分人也没有新鲜,激动,亢奋,大鸡血的感觉吧。另外一方面,如果你给别人的感觉是很牛X,结果有可能让你面临超出自己技能很多的任务,这会增加你的焦虑,降低你的效率,影响个人的名声。

Rule #4: 焦虑,焦虑着也就没那么焦虑了。

说了这么多,感觉焦虑是一种要完全消灭,即便不能消灭也叫尽量避免的情绪,但凡事没有绝对,完全没有焦虑这种情绪也是不可取的,程序员需要适时地扩大自己的舒适区,而且焦虑也有它正能量的一面。

走出舒适区会增加人的焦虑程度,从而产生应激反应,其结果是提升对工作的专注程度。在这个区域中被称作最佳表现区——在这个区域之中,人的工作表现将会得到改善,并且他们的技巧也会被优化。但是罗伯特 耶基斯(1907)的报告中提到“焦虑可以改善工作表现,但是当超过某一最佳激励状态之后,工作表现就开始恶化”,如果一个人离开最佳表现区,他将进入一个危险区,在危险区中焦虑程度的上升或者舒适程度下降会带来工作表现的快速恶化。

所以在绩效管理之中管理者,或者是教练应该让人进入最佳表现区,并且维持一段足够的时间,从而达到更好的工作表现,提升他们的技巧,并且将这些表现和技巧固定下来。同样的道理,在目标设定之中改变焦虑的程度就会改变工作表现。

一个程序员的顿悟:这6点带来的差距真的不是一点点

来自:建造者说
链接:
http://guoze.me/2015/03/02/excellent-programmer/
作者:微博:@GavinBuildSomething

我算是靠坑蒙拐骗进了程序员的门,然后一路狂奔。26岁之前几乎没有任何写代码的经验,研究生毕业却意外选择了一家不可能提供培训的初创公司,在每日担忧公司倒闭、害怕被炒鱿鱼以及同事冷落白眼的三重压力下逆流而上,一年半后离职,已是拥有500万用户产品的后台主程。从前我对计算机技术心怀畏惧,认定技术高人一定有佛光笼罩,昼夜不息运键如飞日吐代码上万行。现在也算见过一些世面了,回首那段忐忑不安宛如初夜的过程,我却不发觉有任何的励志意味,而是视为一种理所当然。理想的程序员,和理想的建筑师、理想的财务师、理想的按摩师没有任何的差别,他们本质上都是一群手艺人。我相信理想的程序员人人皆可成为。

近三年总在互联网圈厮混,我认识过一些程序员,共事过一些程序员,领导过一些程序员,又面试过一些程序员。他们学历不同,有的来自北大,有的来自培训机构,有的是博士,有的是高中肄业;资历也不同,有的来自BAT,有的来自某破产基金公司(还是一个销售);年限也从 0 到 15年不等。但我认为程序员只需分三类:天才的程序员、理想的程序员、平庸的程序员。天才的程序员我只敢说接触过 3 个,这是天命。7分由你是颗精子的时候就已决定,拥有绝佳的数学天赋、冷静致密的逻辑、为解决难题宁愿不眠不休而深以为乐的技术热情;3分来自起步要早早早,恨不得同龄人玩泥巴的时候就得开始玩电脑,大学毕业前就突破一万小时法则,后面的已是游戏人生。

天才的程序员可遇不可求,更不能长有,我看到的90%仍是平庸的程序员。IT时代的膨胀,已让程序员如同文艺复兴时的印刷匠一样的普通,多数投入祖师爷门下的人,仅是为了更大的饭碗,更高的待遇,更好的生计。平庸的程序员编写腐烂的代码,没有规范和一致性,固守旧世界的语言,还好谈论大的架构和性能,说的比做的漂亮。而毫无例外的,他们认定技术没有出路,做产品、营销和管理的是更高大上的手艺,而他们当中的99%,又会自然的流露出自己恰巧具备了那方面的天赋,至于进程为什么会崩溃这样的小问题是不屑于去了解的。

而我最喜欢和理想的程序员相处,恨不得与他们同吃同住,如果允许,我希望我的队伍能插满他们的旗帜。理想的程序员心眼儿不坏(他们从来都不是办公室政治的宠儿,是一群单纯明亮快乐的手艺人),有天真烂漫的好奇心(他们的眼睛里经常闪着 「哇,这个是怎么做到的!」),永远精益求精(他们的口头禅是「我再研究一下」),还乐于分享(他们活跃于GitHub、各大问答社区和你的身边,舍得将 宝贵时间用于帮助新手)。是的,他们不需要被管理,只需要给一个大的方向,总能回报以意想不到的结果。

理想的程序员与平庸的程序员只有一墙之隔。两者的差距只有 6个一点点,而人与人的差距,正是在这日积月累的一点点中,被永远拉开了。有意思的是,我发现这 6个一点点都和意识有关,也就是程序员和其他一切新兴产业的工种一样,只需要意识加上时间的锤炼,人人皆可达到理想的阶段。理想的程序员必然也是一个优秀的problem-solver。

第1个一点点:专注眼下

见过太多心猿意马的程序员,我不得不把「专注眼下」作为天字第一条。他们往往有各式各样的小梦想,比如做个小茶农、做个小鹅贩、做产品、做销售、做投 资,却被程序员的高薪或是没有转行的魄力「耽误」了,而因为不专注,他们不在意做好自己的本分,不在意锤炼自己的技能,不在意学习新兴的技术。不可否认, 这世界上存在着伟大的产品(像乔老爷)、伟大的销售(像埃里森)、伟大的投资客(像彼得菲),而他们毫无例外都是程序员出身。可你听说过巴菲特评价盖茨的 话么,比尔盖茨如果转行去卖狗,那他一定是全世界最大的狗贩。我坚信除了少数的天才外,冥冥众生均可以在多个领域取得成功,只要保持足够的专注。而哪怕你 下一年就想卖狗去,程序员的经验仍然能训练你强大的逻辑、谨慎和耐心,放在哪个行业都是相当可观的竞争力。

第2个一点点:思考力与推动力

我认为处理bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。当面对一个未知的问题时,如何定位复杂条件下的核心问 题、如何抽丝剥茧地分析问题的潜在原因、如何排除干扰还原一个最小的可验证场景、如何抓住关键数据验证自己的猜测与实验,都是体现程序员思考力的最好场 景。是的,在衡量理想程序员的标准上,思考力比经验更加重要。

有时候小伙伴跑过来,问我「提交了一个任务被卡住了,怎么办」的时候,我总觉得他可以做得更好。比如,可以检查试验别的任务,以排除代码自身的原因;可以通过 Web UI 检查异常(如果没有账号,可以让我提供);可以排查主机日志或删除缓存,再不济,总应该提供任务 ID和控制台日志给我。理想的程序员永远不会等事情前进,他们会用尽一切方法让事情前进。

第3个一点点:Never Say No

记得从前厂离职之前,找老板谈话,他说我最大的优点就是从来不和他说这个做不到。后来我发现在很多团队里,都存在一种技术和产品的对立,程序员往往以 「技术上无法实现」来挡产品的需求,而产品也往往以「Facebook可以为什么我们做不到」来奚落程序员。这两句话应该属于禁语,从根本上都不利于程序 猿和产品狗的相亲相爱。

一句「技术上无法实现」是容易出口,可有多少人在说出这句话的时候,心里是100% 肯定的?如果不肯定,为什么不能回去谷歌一下再回答?原本我以为程序员是充满想象力,在因为有想象力,才能诞生那么多改变我们生活的软件和互联网产品。见 识多了,才了解大部分程序员已经在与bug的对抗中变得保守而不愿担当风险,与此同时许多团队也不愿意宽容失败。于是「Say No」变成一种习惯性的抵触,还记得曾国藩为什么解散湘军么?他说那支军队已「暮气渐深」,不能打仗了。要做理想的程序员,就不能给自己滋生暮气的机会, 如果面对不合理的需求,可以把时间成本摆出来,把曲线救国方案亮出来,简单粗暴「Say No」是不可取的。

第4个一点点:投资未来

程序员是一个非常残忍的职业。你所学所用的语言、框架、模式,很可能在数年内就成昨日黄花了;你现在嘲笑的另一群程序员,可能马上就能转身来嘲笑你了。 所以理想的程序员除了做好自己的本分,还要花费时间来投资未来。什么是「投资」?投资就是你现在投入的时间,在未来会以更多的时间或者金钱(看看早几年学 习iOS的程序员现在的薪酬!)回报你。举我自己的领域 — 数据挖掘为例,08年左右Hadoop开始兴起,一时「大数据」概念火热,Hadoop工程师万金难求,各互联网公司纷纷把数据统计、数据分析和数据 挖掘的业务切换到分布式平台上。这几年眼看 Hadoop 还在不断迭代,Spark又异军突起,一举刷新了 Hadoop 保持的排序记录,以内存存储中间数据带来的性能优势和丰富的数据结构让人爱个不停,各种奇异的小 bug和陡峭的学习曲线又让人打退堂鼓。那么,明眼人都知道 Spark 是未来的趋势(内存会越来越便宜),在主业务放在 Hadoop的条件下,就可以适当把一些小模块切换到 Spark 上,同时留意 Spark 社区的发展。很快从 Spark 获得的性能收益就能把之前投入的学习时间挣回来。

第 5 个一点点:善用工具

善用工具可以分为4个层面:

  • 搜索引擎
  • 不相信重复
  • 代码片段
  • 自动化

我刚入行那会,一个计算机专业却当了公务员的朋友问我,你一点都没学过编程,平时怎么 写代码?我说,谷歌,于是遭到无情的耻笑,以至于我在哪里的账号都叫2shou,告诫自己是一个无耻的二手程序员。这是一个笑话,但如果现在问我,我还是 要回答谷歌。程序员的成长就像膨胀的圆饼,外面是无边无际的大海,圆饼越大,与大海接触的面也越大,懂的越多,不懂的越多,而计算机科学又是一门更新换代 异常迅速的学科,同时也是知识互联网化最好的学科,很难利用传统的科班式有教有学的方法,相反通过搜索引擎则很容易获取到最新的知识。

不相信重复,大师的话叫DRY原则(Dont repeat yourself),代码写多了,会有人为的直觉判断好的和烂的代码,我的标准是简洁和规范,简洁并不是美感上的标准,重复越少,给自己出错的机会也越少,后期维护的成本也越少。

如果你不幸丢了三周前的代码,也许你能凭着过人的记忆力把脑子里残余的片段复写出 来,但如果丢的是三个月前的代码,恐怕就没有那么好的运气了。理想的程序员会着力找寻有效的资料保存方式,把工作里灵光闪现写下的代码、脚本、配置、 经验等短的片段保存起来,以便任何时候都能复查。

理想的程序员必须懒惰。对他们来说,重复的步骤和重复的代码一样丑陋,如果意识到一项工作有可能长期要重复,那么自动化的时间总是越早越好。

第6个一点点:管理时间

之所以管理时间会对程序员这个行当特别重要,是因为在完成任务时你必须像荒野里的狼一样,「独行」。没有外界约束的情况下还能稳定控制自己,保证能高效率地工作和学习,那么日积月累你肯定会变得比一般人厉害。

程序员干的是高强度的脑力活,一般每天集中4-5 个小时应对本职工作就足够了,但工作之外,一定要安排时间用于学习。除了学习,留点时间放空自己也是必要的,利用泡茶或者喝咖啡的间隙,把弥足珍贵的时间留给自己,往前想往后想,事半功倍。

说了这么多,想必有人会问,费劲心思成为一个理想的程序员,又有什么用处?会有高薪吗?不。能升职吗?也不见得。迎娶白富美呢?不如去卖狗。

稻盛和夫曾经说过一个故事,明治时期的手艺人被天皇召见,虽然都是不读书的乡下人,但一辈子兢兢业业地做一件事情,自然有一股高贵的气质。理想的程序员,应该就是循着这种高贵的气质而去的吧。

How Many Programming Technologies Can You Really Master?

Andrew Wulf , Aug 6, 2015

I keep seeing companies or their recruiters advertising they are looking for people “with significant experience developing iOS and Android applications from scratch and will have a mastery of modern mobile and web technologies, including Java, HTML5, CSS3, JavaScript, JSON and AJAX”.

There is no such person. You can master one and be mediocre in the others; you can master one and then move on to another and forget a lot of the prior; you can simply fool enough people into thinking you can do it and hope you can figure it out just in time.

Programming today in any major area is highly complex, constantly changing, and generally done with a lot of time pressure. None of these allow you to devote a lot of non-programming time to learn even the most recent changes, much less master everything from scratch. You can really only learn a new environment by doing real projects, and how many people can simultaneously write large native Android, native iOS and responsive web clients all at the same time?

During my 34 years being a programmer I’ve only rarely worked in more than one major area. My first job was on a supermini and then 6502 assembly on Apple and Pascal on a PC, my two startups were for Mac in C, I worked some more for other people (including Apple) for Mac in C, a little C++ then Objective-C/WebObjects transitioning to web in Java on both client and server though only rarely both, some JavaScript, then C++ game programming on Mac and Windows and finally Objective-C and iOS. For each transition it was a lot of learning on the fly followed by years of mastering all the new stuff.

If for some reason someone can actually do both Android and iOS—much less web—at a real master level, they should be making way more money than most companies are willing to pay. What companies want is to hire few people who are then able to do everything and at the lowest pay level they can get. Yet I cannot fathom anyone being able to be an expert on so many things simultaneously and how they can write multiple apps in multiple technologies and keep up. I’ve known people who were incredibly brilliant but I can’t remember anyone being so good they could actually juggle unrelated technologies at the same time and produce masterful applications.

Maybe there are exceptions. But I still think most people can’t do it. People can of course master one thing then move on to master another but in the process you inevitably forget things from the first. Last year during my months of not having anything to do waiting for my layoff (I was one of the last layoffs for no apparent reason as all of our technology was already replaced prior to the final sale of the brand) I spent a month working on C++, then node.js and finally Swift. Going back to each this year (since all I had done in my new job was Objective-C) I found I had forgotten much of what I learned. If you don’t use something regularly the memories seem to fall out the back of your head. In rewriting this blog engine in PHP I got all those languages mixed up in my head.

Now if you are writing in Objective-C and then Swift on iOS at least there is some overlap. But Android is not just a different language from iOS, everything is different from the tools to how you do layouts to supporting multiple major OS releases to the 24,000 or so different devices. Just keeping up with all the new changes in this years WWDC in June is taking a lot of effort; not helping is that sample code Apple released then is already uncompilable in the latest XCode beta. Even if you wrote no code and just watched videos and read documentation and sample code all day, how could you say you are an expert with a straight face?

Add to two different mobile OS environments all the complex mess that is modern web development, especially with Javascript frameworks that appear one day and then vanish the next. You’d need three heads to keep up with it. The Javascript programmers I worked with couldn’t do more than keep up with one (in this case AngularJS).

So finding a single person who can write iOS, Android and mobile/desktop web in Javascript, using modern APIs and yet supporting older OS versions, understanding the plusses and minuses of different approaches to design and UI and the subtleties of all the different browsers and Android devices especially, and deliver bug-free results in record time, is fantasy. Oh yeah and work for less than market rates.

When I started programming things were extremely primitive and I only had to know one language and one OS and no frameworks at all. Even during my two startups I only had to master C, Inside Macintosh and some occasional 68K assembly. Today is not then. Yet we still only have one brain and brains aren’t subject to Moore’s Law. They can’t be upgraded.

So if you (honestly) can do Android, iOS and mobile web simultaneously and deliver masterful results, I salute you! But I sure hope you are making 3X money too.