第一篇:动力节点java——聊一聊java程序员的自我修养
动力节点java——聊一聊java程序员的自我修养
程序员提高自我修养是为了什么?
程序写的好有人崇拜,有妹子喜欢?还是到博客、论坛、社区发表文章进行分享获得成就?我想这是少数人的追求,也是更高的追求,在这之前
我认为,在中国,程序员提高自我修养的目的,是为了:
1、更好的融入工作,减少困难,增加成就
2、稳步的提升能力,提高收入,达成财务自由
2、站在更高的层面看待自己的学习和工作,树立更加适合的人生观价值观,家庭幸福,生活愉快
说的更通俗一点,就是用更加合理的方式和方法,赚取到更多的收入
说了这么多废话,进入正题
何为程序员的自我修养?
正面论述很难说清楚,反向描述可能更通俗易懂一些,自我修养的对立面是“没有修养”,先说一说在这么多年的工作、学习、生活中,遇到的一些我认为“没有修养”的程序员形态:
1、程序员小张遇到了一个开发问题,很着急,想到了有几个群,于是到群里发了他的问题,坐等回答,发现没有人回答,就直接对话群主的QQ,群主也不回答,于是小张就搜索,突然搜到博客园有个帖子讲解了相关话题,他看完就给博主留言,我的邮箱是:XXXXX@qq.com,麻烦博主把源码发给我一下,谢谢。
2、程序员小张进公司3个月了,老板布置了很多任务,他觉得老板很没人性,工资给的不高,加班也不给钱,于是在写代码的时候能省就省,客户反馈有问题也不主动解决,敷衍为主,又过了一个月,跳槽了。
3、程序员小张正在写一个功能模块,需要进行某种加密,到百度搜到了一个编码模块,看不明白具体写了什么,但是放到程序里刚好适用,于是就这么原封不动放进去了。
4、程序员小张要对某个功能进行研发,项目经理对他说,这个功能应该能搜索到,你去搜搜看,小张就在百度搜啊搜,一天过去了啥都没找到,项目经理来到小张身边坐下,换了个关键词,1分钟就搜到了解决方案。
5、程序员小张学.NET已经工作3年了,工资还是10000,和公司提涨工资也没答应,想跳槽又犹豫,这时某个前辈对他说,你去看书吧,多看一些书,例如 《Visual C# 从入门到精通》,《CLR via C#》《Javascript权威指南》等等,于是小张买回来了,随手翻了翻发现有些东西是他已经会的,有些看不懂的好像又用不到,而且书这么厚,要不要浪费时间去看呢?小张就这样反复纠结了半年,依然每天上班工作,下班LOL,偶尔还抱怨一下工资低。
6、程序员小张到了一家新公司,在做一个项目实现某个功能时,想起来以前做过这样的功能,可是竟想不起怎么实现了,于是就到自己电脑上找文档,找了好久也没找到,只好放弃,最后又折腾了2天,终于还是把这个功能给实现了。
7、程序员小张某天非常不高兴,因为他的项目经理和项目组的产品人员又变更需求了,新的需求又要对整个结构进行大的调整,小张很郁闷,到一个QQ里发泄情绪,说了这个事,于是立马,QQ群里面炸开锅了,程序员小李说,对,产品就是狗日的!程序员小王说,对,他妈的项目经理整天高枕无忧,就知道压榨开发人员!程序员小孙说,是的是的,我上一家公司也是这样,压榨程序员,幸好我走了。就这样,在一片骂声中,几个程序员心情舒畅了,小张开心的去玩王者荣耀去了。
我想,有些人可能已经明白我要说什么,有些人可能还不明白,具体的话我也说不出来,只能用一句话来概括就是:
在编写代码的过程中,善于学习、掌握方法、勤加思考、勤奋努力、持之以恒,长此以往,在编程中,你会发现不一样的自己。
以上这些还是比较抽象,那么
提升自我修养的具体方法有哪些?
程序员具体如何达成“较高的修养”,每个人各有自己的办法,我无法说到很细,就和如何提高做人修养一样,一句两句话是说不清楚的,但是有些说法也通俗易懂,比如一个小孩,有教育良好的父母,父母彬彬有礼,小孩从小开始接受正规教育,小学、初中、高中、大学,然后文化课程和社会实践良好,那么这个小孩最终的做人修养,一定比没有经历过这个过程的小孩更好一些。
同样的,写程序也是如是,下面我就讲一些最基本的、最浅显易懂的学习方法和道理,我把它叫做:
程序员基础的基础
一个好的开发人员,应该能够全面、高效、严谨的去处理任何软件程序和业务问题,成为一个好的开发,是一个很有意思的话题,不过无论这个话题如何开展,基础两个字必不可少,虽然代码量是衡量开发能力的重要指标,但仅能够熟练的进行代码编写是不够的,更要能深刻的理解技术原理和业务逻辑,扎实的个人基础和技术基础往往会促进代码的编写,更游刃有余的解决问题。
下面说的一些基础,可能绝大部分开发人员都不会在意甚至忽略,但恰恰这些才是开发大厦的基石。
1、科学基础
成为开发人员的过程不尽相同,有的是科班出身,有的是兴趣爱好,还有的是专业机构的培训,在这个过程中,可能全面或者零散甚至没有学习过计算机基础学科,但无论是哪一种,想要成为更高层次的开发人员,写出更高质量的代码,计算机基础学科的学习,是非常非常非常(重要的事情说三遍)重要的。具体的来说,基础学科在实践应用中,有如下几门是一定需要的,按照学习顺序排列如下
1)数据结构 数据结构课程通俗的说就是告诉你如何用最基本的语言类型、变量,关键词语句等,去处理各式各样的逻辑问题,我们称之为算法,而日常编程中的各种问题,例如排序、文件夹遍历操作、数据库查询等,都可以在数据结构课程中,找到对应的数学原型。数据结构课程的理解能力,也是一个人数学能力的体现,数据结构学习的好坏,是程序员水平差异的一个重要分水岭,对于这一块内容的学习,有如下建议:使用VB、C、C++、Pascal等语言,买一本相关语言数据结构与算法的书,或者在网上下载相关的PDF电子书,完整的学习一边,并将书本中的所有案例亲自编写运行调试一遍,当能够领悟到某些日常编程中常见手法源于某些数据结构和算法时,就基本达到了学习效果。
2)操作系统
所有编程语言的开发以及应用的运行,都基于操作系统,桌面编程中的大部分场景包括内存、进程、文件系统、网络通讯、用户界面等,都源于操作系统的定义和概念,完整的了解操作系统的起源和组成以及运行逻辑,对多线程、复杂界面、文件管理以及一些难以正常理解编程思路等开发中遇到的场景,有非常大的帮助,不仅帮助理解,也能掌握更多有效的程序写法。具体可以买一本操作系统的书或者下载相关PDF电子书,完整的浏览一遍,做到能够结合实际编程场景来看待操作系统原理,就基本达到了学习效果。
3)数据库
传统的关系型数据库,入门简单,深入却难,往往开发人员能够较快的掌握增删改查、视图、索引、存储过程等基本数据库操作,却在编写复杂查询、设计主外键、优化字段、去除冗余等时,出现只会依葫芦画瓢却不能自主思考扩展的状况。究其原因还是没能了解关系数据库的根本原理,而数据库这一门课程,系统的阐述了关系型数据库的来龙去脉,了解其中的数学原理或逻辑基础所在,对提升数据库编程水平有质的影响。建议也是买一本数据库的相关书籍或者下载PDF电子书,能够把熟练的把第一范式、第二范式等数据库课程的基本知识点与数据库编程场景建立起关联,也基本达到了学习效果。
4)编译原理
编译原理是编程语言以及各类语言编译器的科学基础,可以说编译原理创造了世界上的几乎所有的IT应用,学习编译原理的基础是数据结构和算法,因此编译原理的学习要花费更多的时间和精力,由于现代高级编程语言的编译器,在代码优化、资源优化方面已经做的足够智能,因此,编译原理的学习对实战的影响越来越小,但是正所谓本盛末荣,如果认为自己对数据结构和算法的学习达到了一个较高的水平和状态,可以在编译原理学习上进一步深入,最终把自己和普通程序员拉开更大的差距。
2、英语能力
英语的天然特性和字母长度还有学科发展的历史因素,决定了编程语言一定是基于英语的,在编程过程中,从语言的关键词到文档的内容又或是搜索引擎的搜索结果,都不可避免的会遇到英文。大部分编程人员,都具备英语四级左右的英文基础,却由于非专业以及工作环境原因,逐渐疏远甚至完全淡忘了英语。而实际操作中,大部分编程语言资料都是英文,在线编程问答内容也是英文,因此,很有必要把英语能力重新恢复到一个不用太高但行之有效的水平,达到如下效果:
1)对自己所使用语言,每一个关键词都知道具体的英文翻译、逻辑含义以及读音。2)对于自己使用语言所涉及到的相关方法、类库、框架、工具等,能知道其中每一个方法、过程以及参数关键词等的英文翻译、逻辑含义以及读音。
3)对常见的编程逻辑和核心关键词,能够用英文组织问题的描述,最简答的也行,只要能被搜索引擎读懂就可以。比如如何在C#中把整形转换为字符串类型这个问题,最简易的英文描述就是 C# Integer Covert To String。
4)在自己技术知识范围内的任何的英文的技术手册、文档、文章或是问题描述,能够读懂8成的内容含义,能够读懂完整的技术含义。
3、搜索方法
任何一个开发人员,都应当具备搜索能力,甚至是一定要具备搜索能力,搜索引擎的宝藏,是无穷无尽的,同样具备搜索意识的不同程序员,却因为搜索技巧的差异最终在程序开发质量、项目实施效率、甚至是工程产品质量上出现数倍的差异,因此,掌握高效、先进、灵活的搜索方法和技巧,是非常非常非常(重要的事情说三遍)有用的。其中主要的方法介绍如下:
1)搜索源选择
虽然英文的编程资料更为准确高效,但中文的编程资料数量上却占优,因此遇到问题第一搜索选择还是百度
谷歌对于专业中文词汇的处理能力有时候甚至比百度还要强,而且谷歌能搜出大量的英文资源,因此谷歌也是首选之一,但是由于谷歌被封锁,因此需要进行VPN、SSH等FQ操作,或者在百度搜索“谷歌镜像”关键词,通过谷歌的镜像网站进行访问。
除了搜索引擎,专业的技术网站、论坛、社区也是非常直接有效的搜索源,比如国外的StackOverFlow网站,国内的Cnblogs博客园、OSChina开源中国等,都具备搜索功能,将问题关键词输入其中,也许也会很快的得到相关答案。
对于QQ群,建议不要使用,除非QQ群主或者成员是非常闲或者非常非常热心的人,否则在QQ群询问技术问题,是非常低效率的搜索方式。
2)关键词构造
搜索关键词的构造,直接影响搜索效率和正确结果的过滤,没有什么特别的技巧,关键在于搜索积累,但是总体遵循的原则是,准确和简洁,比如当出现一个描述,如何用C#对XML进行序列化和反序列化,非常愚蠢的关键词构造就是“如何用C#对XML进行序列化和反序列化”,而正确高效的关键词则是“C# XML 序列化 反序列化”,或者在谷歌里面搜索则是“C# XML Serialization”。在平时的编程中,一定要注意相关方法和经验的积累
3)联想搜索
联想搜索,不属于搜索引擎的范畴,却是在搜索中很有用的高级技巧,举一个通俗的例子,比如想使用C#,利用某个.NET类处理一种HTTP通讯,但是一直搜索不到完美的结果,不过换个思路,考虑到VB.NET也是.NET体系,和C#完全相通,那么也可以试着用VB.NET关键词进行搜索,搜索到完美代码后再临摹成C#代码。这样的联想搜索,不仅能够帮助搜索正确结果,也是对大脑思维的训练,值得多多尝试。4)资源搜索
开源的框架、产品、工具、控件等开发辅助类东西越来越多,稳健性和迭代性越来越强,去寻找一款成熟的工具或者插件,也成为了大量开发者的必备方法和技能,而如何高效的搜索出想要的资源,也成为了一门学问,其核心方法就在于知晓资源网站的地址,常见的例如有开源中国、Github、CSDN下载、pudn等。资源类网站需要平时多积累,到用到的时候会非常关键。
4、思维模式
开发人员,一定要养成业务思维的模式,所谓的业务思维,就是在做任何一个项目的时候,写任何代码前,需要对项目本身的业务概念和业务逻辑甚至业务流程都要有一个全面的学习和理解,这虽然不是一个项目的强制要求,却是一个很好的开发习惯,无论自己的觉得是开发者还是测试员又或是技术总监,掌握了业务原理,才能够更好的设计或阅读项目的数据结构和流程结构。程序员的思维往往和用户或者客户是不一致的,摆脱技术思维模式,习惯于用业务思维解决问题的程序员,不一定最优秀,但一定是一个很容易沟通的程序员
5、工作与编程习惯
有的人说爱干净浪费时间,所以不修边幅,但归根结底这还是习惯问题,当养成清洁卫生的习惯并使之成为生活惯性时,往往就不会耗费更多的时间,反而显得干净干练。写程序同样如是,有一些编程习惯,看似不足为道,看似浪费时间,可是如果坚持下去,最终都能收到意想不到的奇效。下面列举一些特别重要的习惯。1)快捷键的使用
无论是使用Windows、Linux操作系统,还是在IDE中,快捷键都是系统本身的标配,事实上,Ctrl+C、V这样的操作,大部分人都能尝到在节省时间上的甜头,把这个概念进一步扩散,如果在IDE中编写代码,除了代码本身,将其余所有的鼠标操作、键盘定位操作,都用快捷键来代替的话,在时间上将会有数量级的节省,然而看上去这么好的事情,真正坚持去执行并形成习惯的人屈指可数,因此,在初期的改变习惯,记住快捷键,会是一个长期的过程,需要不断的坚持。
2)代码注释
一个开发人员随着年龄和经验的增长,所参与的项目,再也不是靠一个人或者几个人就能完成的。系统的重构、代码的重构、工作的交接、对新进人员的培训等等类似的事情,会越来越多的遇到,这些事情无一例外都会把已经写过的代码重新或者重复阅读,如果在初始编写代码时,就做到完整、清晰明了的代码注释,对后续工作会有巨大的帮助。不仅提高工作效率,还能增强合作好感。事实上,就算只是自己看自己的代码,如果有注释,也能加深印象,缩短代码查找时间。因此,任何开发人员,都应该养成良好的代码注释习惯。
优秀的代码注释应该能做到:
每一个函数、每一个属性甚至是变量的划分,都可以找到对应的解释。多使用越来越被IDE支持的XML注释方式,不仅有注释文字,更有详细的参数描述。 对程序结构、模块、组成部分划分等也加以注释
3)命名规则
具备一定规模的软件公司,在代码编写上都有一套自己的命名规则,涵盖项目、模块、函数、变量等等,标准化命名的好处不言而喻,然而被动、被迫去遵守命名规则和主动习惯于使用命名规则是完全不一样的。一个优秀的开发人员,应当发自内心的希望各种代码命名都是有规则的,易读的,而不是纠结于命名规则会增加码字长度。
4)不将就的编程逻辑
所谓不将就的编程逻辑,其对立面就是不讲究的编程逻辑,不讲究的编程,不仅是一种很坏的编程习惯,也体现了低下的生活品质,很多开发人员,因为个人习惯、赶工期、客户要求不高等多种原因,在编程时特别随意,体现在比如为了实现某个功能,百度出一段代码,直接套用,10行的代码只理解8行,有两行看不懂也放到程序里去使用,很多这样的小细节,就好比在项目中埋下了无数的定时炸弹,不仅有很大概率形成返工,更是为项目埋下了风险。编程人员,应当有担当有态度,养成不将就的编程逻辑,不勉强自己,也不轻视程序。
5)数据备份
误删、误操作、电脑断电、文件遗失等等状况是每一个开发按人员都可能遇到的问题,如果不希望辛勤的劳作被浪费,不希望偶然的意外影响工作,那做好备份是必不可少的,在较大规模的公司,会有完整的源代码管理以及信息安全防护,而无论是在大公司工作,还是身处较小公司或者在实现个人代码价值时,都要做好代码和文档的数据备份,备份方式的选择灵活多样,有使用在线的CVS、SVN、TFS、Git源代码管理,也可以手工拷贝文件至云空间或者本地硬盘,甚至可以在个人电脑上组成RAID磁盘阵列等等,养成周期性、规律性的备份习惯。
6)邮件工作方式
沟通是进步的源泉,如果说开发小组的热烈讨论是性格和激情的体现,那邮件的工作方式也是另一种稳重和高效。无论是公司层面的工作沟通,还是开发小组的问题交流,邮件的作用包括问题正规化描述、工作留档留痕、工作流程流转、责任分工明确等等,习惯于将重大问题、重要事项通过邮件的方式与同事、主管等进行沟通,将会非常有助于团队协作。
以上这些方法,是我这么多年来的感受和体会,也给了我很大的帮助,希望也能够帮助到大家,不能说一定可以“提升修养“,但也是”提升修养”的有效方式。
最后还想再说一说坚持的力量
分享一个真实的小故事,公司有两个开发人员,1个做.NET好多年了,但是很油滑,做事能省就省,抓到可以偷懒的机会就偷懒,让他学点新知识新方法总是自以为是觉得自己都会;还有1个毫无.NET基础,一直做低级语言开发,从15年才开始学习.NET和Web前端,但是做事很积极,几乎每天都自己抽空学习,遇到不懂的都琢磨清楚,遇到不会的场景就上网或者找人寻求帮助,项目结束后还反复思考有什么地方可以改进。从15年到现在,短短1年,这两个人的发展已经是天壤之别,工资差距也越来越大,后者已经能够独自操盘中小型软件外包项目,而前者还在混着日子,以后他们各自的发展也完全可以预见。我想说的是,本篇里面分享的一些道理和方法,都是通俗易懂的,就和常听到的例如101%和99%的365次方的故事、1万小时的道理等等一样,但真正去认真思考并实践的屈指可数,也许,坚持才是程序员最大的修养,和各位共勉!
第二篇:-动力节点=java程序员菜鸟的成长之路
筑基阶段:
1.敲代码速度要快,要求手指灵活,尽量减少输入出错。这个是基本功,不然何以达到一定的代码量。
2.精通几个常用的代码编辑工具。(注意,这里说的是编辑工具,除了常用的eclipse,myeclipse,jBuilder等IDE工具外,还必须掌握文本编辑工具,如notepad++,vim)。
3.掌握Linux系统中常规命令。(这个是所有程序员都必须掌握的基本功)。
4.随时随地的做笔记。(这个就不解释了,反正善于总结经验不会错了,可以推荐使用有道笔记)。
5.学会一些主流的代码管理工具的使用。(如SVN,gitHub,maven等)
初级阶段:
动力节点
6.熟悉并精通某种编程语言的基础和特性。(java语言必须掌握corejava基础部分)
7.善于给自己写一些工具,拿来即用的那种。(如数据库连接,文件读写操作等等)
8.掌握web开发的常用技术。(如HTML,CSS,javascript,Ajax,JSP,jQuery)
9.掌握常用数据库的基本操作。(如oracle,mysql)
中级阶段
10.掌握一些主流开源框架,设计思想。(如,spring MVC,Struts2+hibernate+spring/SSH,EJB等)
11.掌握设计模式,学会使用一些开发模式。
12.掌握Linux中的shell编程
14.学会使用数据库的DDL,DML,以及存储过程。
15.熟悉项目的整个生命周期,从需求到上线中的各个阶段。
16.关注技术网站和社区,开拓思路,汲取他人的优序经验,同时分享自己经验。(如csdn ,oschina等)
17.熟悉整个项目周期的中的各类文档。
动力节点
18.定期给自己策划一个项目,练手。
高级阶段
19.关注科技,了解IT界动态,学会发现和创新。
20.开始学习项目管理相关知识,学会如何成为一个优秀的项目管理人。
21.适时给自己买一些书籍,给自己大脑及时充电。
22.经常参加一些培训讲座,开拓视野。
23.关注政策,了解时代互联网发展趋势,学习和创新。
动力节点
第三篇:Java程序员基本修养之初识Java
http://www.xiexiebang.com
大家好,最近总结了一下作为Java语言初学者,需要掌握的一些基本知识,和一个Java程序员所具备的基本素质,与大家共同分享,不足之处望大家多提宝贵意见。
1、Java概述
1995年5月23日开始,原名为Oak,最先开始用于一个绿色项目开发(一次编译随处使用),后来更名为Java。
09年SUN公司被Oracle收购,先后经历1.0、1.1、1.2、1.3、1.4、5、6、7、8等版本。 Java SE 标准开发
Java EE 企业级开发
Java ME 移动开发
2、JDK和JRE JDK:Java Development Kit(Java开发工具集)
Java语言与JDK的关系:足球比赛与足球场
JRE:Java Runtime Environment 如果客户要使用Java语言平台开发的软件,就必须安装JRE。
它包含:开发技术、用户界面工具箱、整合类库、基础类库和Java虚拟机 区别:JDK可以给开发者提供开发环境,也可以运行程序;JRE不能开发Java程序,只能运行Java程序,客户通常只安装JRE不安装JDK。 Java平台分为四个部分: 操作系统:Linux、Macintosh、Solaris、Windows,.etc 2 JVM(Java虚拟机)
虚拟的操作系统,不同的操作系统虚拟机也不同,它只能识别class文件.3 JDK(包含JRE、工具程序与API)4 Java语言
几个专有名词解释:
JDBC:Java DataBase Connection(Java数据库连接):将数据库的数据展示到前台页面
JNDI:Java Naming Directory Interface(Java命名目录接口)RMI:Remot Method Invoke(远程方法调用):跨IP、跨进程的调用。
开发者向客户提供自己的ip、端口、方法名称,客户拿到了这些则可以远程访问开发者的服务,最终能够获取到想要的东西。rmi://10.7.210.616712/basketballInfo
3、JVM(了解)
概述:Java Virtual Machine(Java虚拟机):可以通过Java虚拟机来实
磨砺营IT教育版权所有
http://www.xiexiebang.com
现跨平台。
我们可以把JVM看做操作系统,他只能运行.class文件
不跨平台:在Windows系统开发的程序无法再其他操作系统上运行,不能实现跨平台。
HelloWorld 0101110 Windows操作系统
0101011 Solaris操作系统
跨平台:一次编译,到处运行。好比一份用当地语言编写的文档(俄文),先翻译成英文,在由英文翻译成客户所在国家的语言
JVM作用过程:源程序—(编译)—> 字节码(.class)—(JVM把字节码进行解释)—> 操作系统能理解的机器语言 了解两点: 他是一个操作系统,专门执行class文件 有了它才能够实现跨平台;不同的操作系统,它的虚拟机不一样。
4、写出第一个Java程序(重点)
步骤:安装jdk配置环境变量(连接用户和操作系统)检查是否配置完成(win+R,输入cmd,输入java –version,能够显示Java版本信息说明安装成功)
编程工具:记事本、写字板、EditPlus、Eclipse等。
输入javac命令:编译程序,使之创建一个.class文件(字节码)输入java命令:解释执行程序(执行jdk文件夹bin目录下的java.exe文件,即请求Java虚拟机来执行某字节码)
5、Java标识符命名规范(掌握)
定义:可以自定义的字符序列叫标识符
类名称也叫作标识符,类名称必须和Java源文件名称前缀保持一致。命名规范: 类名称首字母必须大写,如果有多个单词,每个单词首字母大写; HelloWorld 2 标识符可以使用大小写字母(一般全部用大写字母)开始,也可以使用$(美元符号)或_(下划线)开始; 命名遵循“见名知意”的规则; 命名遵循“驼峰命名法”的规则(即有多个单词时,每个单词首字母大写)。
磨砺营IT教育版权所有
http://www.xiexiebang.com
6、注释
单行注释://+内容(放在代码的上面一行)
//定义一个整数类型的变量,其名称为height int height; //给变量赋值:
//使用 =(赋值运算符)给变量赋值
//赋值运算符:将(赋值运算符)右边的数值赋给左边的变量 height = 173;
多行注释/块注释:
注意:行注释只能写在方法里面,用来注释变量、分支、循环
多行注释用来注释类、方法、属性
7、变量(重点)
定义:驻留在内存中的一个存储单元(临时)如何使用变量来完成计算: 1 声明一个变量
语法: 数据类型 变量名;int height;2 给变量赋值
语法:
变量名 = 值;height = 173;3 声明变量和赋值可以放在一行,即:数据类型 变量名 = 值;int weight = 86;注意:变量使用之前,一定要为其赋初始值(初始化)。4 如何向控制台输出变量 System.out.println(height);System.out.println(height);
磨砺营IT教育版权所有
http://www.xiexiebang.com 如何使用变量改变数值 weight = weight + 1;变量有哪些数据类型:
数据类型分为两大类:基本数据类型和引用数据类型。基本数据类型: 1 整数类型:
int(整形): 32bit或者4byte,最大值为2的31次方-1,最小值为负2的31次方
short(短整形): 16bit或者2byte,最大值为2的15次方-1,最小值为负2的15次方
long(长整形): 64bit或者8byte,最大值为2的63次方-1,最小值为负2的63次方
注意:所有整数的默认字面量(在编译器能够知道的数值)都为int类型,所以long类型的变量值需要在后面一定要加上一个“L”(可以用小写,但是规范一般用大写。)
byte(字节类型): 8bit或者1byte,最大值为2的7次方-1,最小值为负2的7次方
注意:定义整数尽量使用int类型,如果空间不够再使用long类型,不要使用short、byte来定义整数。小数类型:
float(单精度浮点型): 32bit或者4byte,科学计数法 float pi = 3.14F;注意:所有小数的默认字面量(在编译器能够知道的数值)都为double类型,所以float类型的变量值需要在后面一定要加上一个“F”(可以用小写,但是规范一般用大写。)
double(双精度浮点型):64bit或者8byte,科学计数法 注意:定义小数优先使用double类型,避免不必要的错误。3字符类型:
char(字符类型): bit16或者2byte,只能存储单个字符(2byte,也可以存储汉字或字母)
char sex = ‘男’;注意:只能存储单个字符,必须以单引号开始,单引号结束。
磨砺营IT教育版权所有
http://www.xiexiebang.com 布尔类型:
boolean(布尔类型):只能存储两个值——true/false boolean bool = true;经常使用的数据类型有:int、long、double、bollean 几乎不用的数据类型有:short、float、char 很少用到的数据类型有:byte(第五周讲)变量的命名规范 变量名只能以大小写字母、下划线、美元符号开头,但是可以有大小写、下划线、美元符号、数字组成; 一般使用小写字母开头来定义变量; 如果有多个单词采用驼峰命名法,从第二个单词开始首字母大写; int tomAge = 18 4 变量名区别大小写; 变量名长度不受限制,但是一般变量名称长度不要超过15个字符。6 如果超过15个字符,去掉元音字母保留辅音字母
7、运算符
1、算数运算符
+-* / % 其中,%叫做取模运算符(取余数运算符)。21 / 5 = 4 21 % 5 = 1 在Java世界中,两个整数相除,结果必然是一个整数
2、赋值运算符
= :将运算符右边的数值赋给左边的变量 注意:右边的数值也可以是变量
3、 比较运算符 > < >= <= == 比较两个数值(是否相等)
磨砺营IT教育版权所有
http://www.xiexiebang.com
!= 不等于
比较运算符计算的结果一定是一个boolean数据类型 boolean calcResult = 3 > 5;System.out.println(calcResult);则输出false
4、++--放前面叫前向自增/自减:先计算再赋值 放后面叫后向自增/自减:先赋值再计算
int a = 3;int b = 2;int result =(a++)*(--b)+(--a)/(b ++);输出为3*1+3/1=6
5、逻辑运算符(重点)自增和自减(面试会考察)
逻辑运算符必须要配合boolean数据类型一起使用 && 与:
使用场景:
条件1 && 条件2 多个条件都为真则为真。1 int score1 = 80;int score2 = 90;boolean gift = score1 >80 && score2 >80;System.out.println(gift);2 int score1 = 80;int score2 = 90;boolean result1 = score1 >80;boolean result2 = score2 >80;boolean gift = result1 && restult2;
磨砺营IT教育版权所有
http://www.xiexiebang.com
System.out.println(gift);两个例子输入结果均为false。 || 或
使用场景:
条件1 || 条件2 多个条件有一个为真,则为真。!非
使用场景:!条件 非真为假,非假为真。
6、位运算符(重点)
特征:将两个整数转成二进制再针对每个bit位逐个进行上下比较的位运算 & 位与:上下结果都为1则结果是1,否则结果是0 10010 8 01010 10 00010 2 | 位或:上下只要有1个1结果就是1,否则是0 10010 8 01010 10 11010 26 ^ 位异或:上下相同为0,否则为1 10010 8 01010 10
磨砺营IT教育版权所有
http://www.xiexiebang.com
11000 24 拓展1: int有32位
00000000 00000000 00000000 00000010 最高位 次高位 次低位 最低位
第32位也叫作符号位,1代表负数,0代表正数。拓展2:
~ 取反 先+1再取反
int value = ~10 则得到-11 00001010 1110101
7、 位移运算符
<< 左位移:左位移多少位,就在最右边补多少个0 将10进制数2,左位移3位 2 << 3 00010则去掉前3位,在后面加3个0,变成了10000 >> 右位移:右位移多少位,就在最右边去掉多少个位
将10进制数17,左位移3位 17 >> 3 10001则去掉后3位,在前面加3个0,变成了00010
磨砺营IT教育版权所有
第四篇:程序员的自我修养总结(一)
1、通过学习《程序员的自我修养》,重新对栈,堆,静态存储区的认识。
解答:
局部变量存放在栈中,全局变量和静态数据存放在静态存储区,在二进制代码中,显示在数据段。
对于一个进程的内存空间而言,可以在逻辑上分为3个部分:代码区,静态数据区和动态数据区。动态数据区一般就是堆(heap)栈(stack)。
堆和栈是两种不同的动态数据区,栈是一种线性结构,而堆是一种链式结构。
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出;
在Windows下,栈是乡下生长的,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2M(也有的说是1M,总之是一个编译时确定的常数,栈的大小由编译器设定),如果申请的空间超过栈的剩余空间时,将提示overflow。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
堆是向高地址扩展的数据结构,是不连续的内存区域。链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
栈是由系统自动分配,速度较快。但程序员无法控制。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
栈由编译器自动分配释放
堆由程序员分配释放
静态存储区由系统释放
2.对ELF文件装载的总结
ELF文件装载的步骤如下:
首先在用户层,bash进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行制定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束。
在进入execve()系统调用后,Linux内核就开始进行真正的装载工作。在内核中,execve()系统调用相应的入口是sys_execve(),sys_execve()进行一些参数的检查复制之后,调用do_execve()。
do_execve()会首先查找被执行的文件,如果文件找到,则读取文件的前128个字节(主要是判断文件类型)。当do_execve()读取了这128个字节的文件头部后,然后调用search_binary_handle()去搜索和匹配合适的可执行文件,search_binary_handle()会通过判断文件头部的魔数确定文件的格式,并调用相应的装载处理过程,比如,如果是elf文件,则调用load_elf_binary();这个装载函数的主要步骤是:
(1)检查ELF可执行文件格式的有效性,比如魔数、程序头表中段(Segment)的数量;
(2)寻找动态链接的“.interp”段,设置动态链接器路径(与动态链接有关)
(3)根据ELF可执行文件的程序头表的描述,对ELF文件进行映射,比如代码、数据、只读数据。
(4)初始化ELF进程环境,比如进程启动时EDX寄存器的地址应该是DT_FINI的地址
(5)将系统调用的返回地址修改成ELF可执行文件的入口点,这个入口点取决于程序的链接方式,对于静态链接的ELF可执行文件,这个程序入口点就是ELF文件的文件头中e_entry所指的地址;对于动态链接的ELF可执行文件,程序入口点是动态链接器。
当load_elf_binary()执行完毕,返回至do_execve(),再返回至sys_execve()时,上面的第5步中已经把系统调用的返回地址改成了被装载的ELF程序的入口地址了。所以当sys_execve()系统调用从内核态返回到用户态时,EIP寄存器直接跳转到了ELF程序的入口地址,于是新的程序开始执行,ELF可执行文件装在完成。
下面总结Linux中动态链接的过程
一、首先理解与动态链接相关的几个段
与动态链接相关的几个段(sections),下面这几个段既可以在共享对象中,也可以在可执行文件中(当然,通过静态链接生成的可执行文件是不存在如下段的)。
1.“.interp”段,指明了动态链接器的位置
2.“.dynamic”段,可以看成是动态链接下ELF文件的“文件头”,这里面保存了动态链接器所需要的基本信息,比如依赖于哪些共享对象,动态链接符号表的位置、动态链接重定位表的位置、共享对象初始化代码的地址等。
DT_SYMTAB动态链接符号表的地址“.dynsym”的地址
DT_STRTAB动态链接字符串表的地址“.dynstr”的地址
DT_STRSZ动态链接字符串表大小
DT_HASH动态链接哈希表地址“.hash”的地址
DT_SONAME本共享对象的“SO-NAME”
DT_RPATH动态链接共享对象搜索路径
DT_INIT初始化代码地址(这对应于“.init”段的地址)
DT_FINIT结束代码地址(这对应于“.finit”段的地址)
DT_NEED依赖的共享代码文件,DT_REL动态链接重定位表地址
DT_RELA
DT_RELENT动态重定位表入口数量
DT_RELAENT
3.“.dynsym”动态符号表,这个表只保存了与动态链接相关的符号
4.“.rel.dyn”段和“.rel.plt”段。“.rel.dyn”实际上是对数据引用的修正,它所修正的位置位于“.got”以及数据段;而“.rel.plt”是对函数引用的修正,它所修正的位置位于“.got.plt”
二、然后理解动态连接器的作用和实现方法
在Linux下,动态连接器ld.so实际上是一个共享对象,操作系统同样通过映射的方式,将它加载到进程的地址空间中。操作系统在加载完动态链接器之后,就将控制权交给了动态链接器的入口地址(与可执行文件一样,共享对象也有入口地址)。当动态链接器得到了控制权之后,它开始执行一系列自身的初始化操作(自举),然后根据当前的环境参数,开始对可执行文件进行动态链接工作。当所有动态链接工作完成之后,动态链接器会将控制权交到可执行文件的入口地址,程序开始执行。
动态链接器入口地址即是自举代码的入口,当OS将进程控制权交给动态链接器时,动态链接器的自举代码即开始执行。自举代码首先会找到它自己的GOT。而GOT的第一个入口保存的即是“.dynamic”段的偏移地址,由此找到了动态链接器本身的“.dynamic”段。通过“.dynamic”中的信息,自举代码便可以获得动态链接器本身的重定位表和符号表等,从而得到动态链接器本身的重定位入口,先将它们全部重定位。从这一步开始,动态链接器代码中才可以开始使用自举的全局变量和静态变量。
三、动态链接器完成链接的过程
完成基本自举以后,动态链接器将可执行文件和链接器本身的符号表都合并到一个符号表当中,我们可以称它为全局符号表。然后链接器开始寻找可执行文件所依赖的共享对象,在可执行文件的“.dynamic”段中有一种类型的入口DT_NEEDED,它所指出的是该可执行文件(或共享对象)所依赖的共享对象。并将这些共享对象的名字放入到一个装载集合中。然后链接器开始从集合里取一个所需要的共享对象的名字,找到相应的文件后打开该文件,读取相应的ELF文件头和“.dynamic”段,然后将它相应的代码段和数据段映射到进程空间中。如果这个ELF共享对象还依赖于其它共享对象,那么将所依赖的共享对象的名字放到装载集合中。如此循环直到所有依赖的共享对象都被装载进来为止,当然,链接器可以有不同的装载顺序,如果我们把依赖关系看做一个图的话,那么这个装载过程就是一个图的遍历过程,链接器可能会使用深度优先或者广度优先或者其它的顺序来遍历整个图,这取决于链接器,比较常见的算法是广度优先。
当一个新的共享对象被装载进来的时候,它的符号表会被合并到全局符号表中,所以当所有的共享对象都被装载进来的时候,全局符号表里面将包含进程中所有的动态链接所需要的符号。
当上面的步骤完成后,链接器开始重新遍历可执行文件和每个共享对象的重定位表,将它们的GOT/PLT中的每个需要重定位的位置进行修正。因为此时动态链接器已经拥有了进程的全局符号表,所以这个修正过程也显得比较容易,跟我们前面提到的地址重定位的原理基本相同。重定位完成之后,如果某个共享对象有“.init”段,那么动态链接器会执行“.init”段中的代码,用以实现共享对象特有的初始化过程,比如常见的,共享对象中的C++的全局/静态对象的构造就需要通过“.init”来初始化。相应地,共享对象中还可能有“.finit”段,当进程(指可执行文件对应的进程)退出时,会执行“.finit”段中的代码,可以用来实现类似C++全局对象析构之类的操作。
如果进程的可执行文件也有“.init”段,那么动态链接器不会执行它,因为可执行文件中的“.init”段和“.finit”段由程序初始化部分代码负责执行(我们将在库这一部分学习程序初始化)。
四、对链接过程中出现版本交会问题的解决方法
动态链接库在查找共享库过程中,会出现次版本号交会问题,此时通过基于符号的版本
机制方案来解决。程序员可以在链接共享库时编写一种叫做符号版本脚本的文件,在这个文件中指定这些符号(导入和导出符号)与集合之间及集合与集合之间的继承关系。链接器在链接时根据符号版本脚本中指定的关系来产生共享库,并且设置符号的集合与她们之间的关系。实际上是这样子的:
1.在构造共享对象时,在共享对象中加入符号版本脚本文件,得到的共享对象就含有版本信息
2.若其它共享对象或可执行文件引用此共享对象,则其中就会包含相应的版本信息
3.如果在版本信息低于此共享对象或可执行文件的系统中运行,动态链接器就会报运行错误。
第五篇:java程序员简历自我评价-精选
java程序员简历自我评价
java程序员简历自我评价篇一
由于长期做电脑主板,所以对主板的布线规则及注意事项相当了解。布线过程中会考虑到EMI,信号时序,散热等问题。能独立完成网表导入到出GERBER整个流程,后期可以和洗板厂和打件厂联系解决工艺方面的问题。会建零件维护零件库。能基本看懂英文LAYOUT GUIDE。
具有良好的团队精神,能紧密配合硬件,散热,电子方面的工程师。使用的LAYOUT工具为ALLEGRO并且非常精通。
所做的板子多次量产,为公司创造了良好的效益。也希望做一些不同的产品来提升自己,学到更多的东西。我的接受能力和耐心程度都可以,对于新的东西能迅速上手。希望能为贵公司效力,谢谢。
java程序员简历自我评价篇二
具有很强的团队精神,有良好的组织和协调能力,有强烈的集体荣誉感。
自学能力强,喜欢钻研新技术,敢于面对和克服困难。
熟练使用spring+struts+hibernate整合开发。
熟练使用jsp、servlet、jstl、jdbc下的编程开发。
熟练使用eclipse ide开发工具,熟练掌握tomcat等web容器以及j2ee容器的配置以及部署,能够使用junit进行单元测试。
熟练使用mvc框架搭建项目,以及自定义实现ajax框架。
熟练掌握数据库的操作和sql语句,能熟练使用sqlXX和mysql进行系统开发。
java程序员简历自我评价篇三
具有很强的团队精神,有良好的组织和协调能力,有强烈的集体荣誉感。
自学能力强,喜欢钻研新技术,敢于面对和克服困难。
熟练使用spring+struts+hibernate整合开发。
熟练使用jsp、servlet、jstl、jdbc下的编程开发。
熟练使用eclipse ide开发工具,熟练掌握tomcat等web容器以及j2ee容器的配置以及部署,能够使用junit进行单元测试。
熟练使用mvc框架搭建项目,以及自定义实现ajax框架。
熟练掌握数据库的操作和sql语句,能熟练使用sql2018和mysql进行系统开发。