码了几年代码的程序员,有一定的开发经验,应该如何提升自己?

反问:

1、码了几年是指3年、5年、10年、15年还是20年?

2、有一定的开发经验?这个“一定”怎么区分?

3、提升自己的编程能力?沟通能力?还是什么?

首先,时间是一个被动因素。时间经历≠经验经历。只有有意识的提升自己的能力,时间才能最大化被利用。

一定不要误认为,时间越久的程序员越吃香,关键要看这个时间久,是重复的时间还是刻意提升的时间。

其次,一定不要想当然的认为经验丰富。经常看见面试者的简历里有一定的经验,有深入的经验,结果才问了三个相关问题,就开始说得模糊不清。这样的经验一听,就知道只是知道大概的概念,会简单的使用,根本谈不上深入,练“一定”都达不到。

一定的经验,至少说,要清楚安装使用,常用的用法,优缺点适用不适用场景,深入则要对进本原理有过初步的研究,知道如何参考模式设计新模式,落地实践避免踩坑等。

经验不是说出来的,而是不断实践总结提炼出来的。

最后,要搞清楚现在到底想要提升什么?先搞清楚what,再去想how,这样效果才是最好的,不要说,别人都说提升自己,那自己也跟着提升自己。

你自己到底缺失在哪里?哪些是掌握的?哪些只是知道表面?只有你最清楚。

关于提升自己,我有三点建议:

1、不断学习

2、持续实践

3、反思修正

类比到编程上,可以是不断学习经典的设计模式,也可以是不断学习新的流行技术,关键在于去学习。

然后,在实践中应用,发现问题,记录问题。

第三步,总结反思,多问why,多问换个场景能不能用,然后再去实践。

总结一下,方法很简单,简单到大多数人都忽略,但是只要真正做完过的人都知道,每一步都不简单,能发散出很多很多点出来。

提升自己,不是一天就能完成的,需要的是持续的行动。


多了解行业,理顺一个行业的业务,然后用软件去解决它,这就是软件的价值!


既然已经码了几年代码了那么基础方面应该是不会太差了,提升的话就要看你发展的方向了。前端的话可以学习新的框架,后端也可以尝试一下前段做全栈开发。当然如果你对大数据和人工智能领域有兴趣的话也可以尝试学习一下,提升自己最好选择一个自身感兴趣的方向不然就是浪费时间。有空的时候去git上多看几套源码,多看看书特别是基础知识方面只有扎实的基本功才能有为后续的提升提供不断的动力。


程序员的天花板从来不在程序方面,多学点别的


Java中编程最常见的套路编程:先写Action层,再写Service层,再写Dao层这种方式基本都已经有10几年的历史了,这种工业代码就是这样,你要想提高编程能力,主要还是编程思想,多看看源码,多上GitHub上找点优秀的开源项目看看,多自己练练手,多多少少还是有点裨益的。


接触过很多的程序员大家都有同样的困惑,就是项目不论大小都是做过的。也感受到过项目做成的喜悦,当然也有受挫。可是把自己拿出来觉得还不算是高手,和真正很厉害的程序员相比差距还是有的。其实程序员想要提升自己,就是要不满足现状。

1.基本功是要扎实的

这里我指的是离散数据、数据结构还有算法、操作系统、编译原理等等,这些都是计算机专业的基本课程。不要因为工作几年了就觉得这些东西不重要了。虽然这些基础更偏理论一些,但是实际项目当中还是需要它们来做支撑的。其实我们回头看来,在很多的项目当中的瓶颈都是因为基本功不扎实造成的。所以我们现在就回顾基础知识。当了有了很多经验再回头去看的时候,一定发现已经有了不同角度的理解。

2.从现在开始养成良好的编程风格

也许大家都有自己的编码风格,在这里给大家的建议是不管之前是什么风格的。我们从现在开始都养成好的习惯,也就是变量命尽量开始,规则都统一。代码行缩进编排。大家都知道该怎样排除代码中的错误,但是往往忽视了对注释的排错。但是注释也是程序的一个重要组成部分,它可以是你的代码变得更加容易理解,如果代码已经清晰的表达出来了我们的思想,那么就不需要再去加注释了。如果注释和代码不一样,真的是很糟糕的习惯;

3.多读源码

题主说的是有几年代码经验的程序员,那么也就是大家都是可以写的程序员。那么如何能让自己的程序写的更好,除了上面一条养成风格以外。我们还可以多去看别人的源码,这里不是说谁的什么项目的都要去看。选择一些经典的源码。

比如我们要研究操作系统的程序员就可以深入的读一下linux最早起版本的源代码

如果想要研究数据结构和算法的话就可以仔细的读一下STL库或者是boost库

读源码的话一定是要细读的,深入理解其中的含义。主要在这里就是锻炼自己能跟的上编写者的思维。时间久了,我们读这些东西都会成为自己的,并且咋实践中得到应用。

4.多思考和交流

程序员需要的不仅仅是coding,还要大量的时间去思考问题,也许这就是我们“秃”的原因。有的时候思考的时间是远远的大于coding的时间的。不要着急手动代码,一个新的项目需求,如果没有进行足够的分析和设计就直接动手去写的话,大家都知道bug一定很多。要留出来思考的时间,一直到把需求分析透了,并且在编码的过程中会遇到很多的问题,并且都解决了在开始编码。另外就是多交流,三人行必有我师,三个臭皮匠顶一个诸葛亮,多问问身边人的问题看法会对我们有很大的帮助和启发。


谢谢邀请,问这个问题你一定是处于迷惘期。

这个阶段要累积经验和开拓知识面,开始构建自己的知识体系,构建自己的技术栈,选定开发的软件类型,比如电商系统,还是企业管理系统,还是视频软件,还是音乐软件等等。这个阶段要选定自己要深入研究的领域,并扎进去。

如果是决定基础知识体系不足,是可以先把基础学科全部过一遍。

深入解剖和研究一些顶级开源项目的源码也有助于你的提升。

物色一个专业而靠谱的团队并成为一员也是大有作用的。

以上是我的分享,祝你编程愉快。


1.多看书,尤其是各种中间件,数据库,协议的实现,语言的基础

2.不断重构现有的项目,个人认为,无论工作经验多少年,每次对一个系统进行重构,都会有新的认识

3.尝试自己编写或参与开源项目

4.进入一家大型公司核心部门,参与大规模,大数据量,高并发项目设计和开发

5.参加大会,与行业内高手交流

6.考取企业认证,rhcaocm等

7.重复造轮子,实现常用的中间件,缓存系统等

8.在大型公司吸取经验后进入中小型公司,成为leader,架构师,架构设计一个业务系统或大型项目


关于题主所关注的,我目前也面临这个问题,工作了三年多后,技术到了一个瓶颈,管理上不上、下不下的那种,工作繁忙之余,可选择的发展方向受限,而没有明确的目标,又困于目前资本寒冬的大形势,面对如此严峻的环境,使人不能不居安思危。未来将走向何方,又怎么熬过这个寒冷的冬天,有时忧虑到彻夜难眠。或许遇到了什么情况都能接受吧,但是要面对总还需要勇气,但技术总要有努力的方向,无论从什么角度出发,任何时候,有所准备总是不会错的。

我也将我接下来的计划做一个分享,希望对于同处于迷途中的小伙伴一些帮助,同时也是对自己计划的进一步梳理和清晰。初步的计划是在JAVA虚拟机和源码方面下功夫,同时在理解中间件技术的基础上,增加对系统架构的理解,加强应对复杂业务场景的架构能力,同时结合经历过的电商场景,针对一些特殊场景的设计能力。

具体的,深入阅读并消化JAVA虚拟机,增加对JAVA内存模型和JVM调优的认识,结合同事的分享,让自己在这一领域有自己的认识。花一定的时间去研读Dubbo中文文档,并结合ApacheDubbo源码,在原有Dubbo理解的基础上,深入理解其内部实践机制,达到对Dubbo源码有一定了解的同时,学习其编码风格,增强自己的编码能力。在这两块之外,一直在做的JDK源码和Spring源码的研读需要进一步加快,同时取得一定收获。在有余力的基础上,Netty、RocketMQ等相关的源码或许也有一定研读的必要。除此之外,在实用性方面,增强对SpringCloud的生态的理解和实践,在强化原有Eureka、Consul、Feign、Ribbon、Config、Zuul等认识的基础上,了解Stream、Task、Sleuth、DataFlow等对应的业务场景和设计原理。除此之外,刷leetcode试题也是一个不错的途径。

我要分享的大致就这些,个人的想法比较零碎,但是只要坚持下去,相信自己会有所收获,对所谓的中年危机,也将更有信心去面对。

作者:夕阳雨晴,欢迎关注我的号。偶尔美文,主流Java,为你讲述不一样的码农生活。


谢谢邀请。

不管是开发、测试、运维,每个技术人员心里多多少少都有一个成为技术大牛的梦,毕竟“梦想总是要有的,万一见鬼了呢”。正是对技术梦的追求,促使我们不断地努力和提升自己。

Domore

我在HW的时候,负责一个版本的开发,这个版本的工作量大约是2000行左右,但是我除了做完这个功能,还将关联的功能全部掌握清楚了,代码(大约10000行)也全部看了一遍,做完这个版本后,我对这个版本相关的整套业务全部很熟悉了。经过一两次会议后,大家发现我对这块掌握最熟了,接下来就有趣了:产品讨论需求找我、测试有问题也找我、老大对外支撑也找我;后来,不是我负责的功能他们也找我,即使我当时不知道,我也会看代码或者找文档帮他们回答。最后我就成了我这个系统的“专家”了。虽然这个时候我还是做业务的,还是写业务代码,但是我已经对整个业务都很熟悉了。

以上只是一个简单的例子,其实就是想说:要想有机会,首先你得从人群中冒出来,要想冒出来,你就必须做到与众不同,要做到与众不同,你就要做得更多

怎么做得更多呢?可以从以下几个方面着手:

1)熟悉更多业务,不管是不是你负责的;熟悉更多代码,不管是不是你写的。这样做有很多好处,举几个简单的例子:需求分析的时候更加准确,能够在需求阶段就识别风险、影响、难点。

问题处理的时候更加快速,因为相关的业务和代码都熟悉,能够快速的判断问题可能的原因并进行排查处理

方案设计的时候考虑更加周全,由于有对全局业务的理解,能够设计出更好的方案

2)熟悉端到端

比如说你负责web后台开发,但实际上用户发起一个http请求,要经过很多中间步骤才到你的服务器(例如浏览器缓存、DNS、nginx等),服务器一般又会经过很多处理才到你写的那部分代码(路由、权限等)这整个流程中的很多系统或者步骤,绝大部分人是不可能去参与写代码的,但掌握了这些知识对你的综合水平有很大作用,例如方案设计、线上故障处理这些更加有含金量的技术工作都需要综合技术水平。

“系统性”、“全局性”、“综合性”这些字眼看起来比较虚,但其实都是技术大牛的必备的素质,要达到这样的境界,必须去熟悉更多系统、业务、代码。

3)自学

一般在比较成熟的团队,由于框架或者组件已经进行了大量的封装,写业务代码所用到的技术确实也比较少,但我们要明白“唯一不变的只有变化”,框架有可能要改进,组件可能要替换,或者你换了一家公司,新公司既没有组件也没有框架,要你从头开始来做。这些都是机会,也是挑战,而机会和挑战只会分配给有准备的人,所以这种情况下我们更加需要自学更多东西,因为真正等到要用的时候再来学已经没有时间了。

以java为例,大部分业务代码就是if-else加个数据库操作,但我们完全可以自己学些更多java的知识,例如垃圾回收,调优,网络编程等,这些可能暂时没用,但真要用的时候,不是google一下就可以了,这个时候谁已经掌握了相关知识和技能,机会就是谁的。

以垃圾回收为例,我自己平时就抽时间学习了这些知识,学了1年都没用上,但后来用上了几次,每次都解决了卡死的大问题,而有的同学,写了几年的java代码,对于stop-the-world是什么概念都不知道,更不用说去优化了。

Dobetter

要知道这个世界上没有完美的东西,你负责的系统和业务,总有不合理和可以改进的地方,这些“不合理”和“可改进”的地方,都是更高级别的怪物,打完后能够增加更多的经验值。识别出这些地方,并且给出解决方案,然后向主管提出,一次不行两次,多提几次,只要有一次落地了,这就是你的机会。

例如:

重复代码太多,是否可以引入设计模式?

系统性能一般,可否进行优化?

目前是单机,如果做成双机是否更好?

版本开发质量不高,是否引入高效的单元测试和集成测试方案?</p&;<p&;目前的系统太庞大,是否可以通过重构和解耦改为3个系统?

阿里中间件有一些系统感觉我们也可以用,是否可以引入?

只要你去想,其实总能发现可以改进的地方的;如果你觉得系统哪里都没有改进的地方,那就说明你的水平还不够,可以多学习相关技术,多看看业界其它公司怎么做,BAT都怎么做。

我2013年调配到九游,刚开始接手了一个简单的后台系统,每天就是配合前台做数据增删改查,看起来完全没意思,是吧?如果只做这些确实没意思,但我们接手后做了很多事情:

解耦,将一个后台拆分为2个后台,提升可扩展性和稳定性;

双机,将单机改为双机系统,提高可靠性;

优化,将原来一个耗时5小时的接口优化为耗时5分钟

还有其它很多优化,后来我们这个组承担了更多的系统,后来这个小组5个人,负责了6个系统。

Doexercise

在做职业等级沟通的时候,发现有很多同学确实也在尝试Domore、Dobetter,但在执行的过程中,几乎每个人都遇到同一个问题:光看不用效果很差,怎么办?

例如:

学习了jvm的垃圾回收,但是线上比较少出现FGC导致的卡顿问题,就算出现了,恢复业务也是第一位的,不太可能线上出现问题然后让每个同学都去练一下手,那怎么去实践这些jvm的知识和技能呢?

Netty我也看了,也了解了Reactor的原理,但是我不可能参与Netty开发,怎么去让自己真正掌握Reactor异步模式呢?

看了《高性能MySQL》,但是线上的数据库都是DBA管理的,测试环境的数据库感觉又是随便配置的,我怎么去验证这些技术呢?

框架封装了DAL层,数据库的访问我们都不需要操心,我们怎么去了解分库分表实现?

诸如此类问题还有很多,我这里分享一下个人的经验,其实就是3个词:learning、trying、teaching!

1)Learning

这个是第一阶段,看书、google、看视频、看别人的博客都可以,但要注意一点是“系统化”,特别是一些基础性的东西,例如JVM原理、Java编程、网络编程,HTTP协议。。。。。。等等,这些基础技术不能只通过google或者博客学习,我的做法一般是先完整的看完一本书全面的了解,然后再通过google、视频、博客去有针对性的查找一些有疑问的地方,或者一些技巧。

2)Trying

这个步骤就是解答前面提到的很多同学的疑惑的关键点,形象来说就是“自己动手丰衣足食”,也就是自己去尝试搭建一些模拟环境,自己写一些测试程序。例如:

Jvm垃圾回收:可以自己写一个简单的测试程序,分配内存不释放,然后调整各种jvm启动参数,再运行的过程中使用jstack、jstat等命令查看jvm的堆内存分布和垃圾回收情况。这样的程序写起来很简单,简单一点的就几行,复杂一点的也就几十行。

Reactor原理:自己真正去尝试写一个Reactor模式的Do,不要以为这个很难,最简单的Reactor模式代码量(包括注释)不超过200行(可以参考DougLee的PPT)。自己写完后,再去看看netty怎么做,一对比理解就更加深刻了。

MySQL:既然有线上的配置可以参考,那可以直接让DBA将线上配置发给我们(注意去掉敏感信息),直接学习;然后自己搭建一个MySQL环境,用线上的配置启动;要知道很多同学用了很多年MySQL,但是连个简单的MySQL环境都搭不起来。

框架封装了DAL层:可以自己用JDBC尝试去写一个分库分表的简单实现,然后与框架的实现进行对比,看看差异在哪里。

用浏览器的工具查看HTTP缓存实现,看看不同种类的网站,不同类型的资源,具体是如何控制缓存的;也可以自己用Python写一个简单的HTTP服务器,模拟返回各种HTTPHeaders来观察浏览器的反应。

还有很多方法,这里就不一一列举,简单来说,就是要将学到的东西真正试试,才能理解更加深刻,印第安人有一句谚语:IhearandIforget.IseeandIrber.IdoandIunderstand,而且“试试”其实可以比较简单,很多时候我们都可以自己动手做。

当然,如果能够在实际工作中使用,效果会更好,毕竟实际的线上环境和业务复杂度不是我们写个模拟程序就能够模拟的,但这样的机会可遇不可求,大部分情况我们还真的只能靠自己模拟,然后等到真正业务要用的时候,能够信手拈来。

3)Teaching

一般来说,经过Learning和Trying,能掌握70%左右,但要真正掌握,我觉得一定要做到能够跟别人讲清楚。因为在讲的时候,我们既需要将一个知识点系统化,也需要考虑各种细节,这会促使我们进一步思考和学习。同时,讲出来后看或者听的人可以有不同的理解,或者有新的补充,这相当于继续完善了整个知识技能体系。

这样的例子很多,包括我自己写博客的时候经常遇到,本来我觉得自己已经掌握很全面了,但一写就发现很多点没考虑到;组内培训的时候也经常看到,有的同学写了PPT,但是讲的时候,大家一问,或者一讨论,就会发现很多点还没有讲清楚,或者有的点其实是理解错了。写PPT、讲PPT、讨论PPT,这个流程全部走一遍,基本上对一个知识点掌握就比较全面了。

后记

成为技术大牛梦想虽然很美好,但是要付出很多,不管是Domore还是Dobetter还是Doexercise,都需要花费时间和精力,这个过程中可能很苦逼,也可能很枯燥,这里我想特别强调一下:前面我讲的都是一些方法论的东西,但真正起决定作用的,其实还是我们对技术的热情和兴趣!

我是一名架构师,欢迎关注,了解更多技术上的那些事儿


一位优秀的Java程序员应该具备哪些技能?写了几年代码了,我该如何提升自己?这是大多数工作1-3年Java程序员们都关心的问题。

1、高级程序员/架构师技能图谱

现将我整理的一份高级Java程序员技能树分享给大家,希望能给工作1-3年的程序员们厘清思路、指明方向。

由于篇幅关系,还有很多技能树内容就不一一列举了,想要领取完整学习技能图谱,文末有领取方法。

2、深度基础上延展广度

我在这里先说明一下,技能树所列举的内容并不是让大家全部都要会,这既不科学也不现实,建议大家先专注1-2门深入钻研做到精通,在此基础上,再广泛学习延伸技术广度,精通意味着你在这个领域是专家,你拥有这个领域的核心竞争力,而广泛学习,即你会得越多,市场竞争力越高,收入也会更高!

3、系统高效学习事半功倍

如何才能系统高效地学习提高,送你最新整理的高级java/架构师学习资料包,助力进阶。

1、程序员高赞的经典学习图书9本;

2、技术进阶系列专题资料合集88期(配合图谱,学习更科学);

3、完整学习技能图谱(知识点一目了然,上图只是其中一部分技能树)。

领取方法:关注优知学院,转发+私信发送关键词【架构师进阶】,立即领取。

2019学习就要先人一步!坚持学习,每天进步一点,至少能让我们成为一个比大部分人优秀点的人。

如果觉得有用,请点赞支持下~


原始地址:/baike/623.html