陆陆续续看过很多大V写的“如何年薪百万”、“如何月入十万”、“我是如何复习三个月考上浙大的”,还有以前打工皇帝的《我的成功可以复制》,对于条件不具备或者自控力不足的人来说很多都没有可操作价值。我们需要做的,是克服自己的思维惰性。
对于普通程序员而言,突破高薪大概有三个因素:科班学历、机会(公司的进程)、持续学习能力。这里的学历对工作两年内的人比较重要,但是工作三四年之后,再次求职hr一般最关心你最近两年的工作经历。所以好的公司可以洗白你的学历。
我之前是从嵌入式项目入行的,理所当然是从C学起。不过那时候(包括现在)最热门其实是Java,入客户端可以搞Android,入服务端可以搞后台开发,就业面很广。但是凡事都有依赖路径,毕竟大一学过C语言,要一个25岁的人完全丢弃以前学习的知识开启一门全新的知识领域是很难的。再回到Java,现在做后台很吃香,但是Android端特别是iOS端开发已经开始衰退了(指薪酬/工作强度不再具备竞争力),入行的同学可以尽早布局。
机械工程师应该都熟悉的振动强度测试实验台
职业规划
对于从事技术的工程师(不只是程序员)晋级之路基本为:开发工程师->高级工程师->架构师/产品经理。
1、对于职场新人,最重要的就是完成本分工作后,追求自己工作职责之外的成绩。比如完成代码的基本功能后,多考虑健壮性、移植性、低耦合模块化这些,积极参与解决业务问题。
前面两年保持积极的心态,换句话说前两年“把公司当成家”,对个人成长是有好处的。
2、积极吸取现有代码中的工程思想
刚做嵌入式项目的时候,本人花了半年多把ucos、lwip源码消化理顺并且自己用开发板做了很多个人项目(工作中做的项目除外),很多小优化点比如任务优先级配置更快调度、以太驱动收包性能优化等等,只有自己理一遍源码才有可视化的感觉,之后再结合CSDN上的解读博客,可以知其然更知其所以然,你会发现很多理论知识转化为代码是有差别的。
3、可能很多有一点经验的程序员会认为架构师的工作内容就是写写PPT。事实上,就算是依葫芦画瓢,有的人画的瓢就是好用一些。同样的讲解业务功能,有些领导做出来的PPT就是通彻一些,这些需要自己去悟。实现业务,讲白了就是做事方法与流程,类似的,你程序架构出来了,模块流程相通了,代码怎么写都不会很烂。
对于工作一年左右的职员来说,一般会要求独立完成一个业务模块的设计和实现(阿里P6的基本要求),这是一个很好的练手机会,把具体业务场景转换成合适的架构并实现,里面的时序图、异常条件等等都可以让你与其他人拉开距离。
4、很多业界推荐的经典书籍,可以不用一开始就上手,工作中边做边看效果会更好。像那本《UNIX环境高级编程》,刚学完嵌入式操作系统的时候以为很简单,结果刚上手看不下去。后面辗转进入互联网公司,经历过大大小小的bug以后再次翻看,不仅看的懂,还能有效的指导工作。也许这就是“螺旋式的上升”吧。
题外话
最后本人在知乎上写过一篇回答:《作为 IT 行业的过来人,你有什么话想对后辈说的》得到了一些反馈,这里也放上来吧。
1、 一定要把基本的数据结构,经典的算法,Unix编程,程序编译链接及计算机原理等基础知识扎牢,这些会长远影响你的职业发展。
2、 推荐从C语言入门,不单是因为很多操作系统、网络协议栈开源代码由C/C++实现,更多是因为C语言自身的特性:作为高级语言用户无需关注底层细节,同时能直观的看到数据流向。而且C相对语法规则较为简单,可以短时间的上手应用。最重要的是,遵循C->C++/java->python的学习方式,比直接学习python更能清晰的知道自己程序的内存等性能状况。
3、 不要过于追求第一份工作的工资,甚至可以说不要过于看重前五年的工资(虽然我工作也没满五年),也不需要基于学习如何投资股票理财,身边很多三十多岁才开始理财的人同样实现了财富自由。而是要扎扎实实做几个完整的项目,学习好基础原理,同时琢磨业务流程。当然大厂会有很多流程性的杂事,如何尽快处理不要过于消耗自己的宝贵时间,这个就是另一门学问了。
4、 胆子要大,要多发出自己的声音。很多职场新人在项目讨论的时候会担心自己技术深度不足,提出的观点比较浅薄,这个是不对的。说得不好听,我们都是来打工的,赚钱才是王道,面子是最不重要的。只有多表达自己对业务的思考才能展现自己的价值,很多时候跟人探讨自己的想法能及快速的更新自己的知识储备。
5、 本人机械工程出身,再说说机械(包括电气)工程如何转行进入互联网公司。看情况,如果是本科,极力建议跨考电气工程,因为很多基础课程像数电模电、电工学、高等数学等重要课程两个学科都有学习,考研难度相对较小。如果是机械的硕士,那么建议先把算法与数据结构全部学习一遍。
不一定非要找创业互联网公司的实习,进去一两个月学不到完整的项目开发流程。尽量加入一个学校内部的团队完成一个项目,像华为每年都会在各大高校设置编程大赛等,这些可以让你全方位的了解进入软件行业必备哪些技能。对于已经工作的老铁,像我就是毕业入职后转行的,这里给一下我的学习过程仅供参考。尽快入门C语言,利用下班时间刷题把上面链接提供的算法与数据结构等书完整的自己敲一遍代码。然后选择热门的嵌入式操作系统如freertos熟读源码理清嵌入式系统内部任务调度、内存管理、任务通信机制等基本原理,动手移植一款热门芯片如stm32f429,把tick跑起来,任务调度起来就OK了。为什么选热门芯片,因为各种坑前任都踩过,论坛咨询问题相当容易。然后就可以上手UNIX环境高级编程这本圣经了。一般而言,学完嵌入式系统,再学linux系统的进程通信、虚拟化等,你会发现比直接学习Linux要容易上手很多。对unix系统调用有了基本了解之后进行Linux应用开发基本难度不大了,如果有公司业务结合练手那是最好的。接下来就看自己的发展方向了,如果想在物联网深入发展,可以移植一下A核,对中断处理会有更深刻的理解。如果想从事网络或者后台开发,可以多熟悉网络协议栈,这里推荐lwip入门,里面给出了TCP、UDP协议规范的完整代码实现,对理解tcp慢启动、拥塞控制、socket编程帮助相当大。
6、 不要急于挑选产品经理等管理类岗位,只有多跟几个大型项目,多玩几个迭代,才能对大厂的项目落地流程玩法了然如胸,才能跟各种老油条码农供应商扯皮。对需求理解不清,分分钟被老员工玩死。
7、 也是一句题外话,前面几年虽然工资不多,但是一定要养成存钱的良好习惯。当你身无分文来到深圳,住着900的农民房,吃着广东烧腊,再看看关外五六万的房价,你就知道深圳的生存有多么艰难。唯有努力才是解决社会问题的基础,如人饮水冷暖自知,很多事情只有自己经历了各中酸楚才知道。
振动测试
对于想学习嵌入式或者软件编程的同学,可以私信我,可以分享基本入门电子书(淘宝买开发板送的)。