代码能力遇到瓶颈了,如何提升?

李振亚love


代码能力遇到瓶颈的话,你要和其它人比较一下,你的水平处在整个行业的哪个阶段,如果是初级阶段的话,说明你的能力还有很大提升,那么就要多看其他人的优质代码,多看源码,或者通过一些书籍学习怎么写出好的代码,对于优质代码要询问别人为什么这么写,有什么好处或优点,这样才能才能突破自己的瓶颈。

如果你的水平已经到达中级的水准,说明你的代码写的比较优质了,你可以学习下设计模式,要知道每个设计模式使用的场景是什么,每个设计模式使用的时候有什么优点和缺点,为什么要使用这种设计模式,你在写代码的时候有没有用过这种设计模式,要理解到设计思想的精髓,你可以用学到的思想把自己项目中的代码重构下,证明自己确实学到了,学会了。

如果你已经到了高级开发的阶段了,代码层面可能确实到极限了,你可以学习下架构的设计,你的项目用到了什么框架,这种框架的优势在哪里,有没有可替代性,有没有成本更低的框架选择,扩展性怎么样,是否高可用等等,要学习的东西有很多,只要用心学习总能学习到心的东西,提升自己的价值,提高在公司的地位。


JAVA异世界


作为一名IT行业的从业者,同时也是一名教育工作者,我来回答一下这个问题。

首先,对于程序员来说,代码编写能力必然会经历多次的上升瓶颈期,每一个瓶颈期都需要有不同的解决方案。

对于初级程序员来说,要想突破自身的代码编写能力从而成长为主力程序员,需要从三个方面入手,其一是注重开发知识的全面性;其二是注重各种开发模式的掌握;其三是注重开发工具的运用。对于大部分初级程序员来说,成长为主力程序员往往只是时间的问题,通常能够勇于承担新任务的程序员会获得更快的发展速度。

对于主力程序员来说,如果想进一步提升自己的编码能力,则需要选择一个自己的主攻方向,有了主攻方向才能不断深入相应的技术体系。在技术方向的选择上既应该考虑到岗位任务的需求,同时也要考虑到未来的发展趋势。从目前IT行业的技术发展趋势来看,大数据、云计算、人工智能、区块链等技术方向都是不错的选择,而且这些方向下面也有很多细分的方向,可以根据自身的实际情况进行选择。

在突破代码编写瓶颈的过程中,应该多与技术专家进行交流,交流的过程也是学习的过程,而如果有条件读研,通过读研来突破代码能力也是一个不错的选择。代码编写问题说到底就是数学问题,所以要想能够不断提升自身的代码编写能力,一定要注重数学知识的学习。

最后,自身所处的开发团队对于程序员能否不断突破编码瓶颈也有比较直接的影响,所以程序员应该注重开发团队的选择。

我从事互联网行业多年,目前也在带计算机专业的研究生,主要的研究方向集中在大数据和人工智能领域,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。

如果有互联网、大数据、人工智能等方面的问题,或者是考研方面的问题,都可以在评论区留言,或者私信我!


IT人刘俊明


心态上放轻松,瓶颈期很正常不过,其次就是坚持,过了这个瓶颈期就是进步。方法论上,我个人觉得有两条路。一是自我主动提升,被动反馈,二是找高手请教,主动反馈。

所有的能力提升,方法都是相通的。任何技术在学会之前都感觉很难,学会之后感觉很简单,难者不会,会者不难。在不会之前,尤其是瓶颈期,会让很多人放弃。

观摩别人

以我学游泳为例,蛙泳很简单很快,一两个月可以入门。但学自由泳时,遇到了各种瓶颈,陆陆续近一年才游得有点样子,终于学会呼吸。中间过程是在泳池里各种喝水,卡在呼吸上。最终是通过观看各种视频,琢磨才慢慢会呼吸。

代码能力也一样,观摩别人的代码,尤其是自己领域高手的代码,以java为例,看看openjdk的源码,比如hashmap的设计,从数组到链表到红黑树。要去琢磨为什么这样设计。java的源码,可以认为是经过千锤百炼的。

点评: 学习并思考专家的源码,千锤百炼的代码,值得向书法一样反复临摹。

专家反馈

现在想来,可能当时请个专业教练指导下,可能游泳不会学得这么辛苦。教练可能一眼就能发现你的问题在哪里。

编程也一样。把你的代码,让专家review下,高水平专家的反馈,再加上自己的练习,能让你的代码水准快速上一个阶梯。能让你少走很多弯路。

点评: 有点像深度学习,从预训练的模型学习很快就能收敛,而从头学可能要很久很久。预训练的模型,就是专家的反馈。


授之以鱼,不如授之以渔。希望能早日突破瓶颈,超越自我。


平凡科技


代码能力总的来看表现在两个方面:代码的设计和代码的性能;


1.代码的设计

小的方面讲你需要遵循设计原则,以及各种设计模式;大的方面讲整个系统需要合理的架构;

六大设计原则:单一原则,里氏替换原则,依赖倒置原则,接口隔离,迪米特原则,开闭原则;

设计模式:包括23种设计模式包括:单例,工厂,组合模式等等;

架构:架构要讲的东西太多了,我个人觉得最重要的是根据自己的项目选择合适的架构,没有一种架构适用所有项目;所以这个就需要你了解各种组件的优缺点,比如是用rpc还是mq,用本地缓存还是分布式缓存,用什么数据库,mq也有很多种该选择哪个等等,所有的这些都需要有丰富的使用经验,进行择优选择;


2.代码的性能

小的方面讲你需要了解数据结构,每种结构的使用场景;另外其实我们往往使用的是一些封装好的数据结构,所以你需要去看源码,了解其实现机制,这样才能写出高性能的代码;

大的方面讲如果提高整个系统的性能,比如同步转异步,缓存机制,数据库优化等等


最后说一点就是多去看优秀项目的源码,会潜移默化的提升你的能力


ksfzhaohui



这还是要根据具体情况具体分析。

我们来一个个剖析问题。

第一个问题。“写出来代码质量不高,经常写bug”。

先问自己一个问题:这种bug一般是源于什么?

  1. 打字问题。例如莫名其妙就是会把逗号打成中文的;
  2. 逻辑问题。主逻辑就有问题,在算法上出错;
  3. 细心问题。处理不好边界情况,永远都在特殊输入上卡壳,导致多次返工。

如果是1,我想一个值得考虑的建议是:打字尽可能慢。写代码出现符号打错的情况绝对是缺少训练的表现,在多做算法题(例如LeetCode等)之余,尽可能让自己慢下来,就可以避免很多错误。

如果是2,说明自己的逻辑无法与计算机逻辑紧密贴合,有出现跳跃甚至紊乱的情况,那么我推荐你在LeetCode上刷题练习。要使逻辑贴合倒是不需要追求什么复杂的算法,但是一定要把“模拟法”彻底搞透。即使是再复杂的逻辑,只要它可以纯靠模拟来做,你都应该能够轻松应对。

对于这一点,

  • 我推荐的一种学习方式是:写代码时,学会先写伪代码。伪代码如何写?可以参考我后面第三个问题讲“注释一团糟”时举的例子。伪代码和注释有时候其实是一个东西。
  • 我推荐的一种训练方式是:使用LeetCode上中等难度的题目来刷。中等题目的难度不追求一些奇巧,但是算法逻辑又不会像简单难度的题目那样过分简洁明了。LeetCode中等难度题库

如果是3,说明对于边界输入缺乏经验。例如0的输入,过大过小(过多过少)的输入等等。针对不同的问题,会有不同的边界情况。如果是这方面有问题,我建议你可以在任何的Online Judge上阅读它们的题解,阅读题干和题解中的边界情况解析,培养自己的“边界思考”。边界是最能有相通之处的,广泛阅读之后,以后在遇到任何具体问题,你都可以条件反射问自己:“输入特殊的…会是什么情况?”这种自我追问源自你曾经多次在不同题目的题解中见过的边界处理。

第二个问题。“发现有新的需求,原来的架构接口通通要重写”。

有新的需求,为什么架构接口需要重写?

说明原先的设计不好。

对于这一点,我推荐你学习“设计模式”。并不是要求我们要在实际代码开发中一定要用什么模式,这未免太局限和拘泥了。我们的目的是借助模式的学习,以培养自己的设计思想。

推荐你可以购买一本书《Head First设计模式》,会从具体的业务场景切入展开设计模式,读起来并不枯燥,讲的也很清楚。

第三个问题。“注释一团糟”。

注释不能过于细致,更不能过于宽泛。

我们先来讲讲写注释的目的,从目的出发,来看我们如何写注释。

一般人认为的写注释的目的:在未来给其他程序员看,或者未来给已经缺失代码记忆的自己看,能够迅速理解上手代码。

我们来更具体剖析一下这个目的,我想应该是这样的:

写注释的目的:在现在付出一定代价写注释,在未来节省更多的代价来上手代码。

如果现在不写注释,未来看代码无疑是非常辛苦的。如果写太多,现在承受的代价又太大。正是这种权衡能力的缺失,导致你写注释非常痛苦、收效又不好。

那么如何把握写注释的量呢?

我们真正写代码的时候,自己的逻辑都是从概括到具体的过程。

举一个具体的例子。

我们有这样一个业务需求:

  • 用户有积分制度,收藏话题可以得1分。
  • 用户每个月收藏话题获得的积分不能超过50分。
  • 用户当月内重复收藏同一话题只能得1分。
  • 用户收藏新话题获得积分时,系统需要对用户发出积分变更的通知。

那么我们写代码时,我们的思考过程是如何进行的?

当用户要对话题进行收藏时,我们考虑到有如下几个大步骤:

  1. 检查用户的当月积分是否已经达到上限
  2. 检查用户当月内是否已经收藏过这个话题
  3. 如果上面两个都ok,就准备进行加分,把积分刷新到数据库里
  4. 向用户发送积分变更通知
  5. 内存或磁盘里记录一下:该用户当月内收藏了这个话题
  6. 内存或磁盘里记录一下:该用户当月已经获得的积分

每个步骤可能都会涉及到其他一些方法的调用,或者几行代码。

你的逻辑应该是先想到这六点,然后分别进行展开。

所以你的注释,你的伪代码,其实就是这六行字。

//检查用户的当月积分是否已经达到上限 checkCurrentMonthPoints(userId); //检查用户当月内是否已经收藏过这个话题 checkIfCollected(userId,topicId); //如果上面两个都ok,就准备进行加分,把积分刷新到数据库里 PointDao.update(userId,points); //向用户发送积分变更通知 sendMessage(userId,message); //内存或磁盘里记录一下:该用户当月内收藏了这个话题 recordCollected(userId,topicId); //内存或磁盘里记录一下:该用户当月已经获得的积分 recordCurrentMonthPoints(userId,points);
作者:孑辞链接:https://www.zhihu.com/question/361571615/answer/940306156来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我这里也写了六个步骤对应的方法,但并不是说它们一定要封装到方法里。

在这些代码中,可能部分你是会调用到其他方法的,可能部分你就直接写在上面了,这都是可取的,根据具体的代码复杂度来看即可。

但是你的注释,应该就是这样的六行。你的伪代码,也应该是这样的六行代码。不用再细了,但是也不应该再宽泛了。

总结一句话:你写的注释,应该是你的整体代码从无到有的第一步逻辑。

除非你感觉有确切需要(不写就感觉以后真的会看不懂,而且你觉得未来真的有必要看懂这个细节),否则所有的注释都应该遵循这样的粒度规范。这并不过粗,也无需再细。


柴十八自媒体


提高代码能力无怪乎多看,多听,多写。多看大神的开源项目源码,看看大神是怎么写代码的。多听周围同事的建议和思路,集思广益。多写代码并不是瞎写,要写完后不断优化,从不同角度写,并测试效率。写的再好看,效率低等于个零。比如用递归实现,了了几行,但效率极低,不如用栈,虽然代码量上去了,但效率高啊。


程序猿有话说


做任何一件事都会有瓶颈期,所谓的瓶颈期有两个方面,一是评你个人的经验和知识水平达到了一个水准,在一段时间内无法得到提高,这种情况你还要不断学习创新,等积累到一定程度,即所谓的量变到质变的转换。另一方面就是你的能力和天赋已经到最大,不是你不努力,而是先天基因已经决定。


聪聪软件


找到行业圈子里面牛的人学习


分享到:


相關文章: