‘壹’ 作为刚入职的java程序员,一年时间内如何提升自己的实力,更有竞争力
可以从以下几个方面入手:
第一:学习Java虚拟机知识。要想系统深入的了解Java语言中的各种概念就需要了解JVM(Java虚拟机)的体系结构和设计模式,JVM是Java语言的容器,Java语言的所有特性都是由JVM所提供的,所以系统的学习JVM对于理解Java语言具有重要的意义,尤其在未来面对一些系统级问题时会更加自信。
第二:提升代码量。对于初级程序员来说,要想提升自己的编程能力,一个最为有效直接的方式就是提升代码量。一方面可以通过岗位任务来完成,另一方面可以通过自主实验来完成。提升代码量的过程不仅能够加强自己的编程能力,也能提升自己调试程序的能力。
第三:围绕主攻方向展开学习。Java程序员往往都有一个自己的主攻方向,比如Web开发、大数据开发等等。对于Web开发来说应该围绕Web组件的开发来逐渐展开自己的知识面,包括Web容器的理解、框架的理解、前端处理过程的理解(JavaScript)等。对于大数据方向来说,应该从理解大数据平台开始(Hadoop、Spark),进而掌握平台提供的Java API。
Java中可以系统学习的内容非常多,比如并发机制、事务处理机制、安全机制、消息传递机制、分布式处理机制、资源管理机制等等,这些内容都需要进行深入的了解。
‘贰’ 程序员怎么提升自己
第一,技术不能落伍。
技术的更新迭代非常快,所以要学习的东西很多,所以说,做程序员挺不容易的。但作为这个时代的弄潮儿,我们必须提高对自己的要求,否则很容易落伍,被拍死在沙滩上。
一线城市的程序员可能还好,因为公司的产品迭代升级很快,所以技术栈的更新换旧也快。但二三线城市的程序员可能就没那么幸运了,往往一个产品都做到没客户了,技术还是最初用的那些。
以至于有些程序员回到二三线城市后再去一线会比较难,并不是生活节奏不适应,而是技术跟不上了。
怎么才能保证技术不落伍呢?并不是说外面流行什么技术,就一味的跟风,而是有选择性的,你比如说,Spring Boot 是肯定要跟的,但 Hadoop、Spark 就不一定要跟,要量力而行,看公司的业务规模是否需要。如果不需要,把更多的时间花费到 JDK 源码、性能优化陵戚上,是更消祥佳的选择。
第二,热爱这个行业。
就目前来说,程序员的确是比较高薪的职业,所以很多人都在往这个行业里挤,再加上“狼性文化”、“996”盛行,搞得很内卷。
在这种情况下,在这种压力下,你有没有问过自己,内心是否还热爱着这个行业?
我曾有一个读者,她问我,“请问你能不能做 C++ 课外辅导啊,孩子上大学,软件工程专业,之前不懂计算机,现在学习压力很大,想放弃,认为自己不适合学这个,不开窍,我是看了你的文章开始关注你的,现在因为孩子的事没办法了,就想问问,能给付费辅导吗?”
从这位母亲的话中,我感受到了她对孩子满满的爱,也感受了学弟学妹们身上背负的压力。程序员的确要学习很多很多知识,除了编程语言,计算机基础知识,还尺桥陵有各种框架和工具,时间根本就不够用。
但有一句俗话叫做“干一行爱一行”,既然入了行,就只有风雨兼程。否则,心里不爱了,学习的热忱和动力又从哪里来?
当你累了的时候,适当地给自己放个假,打一场篮球、打一个小时游戏、唱一首歌,甚至谈个恋爱,让紧绷的神经放松下来,心里的那股热爱也许就悄无声息地回来了。
第三,乐于分享自己。
分享的方式多种多样,并不局限于写博客,你可以在公司的团队内部做一次培训,甚至小到站立会的时候发表一些对技术的想法,或者大到在技术大会上做一次演讲。
分享会收获别人的认可、称赞,崇拜的小眼神,这些点点滴滴的荣誉感会让你鼓足勇气,在前行的道路上充满干劲,进而精益求精,要求自己做得更好。
‘叁’ 根据做项目的多少判断程序员的水准合理吗为什么呢
根据做项目的多少判断程序员的水准合理吗?为什么呢?程序员的水平,不是通过语言或外部表现就能看到的,不是看有多少技术,参与了多少项目,他会写多少博客,而是看他在实际业务场景中解决问题的能力,尤其是面对一些特殊复杂的问题,或在高强度和高压工作条件下解决问题的能力和态度。能够编写满足需求的代码不再是评判程序员的标准。
一个经验丰富的程序员能够承受来自各个方面的压力,在复杂条件下找到核心问题,通过深入分析找到问题的原因,并迅速处理。经过及时的回顾和总结,减少出现类似问题的概率。随着互联网的发展,越来越多的人涌向程序员的轨道,竞争越来越激烈,新技术层出不穷,更新和迭代速度很快,程序员使用的语言、框架和模式将发生巨大的变化。
如果你不主动学习,你可能很快就会过时。在日常工作中,程序员往往希望将业务、产品、运营,甚至老板作为对接交换需求和技术项目来连接和配合内部交换等,而流畅的沟通可以使事情推得更加顺畅高效,沟通或信息不对称,可能会导致项目启动时出现相反的情况(不要相信,这种事情真的发生过)。判断一个程序员的水平,核心是他解决问题的能力,而解决问题的能力需要坚实的基础支撑,要综合代码质量、项目经验、框架能力、逻辑思维等方面,而不仅仅是一个方面。
‘肆’ 女程序员被质疑代码能力,该如何证明自己
有什么好证明的,自己的能力强不强,自己在平时的工作中就展现出来了。
‘伍’ 程序员积累什么东西才是真正的实力
姚冬回答的非常好,我狗尾续貂的说几句。
我们都知道学习能力很重要,那么学习能力从何而来,除了去看书上课这种,如何在实践工作中学习成长?
我之前微博说了一个笼统的概念,什么是能力? 对待问题的态度,以及处理问题的思路和方法。
先说态度
你服务器偶尔出501错误,也许比例不高(知乎也出现过很多次),很多程序员,没错,是很多,假装看不见,不在乎,或者归咎于人品问题。 这就是态度问题。
再往后,负载高了或者其他什么原因,突然频繁出现501错误,不去追寻深入的原因,而是找各种借口, 什么IDC服务商不好,服务器品牌不好,操作系统不好,数据库不好,CDN不好,网络状况不好,web server不好,甚至,直接对Boss说我们被DDOS啦!(遇到过,帮他Boss找过多个安全专家会诊,最后发现根本不是DDOS,是程序员太烂。)
这就是态度,触目惊心,如果能对问题有敏感性,能知道对任何小的,轻微的问题有足够的敏锐度,你就有了一个快速成长的基础。对问题的敏锐度是非常重要的。很多性能或程序逻辑上非致命的bug,在不够敏锐的时候是发现不了的,但是一旦进入特殊场景就会骤然爆发,你多一点敏锐度,就会减少这种危机的风险。
第二个态度是解决问题的态度,有人对自己的解决方案信心满满,认为万无一失,但有的人就会多留一条后路;就好比你说我服务器要不要做安全加固,肯定要做对不对,要做到尽可能严谨和周全,但是你数据库保存密码的时候是不是还要加密?而且要随机salt,不就是防止万一依然有漏洞被人拿库怎么办么。程序也一样,以前写的一些服务端守护进程,有bug,会莫名其妙的终止,这个bug当然要定位,要修复,但是同时,写一个cron检查这个守护进程状态,一旦遇到终止给予自动恢复,这就是第二手准备,即便你多么不希望他执行,这个准备还是要做的。对问题 做两手甚至三手准备,也是优秀程序员,架构师的关键素质。
第三个态度是基于沟通与理解的态度,产品或运营提了一个不靠谱需求,一句话打回去当然很爽很威风,但是有没有仔细沟通分析过,这个需求基于怎样的实际诉求,这个实际诉求有没有更合理的实现途径,一句话“这个没法做,这个实现成本太高”,不是正确的沟通态度,而且,最优秀的产品,往往是实现了那些原本人们认为无法实现的诉求。
这样的态度,才有了一个持续进步的基础,下面说思路和方法。
优秀 的程序员和平庸的程序员,如果只看敲打代码的速度,我觉得是分不出来的,也许每人都可以一天写很多行代码,但是遇到问题后,平庸的程序员的解决效率,和优秀程序员相比就会有天壤之别。 所谓解决效率,不外乎对bug的分析、定位,以及 思考。
最基本的一条,看执行日志,看各种日志,web server的日志,数据库 的日志,慢查询日志,binlog日志,php的错误日志,等等等等,线上出问题瞎猜连日志都不看的大有人在。看日志不仔细不完整的也大有人在,你能去认真研究日志已经超越很多人了。
第二条,模块测试和断点分析,程序员一个坏习惯就是上来就写很大一坨代码然后再执行,不知道一个模块一个模块来写来测试,执行出了问题不知道设置断点,缩小范围逐步分析。断点分析非常简单,将整个代码中插几个中间输出,观察哪个环节出了问题,或者观察每个环节的系统开销,对调错和性能优化都非常重要,高手们大概认为这是ABC的东西,但是就这玩意我看到的大部分程序员都没有这个习惯。
第三条,错误信息 的理解和搜索,搜索引擎上有各种丰富的技术资料和技术问答,你所遇到的错误信息和错误提示,通常都能在网上搜索到,当然,搜索到后要结合你的场景认真思考,并理解透彻,而不是照猫画虎的去处理,否则可能这次运气好就蒙对了,下次运气不好又不知道怎么回事了。
第四条,不断总结归纳,对一个问题,一类问题,以及不同类型的问题,善于归纳整理,不断反思自己的问题,即便是不出bug的代码,你经过一段时间去回头看,也有很多思考不正确不合理的地方,有很多优化点,如果你觉得自己的代码一向牛逼,毫无破绽,那你一定是原地踏步,毫无进展。
关于 归纳总结,我说个案例
以前我们有个系统,请求量非常大,负载非常高,有个不错的技术经理来处理,他列了几个升级计划,都很靠谱,去执行了,效果非常好,然后我们跟进汇报的时候他来讲,做了几项升级,整体效果如何,然后我就批评了他。
我批评了什么呢?他是一起做的升级,然后一起观测的效果,那么这几个方案里,具体每个方案的实际效果怎样,对提升的帮助多大,他没有任何数据。所以对具体每个升级方案的价值和重要性,他没有任何概念。你正确的解决了问题,却没有认真的去归纳整理,你的收获是有限的。一起做升级不能说是错的,但是效果评估需要单独去做,而这个数据是非常有价值的,知识积累,不是你处理过的就一定有积累,而是整理过的。
大概就这些
最后重述一遍
什么是能力?
遇到问题的态度
处理问题的思路和方法
这就是能力
点赞的那么多,答谢各位,补充几条思路吧,是上面几个方法的具体扩充
补充1:善于提问,你能得到怎样的答案,取决于你提出怎样的问题。
你遇到问题,你应该知道,从哪里去问,去问什么。
我常见的一个测试题是这样的。
数据库目前挂了,我就是服务器,我不知道为什么挂了,你是一个优秀的分析师,现在我来做响应,你问我问题,你问一个问题,我回答一个指标,然后看你能不能定位问题。(当然,我会根据所假设的问题回答所有数据指标),比如你问我数据库连接数多少,问我系统i/o压力多少,或者问我慢查询日志里有什么,等等,善于提问的人就可以快速得到答案,而不善于提问的人,就会猜测一堆可能,最终却一无所获。
有个真实好玩的案例,有个兄弟公司(前段时间新闻出来,卖了好像十个亿的样子),开始的时候服务端数据库不够强壮,负载起来的时候会出现一些问题,就请我去把脉,我一看windows服务器,SQLserver (不要猜了,那是几年前,现在应该改了),我说这个我不会啊,然后人家那么热忱当我是专家,只好硬着头皮上,我连基本操作都不会怎么办,我就坐在那里问问题,开始他们说是不是这样,是不是那样,我说你们不要盲目下结论,你们要是知道结论就别来问我了,我问什么指标,什么日志你们就给我查什么,我就一样样的问,他们现场操作去查数据,我问一个他们查一个给我看,查着查着,他们的工程师说,知道原因了!果然和他们开始的假设完全不同。其实关键就是问问题的思路,他们一开始没有提出正确的问题。提出了正确的问题,他们很快自己就找到了原因。
补充2:善于划定范围,缩小问题区间。
前面提到的断点分析是一个非常常见的分析方法,但是很多场景,你甚至不知道是哪个程序出的问题,善于将问题范围化,也是一种归纳和分类的能力。
我曾在某个技术群出过一个经典测试,还记得以前微博上提到的一个经典面试题么。“从浏览器输入url到打开网页,中间经历了什么”,这是一个经典的综合认知的题目,基于这个题目,出一个更实战的场景测试是(这个场景其实90%的网站站长和游戏运营商都遇到过),”目前有用户反映网站或游戏卡,请问如何分析原因,以及当前优先级步骤。“。结果在这个群里,只有我徒弟说出了完全正确的答案(09年带过的)。优先级第一步是看在线用户数和当前访问数,对比历史,得到该问题目前的影响程度,来决定后续的优先级,以及减少分析范围。(这是意识问题)分析思路,分成三大块,前端,网络层,服务端。当然这三块可以继续延伸下去非常多细节,但是至少,能先把问题分成三大块,然后基于一些显见的分析方式快速排除其中几个部分,再逐步细化问题,而大部分人只是从一个局部去思考,讲了很多局部细节却没有完整的纲领,所以这就是差距。
先想到这些,咳咳。
转自知乎 曹政
‘陆’ 请问,如何才能做一个优秀的程序员
1、养成良好的书写代码的习惯,该加注释的时候一定要加注释,该大写的地方一定要大写,变量命名不能模糊不清。这是基础,是为了让别人能看明白你所写的代码,不能你写的代码只有你自己才看的明白。
2、注意所写软件的版本控制。
3、勤奋学习最新的技术,计算机技术日新月异,这点我不说相信你也知道。
4、养成写开发文档的好习惯,再接到一个项目时,第一件事情是进行需求分析,然后写开发文档,把你每一步要做什么都先写清楚,再动手做。
5、不要怕技术难题,在计算机领域,只有不能解决难题的人,没有人解决不了的难题。
6、虚心象他人学习,即使技术实力比你差很多的人,也肯定会知道一些你所不知道的技术点。
第一种武器:开发工具
至少熟练掌握两到三种开发工具的使用,这是程序员的立身之本,其中C/C和JAVA是我重点推荐的开发工具,C/C以其高效率和高度的灵活性成为开发工具中的利器,很多系统级的软件还是用C/C编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在,而本人对SUN公司的“网络即计算机”的概念相当欣赏,并相信JAVA即其相关的技术集JAVAOne会成为未来的主流开发工具之一。其次,如果能掌握一种简便的可视化开发工具,如VB,Delphi,CBuilder,则更好,这些开发工具减小了开发难度,并能够强化程序员对象模型的概念。另外,需要掌握基本的脚本语言,如shell,perl等,至少能读懂这些脚本代码。
第二种武器:数据库
为什么数据库是如此重要?很多应用程序都是以数据库的数据为中心,而数据库的产品也有不少,其中关系型数据库仍是主流形式,所以程序员至少熟练掌握一两种数据库,对关系型数据库的关键元素要非常清楚,要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具,但SQL是基础,是通用的数据库操作方法。如果没有机会中庆塌接触商业数据库系统,可以使用免费的数据库产品是一个不错的选择,如mySQL,Postgres等。
第三种武器:操作系统
当前主流的操作系统是Windows,Linux/Unix,熟练地使用这些操作系统是必须的,但只有这些还远远不够。要想成为一个真正的编程高手,需要深入了解操作系统,了解它的内存管理机差慧制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统,是一个很好的学习平台,Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少,但通过互联网还是能获取不少资料。只有对操作系统有一定的了解后,你会发现自己上了一个新的台阶。
第四种武器:网络协议TCP/IP
在互联网如此普及的今天,如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握,就需要迅速补上这一课,网络技术已改变了软件运行的模式,从最早的客户/服务器结构,到今天的WEBServices,再到未来的网格计算,这一切都离不开以TCP/IP协议栈为基础的网络协议支持,所以,深入掌握TCP/IP协议是非常必要的。至少,你需要了解ISO七层协议模型,IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。
第五种武器:DCOM/CORBA/XML/WEBServices
随着技术的发展,软件与网络的无缝结合是必然趋势,软件系统的位置无关性是未来计算模式的重要特征之一,DCOM/CORBA是当前两大主流的分布计算的中间件平台,DCOM是微软COM(组件对象模型)的扩展,而CORBA是OMG支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件,而是要理解这些技术的初衷,即为什么需要这项技术,如果你能理解了这一点,再回头看这些技术的具体实现,就如庖丁解牛,迎刃而解。XML/WebServices重要性不言而喻,XML以其结构化的表示方法和超强的表达能力被喻为互联网上的“世界语”,是分布计算的基石之一。
第六种武器:软件工程与CMM
现代大型软件系统的开发中,工程化的开发控制取代个人英雄主义,成为软件系统成功的保证,一个编程高手并不一定是一个优秀的程序员,一个优秀的程序员是将出色卖圆的编程能力和开发技巧同严格的软件工程思想有机结合,编程只是软件生命周期中的其中一环,优秀的程序员应该掌握软件开发各个阶段的基本技能,如市场分析,可行性分析,需求分析,结构设计,详细设计,软件测试等。一句话可以概括我的看法:“创意无限,流程保证”。
第七种武器:强烈的好奇心
什么才是一个程序员的终极武器呢,那就是强烈的好奇心和学习精神。没有比强烈的好奇心和学习精神更好的武器了,它是程序员们永攀高峰的源泉和动力所在。
‘柒’ 从哪些点上可以体现一个程序员的实力
对于一个程序员来说,刚上任的新手,如果能够将工作任务高效地处理,证明其工作能力还是具备一定的基础的,企业大可继续留任试用。如果这个程序员不仅能够在短时间内高效处理工作内容,且对于工作的细节也十分地考究,充分全面地考虑,必然也代表其工作思维和普通员工不同。一个程序员如果对于工作只是在应付差事,那么必然其能力也不会好到哪里去,因此,一定要观察期对待工作态度是否认真,然后进行其能力的初步判断。
‘捌’ 有哪些老程序员都知道对新手很有用的经验
一说到程序员,想必大家的第一印象就是头发少,很大程度上就是因为压力大导致的,有生活压力,也有工作压力。
今天说说工作方面的压力,想必看到这个问题的小伙伴都有一个认知,就是一个项目往往比预期的要长,说不定从哪天开始就加班了,一出现BUG真的要人命。此时,考研新老选手心态的时候和经验的时候了,老程序员或许能从容应对,新手可能完全不知错所。
这些信息包括户口档案、社保、公积金等信息,程序员新手可能跳槽比较频繁,有人甚至还换个城市工作。除了户口可能其他的信息都乱了,可能当时觉得不那么重要,但是十年、二十年后,可能会非常重要。
·工作日志可以提升脑容量;
·不要先写框架再写实现,要反过来;
·重构/优化/修复Bug,不要同时做;
·简化开发流程,加快迭代速度;
·纸笔是最好的工具,其次是markdown;
·画出结果,一目了然。
·首选明文文本,二进制、加密、压缩等到时候再加;
·要学会进行清晰的命名;
·问问题前先调查,要问到点上。
·不要小看程序员