什么样的前景能叫做一片灰暗?
当你捧着计算机科学与技术专业的硕士学位证书,工资却比不上其他专业本科毕业生,而且还比别人工作累,难升职少加薪的时候,这前景就真的是一片灰暗了。
然而实际上,2019年,IT行业薪酬水平稳居榜首,年平均工资为161352元;排在第二的是科学技术,为133459元;排在第三的是金融,为131405元。
再看看下面这张图,更直观了,有70%的程序员薪酬在十万以上。
这都前景灰暗,那其他行业岂不是......
我已经想不出词语来形容那种惨状了。
如何做一个前景光明的程序员?
学技术、学技术、学技术,还是学技术。
程序员这个行业是不是吃青春饭我不确定,但一定是靠技术吃饭的。很多人带着劳动密集型的思维来做技术密集型的事情。
体力劳动的附加价值能有多高?
而且程序员这个行业的出现真的拯救了很多不擅长混职场、不愿意与人打交道的人,只要你能解决问题,哪怕你不说话,你的老板也照样给你加薪。
因为他怕你「不小心」写了一堆bug,怕你跳槽。
但这一切都是建立在你的「无可替代性」上的,如果你只会敲敲基础代码,搬搬轮子,百度一下,那你就很容易被替代,你没有底气没有筹码谈待遇,因为这些工作是体力活而不是脑力活,而程序员应该是建筑师而不是搬运工。
如何提升自己?
有两个大方向:
- 提升广度
- 钻研深度
如果你选择第一个方向,那就可以尝试做一名全栈工程师,而所谓全栈工程师是指掌握多种技能,胜任前端与后端,能利用多种技能独立完成产品的人。
朝这个方向发展,不需要你每个方向的技术都学得多么深入,每一种语言掌握80%左右即可。你可能解决不了很多高深的技术难题,但你可以一个人解决前后端大部分的问题。而且因为对开发工作全局的了解都很熟悉,是离项目经理最近的开发人员。
而如果你选择第二个方向,就要求你将某个技术领域的某一门或两门编程语言学习透彻,要做到这个技术领域上的所有问题到你这里都能得到解决。而常见的技术领域包括前端、后端、移动端、iOS开发等传统领域,还有近几年兴起的人工智能、大数据分析、物联网等。
这里给大家分享一下我自己的学习思路:
- 学习基础知识
- 巩固基础知识
其中学习基础知识,又有两点要注意的:找对方向、用对方法。说的更直白一点就是学什么以及怎么学。
学习内容
首先要将基础打牢固,最基本的算法和数据结构一定要滚瓜烂熟,我当时是要求自己拿起来就能用。
比如下面这些个算法和数据结构类型我是硬逼着自己啃下来的,很多兼职的时候没用上,但是后来回归工作的时候用上了。
10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;
不要小瞧了这小小二十组词,展开了去学,怎么都得花你个一年半载,例如单单排序算法就又可以分为以下十种:
然后,当将这些基础知识吃透了之后,注意是吃透,我给自己定的要求是用到的时候就能直接用而不是回去再翻书。做到这一点之后,我就接着去学习一些更深入的内容:
比如:
- 编程框架是如何运转起来并输出“Hello World”的?
- 如何让自己更正规,更有章法地使用Mysql呢?
- Key、List、Hash、Set、ScoreSet各自的使用场景有何不同?
- 主流的编程框架都和设计模式相关,那他们有没有共通性?
当我把这些问题想清楚了的时候,我发现之前的很多问题都难不倒我了。
学习方法
每个人的学习方法都不一样,有的人喜欢边做项目边学习,有的人则喜欢学一段时间做一个项目,有的人喜欢看书学,有的人喜欢看视频学,这些都不是问题,重要的是找到适合你自己的。
但下面这几点,最好还是不要去做了,因为这些坑这些痛我都已经经历过了,头发也掉过了,结果事倍功半惨不忍睹。
1.一味的对着别人的代码去敲。
刚开始不会做只有跟着别人敲,这没有关系。但是跟着别人敲了之后一定要自己理解自己记忆把它变成自己的东西。照着别人代码敲一遍两遍哪怕三遍,除了让我看得仔细点,除了打字外没有其它任何帮助。哦,对了,还多掉了几根头发。
所以要记住模仿复现不是关键,思考才是关键。要能做到思考学习别人思路后,脱离书本和博客,完全自己实现功能。当我做到这点之后,我发现我的学习才是有效的。
2. 想着一口气吃成个胖子
我刚刚说过了,自己是因为项目做不出来才回过头来学习的,所以刚开始急于求成,学习只学个大概只求个会用,没有做到知其然还知其所以然。
但是技术这玩意儿,不是看了个大概能照着做就会了,一口气真的吃不成个胖子,必须得扎扎实实地把事情做好。所以不要试图一次性解决所有问题,这里给个亲测有效的建议:可以将每天的学习过程拆分成小块,分阶段学习,这样的效率会更高些。
说完了第一点如何学习基础知识,接下来再说说说说第二点如何巩固基础知识。方法千千万,我也试过不少,但最有效的我认为还是刷题,有方法的刷题。
下面这个刷题方法很普通但也很实用,推荐给你:
第一遍:可以先思考,之后看参考答案刷,结合其他人的题解刷。思考、总结并掌握本题的类型,思考方式,最优题解。
第二遍:先思考,回忆最优解法,并与之前自己写过的解答作比对,总结问题和方法。
第三遍:提升刷题速度,拿出一个题,就能够知道其考察重点,解题方法,在短时间内写出解答。
然后给大家推荐我当时看的两本书还有一些学习网站,能够让大家学得更轻松些。
书:
- 《代码大全》激发你的思维并帮助您构建高品质的代码。
- 《程序员修炼之道》全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱。
网站:
- 1GitHub — 开发者最最最重要的网站:https://github.com,能学习但不只是学习。
- W3school — 最适合新手的网站:https://www.w3school.com.cn/:免费而且全面。
- 实验楼 — 一个在线编程学习网站: https://www.shiyanlou.com/courses/,很方便实用。
- Code School — 一个英文学习网站:https://www.pluralsight.com/codeschool,支持分阶段挑战。
最后一步肯定还是要落在实操的,我的方法是接兼职项目、一个接着一个,因为要供着自己旅行。但其实还有两种方法也能提升自己:
1.做一些实操性强的个人项目,自己练练手
田纳西大学助理教授奥斯汀·亨利结合自身经验,给出了一份“程序员都应该尝试的挑战性项目”清单,包含下面六个项目,我在那之后做了一遍觉得还不错,推荐给大家:
文本编辑器
- 2D游戏-太空侵略者
- 编译器-Tiny BASIC
- 迷你操作系统
- 电子表格
- 电子游戏机模拟器
每一个项目都存在不同的挑战,比如文本编辑器就要求在不使用GUI框架中内置的文本框组件的情况下,搭建支持光标移动、选择、插入和删除操作的文本框并将文本文档存储在内存中。
如果你能解决掉这些项目中的这些问题,然后把项目独立完整的做出来并且运行成功,你的能力肯定能再上一个台阶。
2.写技术文章
大家想必都知道费曼技巧,这也是其中的一种应用了,把你自己弄懂的东西教给别人,让别人也能看懂,在这个过程中你肯定还是要把一个完整的项目给做出来的,一整套下来,你会将自己理解的东西掌握的更透彻更深入。
也算是一种不错的实操方式了,能让你的基础更加牢固。
只是要记住,在这个不断做不断输出的过程中,做到下面这三点很重要:
- 让编程成为一种习惯。
- 学练结合,从做项目中找知识漏洞。
- 思考更深层次,更底端的东西。
现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。如有需要获取资料文档的朋友,可以点击我的GitHub免费获取!
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。