判断一个职位的好坏

1.企业知名度
2.网上的信息
3.面试的难易程度
4.技术负责人的情况
5.团队与项目情况
6.团队之间协作情况

毕业之后,几乎每个人都必须面临职业选择的问题.面试和换工作对于一个人的来说很平常,但又很重要,而且也不是件简单的事情.除了如何顺利通过面试拿到offer,还有另一个比较重要的问题,就是如何判断一个职位的好坏或者说如何考量一个团队甚至是一家企业是否值得自己加入.要在面试的这短短的几十分钟或者几个小时之内就搞清楚这个问题,显然并不是那么容易.很多时候大多数人都没有太在意这个问题,或者就简单的看看职位描述,企业主页上的简要介绍,做的再好一点的就是在网上找找关于这个职位信息的评价,这些信息很多时候都来自离职员工的评论,当然这是很有价值的信息,但是远远不够.有时候,对这个问题的重视,可以有效地避免自己跳入”火坑”.”宁缺勿滥”从某种角度来看还是有一定道理的.

我总结了以下几个方法,通过这些技巧,我们可以学会如何识别出一些”糟糕职位”,”垃圾团队”和”坑人公司”

1.企业的知名度
以互联网行业为例,BAT无疑非常著名的互联网公司,这些公司几乎就是中国互联网的领头羊.一家公司的口碑是需要很多年的积累,也是要在产品市场占有率,公司规模,盈利情况的企业经营状况各方面做得非常优秀,所以公司的知名度对考虑一个公司来说具有很大的权重.当然,由于这些企业的规模十分庞大,所以具体到各个部门,团队,以及下面不同的职位,情况肯定不能一概而论.

2.网上的信息
通过企业自己的官网,可以大概的了解这家公司的基本情况.通过职位说明,职位要求以及职位描述等信息也可以粗略的判断岗位的大概信息.除此之外,通过看准网,知乎,拉钩网等这些招聘信息,企业评论性的网站可以获取到一些比较重要和更加客观的关于公司和职位的反馈

3.面试的难易程度
其实一个简单粗暴的道理就是:面试过程越难的职位,往往也是越好的工作职位.反之,面试过程越是简单容易,甚至没有什么要求的岗位,就很有可能是非常垃圾的工作了.

4.技术负责人的情况
技术负责人对团队的素质和风格等具有非常大的甚至是决定性的影响.通过team leader的水平,也就基本能够判断这个团队的专业水平了. 一般来说,在面试结束之后,如果面试官允许提问的话.可以尝试了解技术负责人的性格特点,工作经验,项目经验,工作履历等比较客观的信息来判断其团队管理能力. 通常,面试官的人员之中都会包括技术负责人,也即团队负责人. 从这个角度其实可以比较准确的反映这个团队的问题.

5.团队与项目情况
一个团队的综合实力主要可以通过:成立时间长短,重要项目或重构的经历,团队人员及角色配置,项目流程等这些方面反映出来.下面这些问题都是面试者需要了解清楚的.
团队是什么时候成立的?
经历了哪些比较大的项目?
哪些项目是完全从头开始,最后成功上线的?
目前正在做什么项目?对项目的把控程度: 产品与需求的了解程度,代码熟悉程度,目标是否清楚,是端到端式的独立负责整个系统还是仅仅负责一个大系统中一个子系统(我认为独立负责整个系统的团队更值得加入)
团队成员和规模以及角色划分: 需求,开发,测试,运维等是否完整
项目的基本流程是否规范?一般的上线周期是多长时间?

6.团队之间协作情况
以项目组织的不同,我归纳了两种模式:
1)一个团队独立负责完整的系统.
2)每个团队负责一个子系统(模块),多个团队相互协作,完成一个完整的系统.

一般来说,前者对于小规模的公司比较合适,毕竟小公司资源有限,撑不起太大的组织架构;而后者就比较常见于国企,外企和规模比较大私营企业.不能绝对的说哪种模式更好,要具体看从哪个角度分析.如果要站在一个基层技术人员的角度看的话,我更喜欢这种负责完整的系统的团队.

原因有以下几点:

1)可以学到更多的东西
试想如果这个团队对整个系统的完全负责的话,那么技术人员相对来说就更容易对于这个系统的端到端都能学到,当然前提是你自己要有野心.一个技术人员想要职业得到提升,就必须打造自己的业务系统实施能力.所谓”业务系统实施能力”,包含很三个层面.首要要站在业务逻辑层面,对一个系统的业务架构和具体业务逻辑非常了解;站在技术架构层面,要能够提供简洁,高效(性能)的系统架构;站在项目开发层面,能够快速开发,提供软件系统交付物.技术人员一个通病就是过于强调对技术和原理的掌握和理解,忽视了业务知识的价值.我了解到的情况是多数公司,除了技术架构之外,还会有业务架构.
2)团队之间沟通成本要远远大于团队内部成员之间的沟通成本
人员之间的沟通可以说是项目中必不可少的,几乎每天都会面临沟通问题.一个团队内部的成员之间由于非常熟悉,所以沟通几乎没有任何障碍.多数情况下,同一个团队的成员都在相同的办公室上班,甚至办公桌就挨着的,所以沟通就异常便捷,而且是面对面沟通.而团队之间的沟通就面临非常多的挑战,尤其是不同的团队地理位置还不同的时候,这种情况其实非常常见.有时候一封邮件转去转来,一个简单的问题可能要等几天才能收到答复.就算使用实时聊天工具,比如微信,也存在很多拖延很久才回复甚至是没有回复的情况,更别说这种沟通方式的不便之处了,就算有截图,语音等等,还是会有很多问题.
3)团队之间的利益冲突导致项目阻塞
团队之间的沟通效率只是其中以一方面,另一个比较严重的,也是比较普遍的问题是团队之间的利益冲突.各个团队之间的责任推卸,资源内耗,勾心斗角甚至是相互拆台等对整个项目来说不仅扰乱员工的情绪,打击团队的士气,更严重的是降低企业的凝聚力,甚至导致项目的阻塞和失败.

程序员等级划分

一 缘由

最近因为找工作的原因,开始规划对自己的下一步发展和职业规划进行了深入的思考.总结自己的职业发展轨迹,想对自己是一步步成长的有个了解,所以就开始思考对目前很常见的对技术人员的初级,中级和高级的划分标准的问题.根据互联网上一些技术大神和职场专家的观点,再结合自己的工作经验.我总结了一些自己对这个问题的看法. 总的来说的话, 我认为可以使用下面这些判断标准:

1)初级技术人员: 功能实现.

2)中级技术人员: 模块级别的设计优化,以及性能优化.

3)高级技术人员: 系统级别的问题的排查, 性能调优, 一定的技术选型能力, 知识与技术的广度和深度, 以及一定的团队管理经验和能力.

4)架构师: 系统架构选型,搭建和优化,以及系统架构的重构.

当然,这样分类的边界并不是特别清楚或固定,但是大体上可以根据这几个标准来判断.

二 初级

对于初级程序员,他们的能力相对弱,决定了他们的关注点是: 业务功能的实现.他们所依赖的技术基础的级别往往是语言的语法规则等.他们平时的迫切任务也主要是拼命地完成上级分配给自己的任务.由于技术基础薄弱,他们通常为了完成任务而疲于奔命.自己手上的事情都来不及完成,所以导致他们没有时间停下了思考或者没有意识去思考.

下面这些问题是大多数初级程序员经常遇到的困惑:

1) apche与tomcat不都是网站服务器吗?为什么公司会同时使用这两个东西啊?(想当年,我刚毕业的时候也是搞不懂这两个东西的区别~~, 往事不堪回首啊, 哈哈……)

2)jsp中直接写java代码不是更加简单直观吗?为什么好像别人都在使用jstl和模板引擎(freemaker,velocity)这些东西啊?

3)不重视使用配置文件,甚至很多参数直接在代码里面写死了.

4)很多技术在宣传的时候往往又吹嘘自己的功能强大,丰富.实际情况是,除了核心功能会经常被使用之外,其实其他的功能都比较鸡肋.或者支持一些插件或模块性的扩展,也敢宣称自己无所不能,其实这类工作对企业和团队要求的投入还是比较大的.在学习技术的时候,这种情况也会让很多初级程序员很困惑.

总结来说的话,初级程序员对技术的认识仅仅停留在功能层面,他们没有足够的视野高度和广度,所以往往看不到这样的现实: 企业是在拼命地追求效率!

在此,有点感触也有些许悲哀: 一个人往往认为自己所看到的就是全部,却没有意识到自己的眼界是存在局限性.

在这个世界,不知道有多少人就活在自己的视野范围内啊! 他们忙碌,自豪甚至小有成就. 但是他们也就那样了,仅此而已.

三 中级

初级人员,随着项目经历的增加,看到了企业和软件系统是怎样的一种存在.尤其是经历过或者意识到重构的初级程序员就进入了中级程序员的行列.我至今无法忘记当我第一次听到了”重构”这个词的时候的震惊程度.入行这几年给我留下类似的这种巨大观念冲击的词语不多,大概有这几个:重现, 重构, 设计模式, 使用场景, 最佳实践, 系统架构等. 重现是软件开发过程中非常基础和重要的策略和原则;重构则是软件产品随着需求的变动和技术的发展经常会面临的问题;设计模式和架构则分别代表模块级别和系统级别的设计的同义词.

理解重构的含义之后,我瞬间明白了我多年的困惑,也精准的描述了我多年的状态.我为什么总是把已开发的软件该来该去?当初写第一行代码的时候怎么就没有想好这些呢?这些都是问题.虽然并不是每个程序员都能明确的意识到这种问题的存在,但是每个人都在被这个问题影响.刚刚认识到重构的时候,一半是豁然开朗,因为知道自己面临什么问题; 另一半则是焦急和渴望,因为迫切的想要找到解决办法.我有一段时间甚至甚至走到了另一个极端——过度设计. 从没有设计意思走到了追求完美的程序,神化设计的方向.

这种状态其实并没有持续多久,因为问题清楚了,答案其实也清楚了. 因为设计模式就天然的和重构联系在一起,这两者的关系是如此的紧密,以至于任何一者出现的地方,你总能看见另一个家伙的影子.设计模式

从这段描述,就能说明中级程序员的典型特点,就是具有一定的设计意识和思想.催生这种思想产生的动力就是:重构.

当然随着技术功底的加强,对于实现功能的任务已经越来越没有挑战性了.中级程序员会逐渐把剩余的生产力投入到软件性能这个层面.随着技术积累和项目积累,对常用技术的认识也就更全面和立体了,而不是像初级程序员那样只看到功能.

四 高级

老实说,我对自己当前的阶段的定位是: 我目前还处在高级程序员的入门口.刚刚跨入这个级别不久.在很多评判的标准上都还达不到或者等待检验.因为还没有完全经历过,所以就不太好谈这个问题.希望自己能够尽快到达这个级别的各个标准. 下面的话只能就自己的理解(而不是切身经历)来谈一谈.

作为高级开发人员的话,工作内容的复杂程度就不再是模块级别的了,而应该是系统级别的问题.随着技术和社会的发展,尤其是互联网的发展,目前的单机软件的地位越来越低.软件行业,可能其他技术行业也是这样,通常是那些最热门的领域,所面对的技术问题最多,因为业务压力和同行竞争对技术的驱动力是非常巨大的,一句露骨的话就是:钱的力量. 就像IT行业,目前最火热的无疑是互联网行业,所以互联网行业所面对的问题就非常的多,高安全,高性能,高可靠等,虽然与其他的领域相比,像人工智能这些领域,互联网的核心技术不一定最复杂,但是其发展速度和面临的挑战确实的非常大的.分布式技术就是应对互联网的这些挑战的最主要的解决方案.分布式技术这几年的发展离不开互联网行业的蓬勃发展.可以说互联网和大数据对分布式的发展起到了很大的推动作用.由于分布式技术的发展和成熟,也导致分布式技术和一些思想被其他IT领域采用,这又对技术人员提出了新的挑战.这样技术和业务就形成了良性的循环.

鉴于当前的行业的技术形态的特点,很多软件能力,就是以系统形式存在.所以,技术人员所面对的很多复杂的问题,都是系统级的问题.这就是为什么说高级程序员的处理的问题的级别是系统级别的.

除了工作或问题的复杂度,高级技术人员还应该在系统级别的性能调优,技术选型能力,知识的广度与深度以及团队管理等方面有扎实的功力. 这也是我目前需要努力的方向!

五 架构师

这个留待以后补充吧.

人的两种状态

今天突然意识到自己有两种状态:被动接受和主动选择。

看电视,看电影,无聊时用手机看看新闻,这些时候自己处于被动接受状态;记英语单词,看专业书籍,编程学习时自己处于积极主动状态。

被动接受状态,也可以称为消极等待状态。此状态时,自己不需要做什么过多思考,也不需要自己做任何艰难的选择。只需要体验,感受,甚至享受(“舒适区”)。

主动选择状态,也可以称为积极主动状态。在这种状态下,需要大量的思考,记忆,做出选择(这是不是所谓的“拉伸区”,或者“学习区”)

读书记之《资本的逻辑:一看就懂的融资实用指南》

书名:《资本的逻辑:一看就懂的融资实用指南》

作者:黄嵩

简介:它以资本为视角,从PE如何选择企业、如何评估企业、如何签订协议、如何退出投资等方面再现了企业融资的全景过程,并对经典融资案例进行了专业解读,揭示了资本的内在逻辑。

点评:这本写得非常通俗易懂,但也不失深刻透彻。在阅读的过程中,我深刻地体会到资本对企业乃至整个商业社会的发展所起的巨大推动作用。

证书

CA证书:一种身份识别机制(即防伪),从技术上看,主要就是一对公钥和私钥。

认证中心(Certificate Authority CA):CA证书的担保人,可以用自己的权威性为其签发给的证书作担保。

根证书:认证中心颁发给自己的证书,是证书链的终结。根证书是未被签名的公钥证书或自签名的证书。

子证书:认证中心给别的企业颁发的证书,可以证明该企业的身份。

证书链(certificate chain):根证书与子证书以及子证书的证书所形成的信任链。

成功五部曲

来源:《万万没想到——用理工科思维理解世界》

作者:万维刚

成功五部曲:

1.刻意练习

2.微小改进(拉伸区)——最重要,最关键,也是最痛苦的一步。但是成长就意味着痛苦,痛苦也是成长过程所必须付出的代价。
3.及时反馈——不要忘记,问问自己实现了哪些改进?
4.高水平重复
5.一万小时

大牛们

王垠,四川大学97级本科毕业,保送到清华大学计算机系直博。期间曾在清华大学计算机系软件工程专业就读,主要进行集成电路布线算法的研究。留学康奈尔大学计算机系,印第安纳大学伯明顿分校。2012年,以一篇文章《对博士学位说永别》再次退学,至此王垠分别于2005年、2006年、2008年分别从清华大学、康奈尔大学和印第安纳大学伯明顿分校退学。

领域:计算机一些深刻的,本质性的思考和见解

主页:http://www.yinwang.org/


顾森,北京大学中国语言文学系应用语言专业07级本科生

领域: 算法,数学

著作:《思考的乐趣》

主页:http://www.matrix67.com/

刘伟鹏,南京大学计算机系硕士毕业,现就职于微软亚洲研究院创新工程中心

领域:学习方法,算法,人工智能

著作:《暗时间》

翻译:

《Imperfect C++ 中文版》
《Exceptional C++ Style 中文版》
《修改代码的艺术》

主页:http://mindhacks.cn/

阮一峰,上海财经大学世界经济博士研究生。主要研究宏观金融、货币政策与美国经济。他本人也是一名IT技术人员,主要关注网站制作。目前就职于支付宝

领域:计算机,javascript

译作:《软件随想录》、《黑客与画家》《异常流行幻象与群众疯狂》《下一个大泡泡》

主页:http://www.ruanyifeng.com/

数据处理场景下的”数据类型”总结

数据处理(任何编程过程)中会遇到的数据类型总体上可分为两大类: 值类型, 结构类型(对象类型,引用类型,结构体)

值类型在形态上大体可分为三类:二进制,数字,字符串

结构类型在形态上也可分为三类:空(null),数组,普通对象

所以我们在进行数据处理相关的编程时,需要对以上各种数据类型一一论证;另一方面我们在学习相关的技术或知识的时候,应该对以上各种数据类型的处理场景检查,这样才能更加全面的学习这种技术或知识。