写给即将进行的朋友们,同时也是对毕业两年来的工作做一下总结。其中一些观点都是自己认为的,并无严谨地考证,仅供参考,欢迎交流。

程序员到底是什么?

话不烦絮,直奔主题。即将入行的朋友们可能从各种消息渠道听来程序员的种种消息:

  • xxx30岁猝死,钱多话少死得早
  • yyy年轻有为CTO,不到30岁有车有房,IT新贵
  • zzz秃头木讷接盘侠
  • xyz高薪老实可靠,相亲丈母娘疯抢
  • zyx屌丝加班没女票
  • 某某某是技术大牛,破译了xx软硬件
  • 其他各种传言等不一而足

那么,程序猿、码农、IT民工到底是什么呢?

  • 程序猿、码农、IT民工,往往是指从业于IT行业的相关技术人员,如开发、测试、运维等偏技术的岗位人员。而产品经理、需求分析师、项目经理虽然也是IT行业/互联网行业,但由于其技术色彩浅,所以一般被认为不属于程序猿行列。
  • 程序员鄙视链
    程序员鄙视链

为什么这么称呼呢?

  • 同样是技术人员,为什么电工、通信行业的没有这些称号,而软件开发行业的有呢?我想,之所以会这么称呼,更多的是程序员们的自嘲。程序员们长久地与机器打交道,思想单纯,缺乏与异性交流,少现实世界的社会交际,平时在群里开车多了(重点!通信行业可没有在群里问技术讨论技术方案的时间和机会),相互调侃以自嘲为乐,加上资本的炒作,久而久之就获此殊荣。

Again,程序员是干啥的?

  • 程序员就是一种职业分类,一种技术职业,跟通信技术人员、古代的锁匠、铸剑师是同样性质的职业。
  • 但是,程序员也是新时代的职业,在地球村全球化的历史进程下,他们可以改变世界,靠一坨简单的代码,可以号召全世界的程序员们,裂变传播,做些改变世界的壮举。比如比特币、安卓、GNU开源社区等等,都丰富了世界的信息,改变了社会的运作方式。
  • 所以,程序员的工作就是创造、维护、测试程序,目的是去加速社会模型的信息流通,去提高管理信息的效率,去挖掘还没被优化的可优化点。
  • 未来,程序员可能是很牛逼的人群。为什么呢?祥见阮一峰的文字关于《未来世界的幸存者》

要入行要选择学什么“编程语言”?---程序的本质

很多初学者都会有这个问题,不管你是大三即将毕业的Computer Science或Software Enginerring的学生,还是其他行业想转行到IT行业的初学者,这都是一个比较难以抉择的问题。

首先指出,我回答的答案,不负任何责任。

  1. 兴趣是最好的老师。选择最感兴趣的语言是最好的。此时如果你不知道哪个好,不知道他们的异同,那就去百度看他们的介绍,然后跟着直觉走。我四年前大三的时候,沉迷于禅修,从研究lisp的过程中,看到python之禅觉得很有眼缘,于是就学python。当时的python还处于python2和python3之分的低迷期,AI和数据挖掘也还没被炒作起来。但是现在,python却成为了最火的语言。所以说没有永远火的语言,只有最适合自己最感兴趣的语言。
    编程语言排行榜

  2. 程序=算法+数据结构,一种编程语言只是工具,是程序员工作中运用到的一小部分。如前文所言,程序员的工作目的是创作、维护和测试程序,而程序的目的是提高社会生产力。那么只靠“编程”是不够的,还需要管理维护衔接数据库、健全程序安全健壮性、美化程序界面等等。比如你开发一个接口,从数据库中读取数据,那么你就需要了解些数据库的知识,推送数据给前端,那么就需要了解和前端格式商定的知识。
    编程语言只不过是描述算法和数据结构的工具,因此编程语言不是唯一的,有时需要多种语言共同来描述算法和数据结构,就如计算一道数学题用到了加减乘除四种运算工具一样。

  3. 如果对很多语言都有兴趣,而不知道如何入手,就考虑现实,选择长久有益的技术栈。每一种编程语言都有围绕着它的一套技术栈,比如你选择JAVA,那么围绕着你的可能就是Spring、SpringMVC、ZooKeeper、Redis、Hadoop、Apache、Tomcat等。如果你选择的是python,那么围绕着你的可能就是flask、django、scrapy、redis、rabbitMQ、numpy、pandas、docker等。
    在这种情况下,肯定要选择长久的技术栈。比如当年称霸手机市场的诺基亚,其操作系统是塞班。我想你不会傻到选择塞班的技术栈吧?肯定是选择长久的,比如python(目前比较火)、前端全家桶、JAVA、C/C++、PHP、C#等目测可以存活很久的编程语言。当然,学完一个之后可以继续学另一个,并不冲突,只是选择哪个入门找工作用而已。
    这么多名词如果看不懂,没关系。反正只要知道,他们不外乎是工具,是为了解决某些问题而存在的就好,需要的时候再看一看官方文档,了解下用法和前辈们遇到的坑,如果是前辈没遇到的,那就再总结下分享出来回馈给社区即可。

  4. 上招聘网站看岗位,根据岗位需求学习相关技术栈。如下图红框所示:
    岗位要求里有Python开发、Django、Web框架、Linux开发环境、开源开发组件、Redis、Couchbase、RabbitMQ、Kafka、ElasticSearch、MySQL、PostgreSQL、Hadoop、Spark、Storm、MapReduce、HDFS、HBase、Hive、Kylin等等。看到这些招聘要求不要被吓到,招聘网上的内容大都是抄来抄去的,这么多的轮子(工具的昵称,引申自知乎轮子哥名言不要重复造轮子),是不可能有人全部掌握的。此时应该百度各个名词的介绍,将他们按照其作用分类,然后学会每个类别中的一种,做一个小项目即可。
    比如Web框架有Python Web,也有Java Web。python web中又有flask和django或tornado等,只要掌握一种即可。要知道各种框架之间大同小异,都是总结了软件工程的经验,然后抄来抄去。
    拉钩招聘-极光高级Python工程师

  5. 第四点所提及的小项目怎么做呢?很简单,软件工程的核心是信息流,用你选择的技术,实现一种业务逻辑,从数据库--后台--前端展示出来,并可以成功达到业务逻辑,再赋予健壮性、安全性、富有美感。比如你可以做一个Django的博客,看一下官方文档(英语好的建议看英文版),然后跟着敲一遍,不懂的再百度一下你的问题,有很多前辈都分享了他们曾经填坑的大道笔记,然后一一解决,最后搭建好一个博客,放在服务器上,可以被亲朋好友打开。恭喜!你已经出师了!

  6. 当然,第5点只是我出师的经验,只是web开发。而实际上还有运维、测试呢,还有数据库工程师、安卓开发、iOS开发等等众多岗位,每种岗位所需的技能都不太相同,但有一点是共同的,那就是你的价值,体现在能为企业带做出贡献。运维的价值在于保证服务器正常运行,测试的价值在于保证产品质量,数据库专注于数据库开发维护,前端、安卓和iOS跟web差不多,在于创造程序,实现业务流程。

  7. 本来要写职业规划,但是我从没规划过呀~就只写一点看法吧:顺其自然即可。

我什么都不会,有人要我吗?

要的,因为即使你在这个公司会的东西,到另一家公司不一定有用,大家的技术栈不一定相同。不会可以学,只要基础好,一个星期一个月就可以掌握新技术栈,所以学习能力至关重要。

授人与渔,修行靠个人

我的前辈们教导了我,现在我也分享给你们。

  1. 掌握搜索引擎技能至关重要,程序员工作中会遇到很多没见过的问题。问人之前,看下《提问的智慧》,内事问百度,外事问必应。
  2. 多看书,但不是只看玄幻小说,应该各种分类的都看。推荐一本《黑客与画家》。
  3. 保持好奇心,不要给自己设限,任何领域都可学习,要终身学习,并具备快速学习的能力。技术日新月异,现在学的技术随时可能被淘汰,要随时积累其原理(比如我用有道云笔记记录草稿,发布博客整理总结)。
  4. 经常锻炼,保持自信,不要焦虑,不怕猝死。实际上过去5年猝死的程序员,还不如一架飞机失事的人多。
  5. 开源精神,记得回馈开源社区哟。