一个6年iOS程序员的工作感悟,送给还在迷茫的你
前言
每一个开发者,都有一段不愿提起的经历,很多年前,刚刚从大学毕业的时候,很多公司来校招。其中最烂俗的一个面试问题是:“你希望你之后三到五年的发展是什么?”。我当时的标准回答是(原话):“成为在某一方面能够独当一面的技术专家“。后来经历了几家不同的公司,换了不同的方向,才知道这个真是一个很难的问题。因为兵无常势,什么东西都是在不断的变化,一早的时候看好的东西可能会被淘汰。
(几乎)没有人能够看准技术的下一个方向,因为这个问题实在是太难了,能够做到这一点的你就成为了技术界的巴菲特了。比如说11年加入Google,14年加入Facebook,16年加入阿里巴巴。做到这一点的人肯定有资本也有眼光去做风险投资,就算不做风险投资那么财务自由也是妥妥的。
现在毕业六年,从北京到上海到硅谷,从国内互联网公司外企,看到了公司好的地方和坏的地方,这里只是根据自己的经历写一些大方向选择建议,仅供参考。
一、行业背景很重要
行业背景非常重要;工作3年后必须确定自己的行业背景,比如一直从事电信行业,一直从事银行项目,一直从事ERP行业等等。
一个程序员不可能是一直写代码的,就是写代码也要知道业务逻辑,满足什么需求;俗话说隔行如隔山,每个行业的业务都不一样,甚至差别很大,比如你一直从事流媒体的研究,让你跳槽到一家银行项目,完了,一切从头学吧,以前的行业经验都用不上了;而且,一个公司公司招人,就是希望找到那些很容易上手,不需要培训业务很久的程序员;频繁跳槽的朋友,一定要注意这点;
一直在一个行业呆久了,就可以成为这个行业的专家;我们可以经常看到,一个项目组的某个leader,代码写的一般,但是却可以跟客户流畅的沟通,控制着新需求的提出,bug的修正等等;而客户也很愿意跟他打交道,因为那些老的项目只有他能维护,他甚至熟悉系统的每一张表结构——-可想在这个行业呆的时间有多久啦。
二、合理的职业规划
什么是职业规划—-就是你短期或者长期的一个职业计划!大道理不讲,咱简单点。先问你几个问题:
a.你工作几年了,你愿意一直和新入行的新手一样就是个简单的程序员吗?
b. 你愿意一直写代码,而不关心其他吗?
c. 一个项目的前期需求,设计,后期部署维护,领导找到你,你说咱搞不定,行吗?
程序员不是敲代码的机器。第一年太多东西不懂,你可以一切听从老大的安排,敲敲代码,看看数据库,测试自己和别人的代码;但是第二年,你还是这样吗?不可能的,一年的经验你完全可以入行了,是时候该学习怎么进行需求分析,怎么设计数据库,怎么写各类文档,怎么写更好的代码?这是高级程序员的要求!
三、什么是高级程序员?
具有分析设计能力,能进行技术攻关,而且具有某行业深厚背景的程序员!
所有,一个项目立项后,你要积极的参与到前期设计中,跟老同志们一道思考分析问题,学习经验!OK,你这就成长啦!
千万不要认为程序员就是写代码的哦!!!
而且,通过一个项目的开发,你要能粗略的统计出一个功能的开发时间;比如一个模块有20个小功能点,你开发了80个小时,每个小功能点平均2小时——这时在前期就能评估工作量啦。当然每个人的效率和工作质量是不同的,因人而异,但是大概的工作量应该是可以统计出来的,用于统计一个项目的工作周期;
据不完全统计,截至目前(2018.03)为止,中国iOS程序员的数量已经超过了60万。而且,随着IT培训业的持续发展和大量的应届毕业生进入社会,iOS程序员面临的竞争压力越来越大。那么,作为一名iOS程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。
四,工作内容枯燥,创新少。
现在进BAT工作,大多数都是干一些非常基础的体力活,虽然说BAT很难进,但是进去之后你会发现,你所从事的工作其实并不难,干个1-2年之后,你的进步就变得越来越缓慢,所以很多人都被外面的花花世界所吸引,在BAT工作1-2年之后离职了。
五,升职难。
要知道BAT不是每个项目都成功的,很多的项目最后都难逃失败的命运。现在进BAT工作,大多数都是干一些非常基础的体力活,去的项目组大多也并不好,如果你进的项目组没啥爆发力,那你想升职基本是无望的,就如百度,干个3-5年能升到T5已经非常不错,再想更进一步难如登天,不是每个人都能分到当年百度贴吧那样的项目组。
六,职业规划难。
由于4,5点原因,大多数人都很难在BAT坚持3年以上,就受不了外面小公司的各种诱惑而跳槽,小公司会给予你很多的原始股期权,给你一个“上市”之后变成亿万富翁的美梦。但是,一旦你从BAT离职,那么基本上,你的职业成长就会陷入停滞状态,因为小公司能给你的也就是那么点钱和股票了,他没有BAT那样的技术积累,所以基本上是小公司用钱买你的技术,而你想获取更多的知识,基本已经没那么多的精力和求知欲了。所以越来越多的工程师把自己的工作形容成“搬砖”,其实就是因为工作时间越久,你的重复劳动就越多。
七,来自大城市的压力。
众所周知IT公司集中在北上广深杭,尤其是北京,基本一半的知名互联网公司都在北京。而北京的房价大家都懂得,就算你30W年薪又如何,你能在30岁之前在5环内买个100平的房子么?没房子你娶的到媳妇么?我见过太多30多岁打着光棍的程序员了,太多了,一方面不愿意舍弃自己的工作回老家,一方面是天价的房价和孤独的夜晚。对了,女朋友在我眼里不能算是媳妇,结婚才算是。
八,技术更新非常快。
一项热门技术,也许过个2年,就不再热门,可以说是各领风骚两三年,如果你花了两三年的时间学习一门技术,但是当你发现他逐渐落伍的时候,也就是你迷茫的时候。
九,人际关系简单。
很多的程序员的人生轨迹都是这样,尤其是帝都的程序员:
进入BAT工作——2-3年后跳槽到小公司——小公司项目不景气,继续跳槽——项目继续不景气,不断的循环——年龄优势不再,结婚难,事业瓶颈,迷茫——回家,or坚持最后,我想说的是,程序员在目前来说确实是一份好工作,至少薪水高,但是他毕竟是社会生态链的下游,程序员的工作与其他行业的技工,其实在产业的生态链上处于的位置是一样的,只是目前赶上了整个行业的爆发,所以程序员能才能不断的跳槽,不断的找到新的工作机会。但是一旦行业不景气,或者你的技术领域被淘汰,
又或者你的年龄优势不再的时候,就不一定还如刚毕业那时候那般雄姿英发了。
最后希望我们在职iOS开发者以奋斗为目标,在iOS的这条路上越走越好,给自己定位,不断的学习,不断的提升自己,接触新技术,在这大千世界中找到努力的自己。
原文发布时间为:2018-10-14
本文作者:原来是泽镜啊
本文来自云栖社区合作伙伴“Android开发中文站”,了解相关信息可以关注“Android开发中文站”。
相关文章:

1063 Set Similarity
1. 这题需要利用set容器的去重功能,因此使用set来存放每一组的数据。 2. 起初我的计算相似度的函数是这样设计的:传入set1和set2,声明一个set3,将set1中的数据全部插入set3中,再声明一个重复元素个数same_n࿰…

Volume是如何工作的
在这篇文章中,我会尽最大的努力来解释Volume是如何工作的,并展示一些最佳实践。这篇文章主要是针对那些对Volume不了解的Docker用户,当然有经验的用户也可以通过本文了解一些Volume的细节。想要了解Docker Volume,首先我们需要知道…

使用 TFDConnection 的 pooled 连接池
从开始看到这个属性,就一直认为他可以提供一个连接池管理功能, 苦于文档资料太少, 甚至在帮助中对该属性的使用都没有任何介绍,如果你搜索百度,也会发现基本没资料。 最后终于在其官方网站看到了其完整相关的英文资料&…

Java与UML交互图
Java与UML交互图 前面我们主要讨论的是UML类图,下面我们要讨论的是另一种UML图——交互图(Interaction Diagram)。交互图描述的是一组对象之间的交互过程,或者说,这里我们实际上要回答这样一个问题:“方法调…

1054 The Dominant Color
1. 此题用到了map<string,int>将输入的颜色(long long也存不下,只好作为string存入)的次数记录,看来默认一个没出现过的string对应的int是0。因此记次数的时候 if(mp[str])mp[str] 1;//如果不是第一次出现,出现次数1 else mp[str] …

通过sqlserver日志恢复误删除的数据
通过sqlserver日志恢复误删除的数据 原文:通过sqlserver日志恢复误删除的数据如果你已经急的焦头烂额,看到这篇文章的时候,请你换个坐姿,深呼吸几次,静下心来将这篇文章读完,也许你的问题迎刃而解。 我遇到的情况是这样…

关于在phpStudy环境下,windows cmd中 php不是内部命令问题
首先查看system32是否加入系统变量 其次要把当前运行的php版本的路径加入到系统变量中去,path中, 一定要是这个样子的; D:\phpStudy\php\php-5.6.27-nts 不然没有什么用。 这样在phpstorm中以及cmd中都可以使用php命令了。

如何用javascript控制上传文件的大小
以下是引用片段:<form nameMyform οnsubmit"return CheckFileSize()"> <input typefile namephoto><br/> <input typesubmit valuesubmit></form> <SCRIPT LANGUAGE"JavaScri…

1071 Speech Patterns 需再做
1. alphanumerical 的意思是字母数字混合编制的,也就是一句话中被认为是“单词”的组成成分的有数字和字母。这也是为什么例句中can1不被认为是can。 由于这道题对大小写不敏感,不妨在读入后,把大写字母全部改成小写 //大写换小写 for(int…

IOS类似9.png
图形用户界面中的图形有两种实现方式,一种是用代码画出来,比如Quartz 2D技术,狠一点有OpenGL ES,另一种则是使用图片。 代码画的方式比较耗费程序员脑力,CPU或GPU; 图片则耗费磁盘空间,会增加app的体积.一般的app我们会偏重于使用…

Shell 编程
Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。它类似于 DOS 下的 command 和后来的 cmd.exe。Shell 既是一种命令语言,又是一种程序设计语言。Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell 脚本编…

表现层框架Struts/Tapestry/JSF架构比较 [转]
http://www.jdon.com/artichect/sjt.htm Struts/Tapestry/JSF是目前J2EE表现层新老组合的框架技术。从诞生时间上看,Struts应该比较早,使用得非常广泛,Tapestry 3.0逐渐引起广泛的重视,正当Tapestry即将大显身手时期,S…

1022 Digital Library
1. 关键数据结构 map<string,vector<string> > mp[6] 其中mp[1]代表从书名映射到id(id可能无,可能不止一个,所以要用vector),mp[2]是从作者映射到id……mp[5]代表从year映射到id。 2. 卡住的第一个地方是…

event.keyCode用法及列表
用户名:<input type"text" id"UserAccount" onKeyPress"JumpByEnter(UserPwd)" />密码:<input name"UserPwd" type"password" onKeyPress"IsEnterKeyPress()"> JavaScript&…

网络游戏术语(转)
转自:https://site.douban.com/149989/widget/notes/8053161/note/231207595/ AC – Armor Class,盔甲等级、级别Account – 账号,与密码Password相对Add – 一只玩家加入到组队中,如果请求别人组队,可说Add me pls.AO…

vim的一些快捷键,备忘
vim的一些快捷键,备忘 快捷键 作用ctrlg 显示当前行的信息G 跳到某一行:%s/oldtxt/newtxt/g …

1051 Pop Sequence(两种双指针思路)
目录 思路一:以入栈序列为总纲,2层循环,外for内while 思路二:一层while 思路一:以入栈序列为总纲,2层循环,外for内while 注意弹栈之前要判空,不然会出现段错误。 AC代码 #inclu…

iOS底层原理 - 常驻线程
iOS底层原理 - 常驻线程 在 AFN 2.0 时代,会经常看到 AFN 创建一个常驻线程的方式: 0️⃣ AFN 2.0 时代的常驻线程 (NSThread *)networkRequestThread {static NSThread *_networkRequestThread nil;static dispatch_once_t oncePredicate;dispatch_on…

A monad tutorial for Clojure programmers (part 3)
Before moving on to the more advanced aspects of monads, let’s recapitulate what defines a monad (see part 1 and part 2 for explanations): A data structure that represents the result of a computation, or the computation itself. We haven’t seen an example…

Flex精华摘要--使用AS脚本
在MXML文件中实现ActionScript逻辑的几种方法:最简单的方法,在一个MXML文件中通过组件的事件直接书写简单的逻辑控制,但是并不推荐。 <?xml version"1.0" encoding"utf-8"?> <mx:Application xmlns:mx"h…

(C++)自定义链表并写入
确定链表节点的组成,一般由数据和指针构成 struct node{int data;//数据域node* next;//指针域 }; 使用new运算符为节点分配内存空间 node* p new node; 编写创建列表函数,参数为链表的长度(从用户输入读入),返回值为创建的列表的头指针…

Unicode转义(\uXXXX)的编码和解码
在涉及Web前端开发时, 有时会遇到\uXXXX格式表示的字符, 其中XXXX是16进制数字的字符串表示形式, 在js中这个叫Unicode转义字符, 和\n \r同属于转义字符. 在其他语言中也有类似的, 可能还有其它变形的格式. 多数时候遇到需要解码的情况多点, 所以会先介绍解码decode, 后介绍…

BZOJ 2004 [Hnoi2010]Bus 公交线路
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id2004 题解 状压dp,记f[i][S]f[i][S]f[i][S]表示[1,i−p][1,i-p][1,i−p]的车都被安排好了,而[i−p1,i][i-p1,i][i−p1,i]的车中,SSS中有111的位置都安排有车停,并且恰…

【转载】C语言编译全过程
今天在blog.chinaunix.net/u3博客看到一篇关于语言编译过程的文章,觉得精简,清晰所以摘录下来我的blog。作为一个程序员了解编译过程对程序的编写也很有帮助。下面是博文的内容:编译的概念:编译程序读取源程序(字符流&…

5层模型中数据从源主机到目的主机之旅
报文是用户发送的数据 传输层可能对报文进行拆分,加上段头 网络层会加上网络层的头,构成的协议数据单元叫做数据报 链路层会加头加尾构造帧 路由器的链路层会去掉帧头帧尾,还原到网络层数据报 再次封装成链路层的数据帧 目的主机的链路层再…

JavaScript模式读书笔记 第5章 对象创建模式
1,命名空间模式 namespace <script>var myApp {};//通过全局变量来实现命名空间maApp.Parent function (){};myApp.Child function(){};</script>通用命名空间函数<script>//不安全代码var myApp {};//安全代码if(typeof myApp "undef…

174. Dungeon Game
一、题目 1、审题 2、分析 只能向右、向下移动的王子,从左上角要到右下角救公主,每经过一个方格,可能获得血瓶加血量,或者碰到怪物减血量,当王子血量 < 1 时就挂了,为了能成功救得公主,求王子…

DotNetNuke安装与下载
【下载专区】 DotNetNuke (DNN) 5.1 稳定版正式发布 http://www.dnnmix.com/dotnetnuke-dnn-51-released/ DotNetNuke (DNN) 资源共享 http://www.dnnmix.com/resources/ DotNetNuke官方下载 http://www.dotnetnuke.com/tabid/125/default.aspx 【安装教程】 DotNetNuke安装大…

1025 反转链表
1. 第一次做链表题,但是这题其实也就是套了个链表的壳子,虽然在结点的结构体里面有下一节点地址next这个属性,但是也只在最初给结点标序号时用到,由于没有真正对链表实施倒序,所以后面输出的下一结点的地址实际上只是算…

关于margin
<html><body><div style"width:200px;height:200px;background-color:red;> <div style"width:100px;height:100px;background-color:black;margin-left:300px;"></div></div></body></html> 左边是火狐显示&a…