知乎热榜有个提问:一位准程序员学编程有一段时间了,但是经常被人吐槽编程不够严谨,比如写个计算器没有考虑用户输入特殊字符或者没有考虑到用户输入使用了错误的数据类型导致了溢出异常,感觉自己很菜,怀疑自己是否适合当程序员了?
相信很多新手程序员在最初遇到挫折时,都会有这样的疑问:我是否适合学编程?
这是由于新手程序员对自己的能力产生不自信,因为水平和知识面不足导致在实际编程中,到处碰壁。比如一个复杂的逻辑没有想明白,或者一个Bug 始终找不到问题所在,从而失去了继续学习的信心。
今天就和大家一起讨论新手程序员经常会遇到的问题以及如何去对自己的职业生涯做规划。
如何评估是否适合当程序员?
先看看我身边的两个真实故事:
小磊,本科大学是化学专业,毕业后由于本专业工作不是很好找工作,听说搞 IT 的待遇好、薪水高,于是参加培训班学习 Java。
在此之前,他没有任何计算机专业背景,连 Office、Windows 系统使用得不是很熟练。就是这样一位计算机小白,就因为人云亦云地进入这行业。
然而他在学习编程不到一个月后,就跟我说他学不下去了:编程这玩意太难了,老师布置的作业他根本就没思路,连个简单的 Java 程序都不会编写。比如老师要求他用 Java 实现一个纯 console 模式下的学籍管理系统,他不会写;还有很多基本计算机概念他更是完全不懂,比如什么是堆栈、Linux 系统的使用……
于是他怀疑自己,思考:“我是谁,我在哪里?我为什么会学编程?这玩意这么难,我真不会,我是不是不适合干这个?”
后来他觉得这一行的饭并不是那么好吃,经过一番尝试之后,他觉得自己不适合干这个,于是中途退出培训班,后来听说是回家做水产品生意(卖小龙虾之类的),干得还不错,平均一年收入几十万。
还有位朋友和小磊的背景很相似,大专大学英语专业,男,毕业后发现只会英语出去找工作没什么优势。
他自己是一个电脑爱好者, 大学期间自己攒配件组装电脑,对于各种硬件知识有一定的了解,平时爱倒腾各种软件和操作系统,对于Linux 也有一定了解,会一些基本的命令使用,虽然不深入,但也算有一定计算机基础。
他之前并未接触过编程,在毕业后他参加了编程培训,可能他对这方面有些天赋,老师上课教的基础知识他能很快地掌握并消化,并且在业余时间他也不断去看书并实践,在不停地学习、消化、实践中,他的编程水平提升很快。
虽然有时候他也会为一个逻辑没理顺而抓耳挠腮,但是他并没有被问题难道,而是不断去想解决问题的方案。遇到不会的就去查资料,由于其英文水平还不错,对于一些资料他都是先看英文文档,实在不会就去各种技术论坛去请教别人,就这样,经过两年的摸爬滚打,他的技术水平提升地非常快,从一个月薪 3000 块的初级工程师,成长为月薪 15000块的高级工程师。
三百六十行,行行出状元,适合自己才是最重要的。如果你在学习编程,希望成为一名程序员,也遇到了和知乎这位同学一样的困惑,对自己的职业发展产生了怀疑,开始问自己适合不适合干这行了,不妨问问自己几个问题:
我喜欢这个行业吗?
我有对即将从事的这行所需要的能力有进行过了解和评估吗?例如需要掌握哪些技能才能入行,我当前的能力是否达到了入行的能力?如果没有,我缺什么?该怎么去做才能提升能力。
我愿意投入很多的时间和精力去钻研学习所需的技术吗?
如果以上问题的答案在你心里都是肯定的,那么你只要方法运用得当加上自身坚持不懈的努力,我相信肯定会在一段时间内有很大的提升和进步,而反之我则建议你尽快在年轻的时候多去尝试下其他行业,哪怕你已经投入了一段时间去学习,但是这至少可以及时止损。
如何成为一名合格的程序员
作为一名在 IT 行业摸爬滚打多年的老鸟,我给各位分享一些自己的经验,希望可以帮助新人们少走弯路,快速成长。但是我要说明一点,这些建议的基础是你上面的几个问题都是肯定的前提之下,你再结合建议来做的话,是会给你的技术提升带来一些帮助的。
首先,理论加实践结合,缺一不可。
对于一些基础差的朋友在入行不久肯定会遇到一些知识点难以攻克,特别是零基础转行的朋友,可能只会培训班教的编程基础知识或自己买的编程类书籍或网上找的视频教程,可以看得懂,但不会写。
这类朋友我建议你看完视频或书之后一定要多花时间去练习,光看不练假把式。仅仅是看视频和书籍你是看不会的,必须要练习,其实计算机的一些专业相比较其他行业的门槛是很低的,一台电脑你就可以去学了。理论知识的学习很重要,但是实践同样非常重要。
新手程序员一定不要看中当前微薄的薪水,一开始入行,只要工资能够应付你的生活开支就可以了,给你开 3000 的工资和 6000 的工资其实并没有太大的区别。
以杭州为例,平均房价三万多,你拿这么点工资你能在这个城市买房立足吗?如果不能,你最应该做的事情是持续不断地学习,而不是在乎这一星半点的工资,然后找一个能够有机会提升能力的平台,投入更多的精力去巩固基础,把基础打牢固了。
其次,要勤能补拙,不停地学习。
正所谓熟能生巧,而且程序员所需要的知识并不仅仅是你会写代码就可以了,也并不是“一招鲜吃遍天”。
所需的专业性是非常强,并且软件迭代更新非常快,如果你仅仅是会一门编程语言的语法使用,你是永远也不会成为一名优秀的程序员的。
我身边很多开发同事经常会在好几种不同的编程语言之前来回切换使用,有的项目用 Python,有的项目用 Go,有的项目用 Java。
大家不要认为某某语言是世界上最好的语言,例如“PHP 是世界上最好的语言”这样的说法,如果你抱着这思想,那就完蛋了。
不同的编程语言其应用的业务场景是不一样的,各有各的优势和劣势。千万不要陷入语言的门户之争。
应该把宝贵的时间和精力用在提升自己的岗位专业能力的学习上去,比如操作系统原理、算法、网络协议、数据结构等基础学科的学习。
只会编程是写不出来什么好程序的,好的程序是由好的算法+好的数据结构而成的。基础知识一定要打扎实了。数据结构和算法以及网络协议并非是工作中你会用到,但在面试过程中,这些是程序员逃不掉的必问题目。
再次,仅仅是会上面这些,其实你还不能成为一名合格的程序员,因为在实际的项目里面,除了要会写业务逻辑,你还得和各种中间件打交道,比如数据库、Web 服务器等软件打交道,有时候可能系统出问题了,需要你去排查定位问题,并提出优化改进的建议。
这些软件可能又是一个知识体系了,你值得花精力去学习,虽不一定每一样都要学得非常精通,但也并不是仅仅停留在会简单使用这些软件,比如数据库,不要仅仅停留在会增删改查这种最基础的操作上。数据库的优化、数据库的原理值得你花精力去学习,这样在以后的系统设计中,你就知道如何去优化 SQL 语句提升性能,对一些查询慢的问题如何去定位是程序问题还是数据库的问题以及该如何优化。
推荐多阅读一些优秀的开源软件的源码,读别人的源码,看看优秀的程序员是怎么写代码的,他们为什么要这么实现。
最后,程序员要培养系统化学习的能力,要拒绝碎片化学习。
互联网时代很多知识都是碎片化的,其实碎片化学习并不能有效提升你的能力,你应该系统化地把某一个知识点和技术啃掉,这样在设计系统时才能把要考虑的问题想全面些。
对于新技术最好的学习方式是去看官方文档的说明,而不是去各种博客搜答案,这些二手知识首先并不一定适合你,其次这些二手知识太零乱了,如果官方文档确实找不到答案,才去尝试下搜索或者去各种论坛去提问。
精进:如何成为一名优秀的程序员
相信如果你照着上面的方法去不断学习和实践,并且真正的掌握了所需要知识点,你可以算是中级程序员了。
接下来你需要做的就是针对某一个方向花更多的精力和时间去钻研,使自己成为这个方向的专家。最好是你自己正在做的技术方向,如果把你的能力提升到在核心岗位“没你不行”的专业的话,即使你离职了,不投简历也会有其他大公司高薪挖人。
总结一句话就是:要让自己的能力不可被替代。
如何做到呢?:
成为某一个领域的专家,并参到该领域一些优秀的开源项目中,贡献自己的代码。例如你是做容器开发的,那么 Kubernetes 和 Docker 项目可以参与进去。
多参与该领域的技术论坛,分享自己的经验,让更多的人认识你,了解你正在做的事情,把自己的知名度打出去。另外,这样做也可以提升自己的演讲能力。
不要仅仅局限于写业务逻辑,如果有往管理方向发展的机会,一定不要错过。当你成为一名技术管理者之后,你看问题和思考系统架构设计等的问题时,眼界会开阔很多。
成为一名终身学习者,这个世界每天都在发生着巨大的变化,你不学习,就会被淘汰,尤其是年轻的时候,一定要不断地学习,避免人到中年时成为一名高龄低能的程序员。
劳逸结合,多锻炼身体。编程这事很辛苦,熬夜加班,996 都是常态。所以身体是革命的本钱,千万不要把自己的身体搞垮了。
好了,以上就是我给大家的一些建议,希望各位能够成为一名优秀的程序员。
作者简介:阿文,网易云担任高级工程师,在边缘计算、云计算领域有多年的从业经历,曾担任过讲师,主讲思科路由交换技术。个人博客地址:https://awen.me