大家好,我是小羽。
好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章。
会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全面发展,才能在这个日趋激烈的社会,在未来有更好的发展空间。
话不多说,本期为大家介绍的是关于一些程序员必备技能介绍,相信掌握这些编码内外的技能,我们会朝优秀软件开发人员更近一步。
下面就来看看我总结的这些技能,准备好进收藏夹(吃灰)了嘛?
编码之内
代码规范
代码规范化带给我们的第一个好处就是看着很整齐、很舒服。
虽然说我们现在可以用不规范的方式写代码,现在能看得懂,但等过了几个月后,你再回头看时估计就两眼懵圈了。更不要说万一项目迭代开发,交接给其他人了,所以代码一定要写规范。
下面的是我总结的一些代码规范注意事项:
编码方式:统一用 UTF-8
,一般情况下不要去改动它。
缩进:统一为 4 个空格,将 Tab size 设置为 4 则可以保证 tab 键按 4 个空格缩进。
括号:花括号不要单独一行,和它前面的代码同一行。而且,花括号与前面的代码之间用一个空格隔开。
空格:if、else、for、switch、while 等逻辑关键字与后面的语句留一个空格隔开;运算符两边各用一个空格隔开;方法的每个参数之间用一个空格隔开。
空行:将逻辑相关的代码段用空行隔开,以提高可读性。空行也只空一行,不要空多行。
变量:一行声明一个变量,不要一行声明多个变量,这样有利于写注释。
推荐书籍:
代码整洁之道
命名规范
想必程序员一想到命名都很头疼,当遇到混乱或错误的命名不仅让我们对代码难以理解,更会误导我们的思维。
良好的命名,则可以大大提高我们的代码易读性,也能大大增强代码的可维护性。
下面的是关于命名规范的一些基础:
包命名:域名反写 + 项目名称 + 模块名称,全部单词用小写字母。
类和接口命名:使用大驼峰规则,用名词或名词词组命名,每个单词的首字母大写。
方法命名:使用小驼峰规则,用动词或者动名词命名,第一个单词的首字母小写,其他单词的首字母大写。
常量命名:全部为大写单词,单词之间用下划线分开。
变量命名:范围描述 + 意义描述 + 类型描述的组合,用驼峰式,首字母小写。
注释规范
我们也一定要养成写注释的好习惯,当我们在写某个程序的时候,可能当下记得很清楚,这一段是什么机制、如何实现,但是当你写的程序越来越多,你会忘记当初为什么这样写,改动和交接也十分麻烦,对代码进行注释就可以有效避免这种情况。
注释不仅可以让人读懂代码,甚至能让读代码的人获取更多信息。
下面是关于注释规范的一些建议:
文件头注释:文件顶部统一添加版权声明。
类和接口注释:类和接口统一添加 javadoc
注释。
方法注释:方法的用途和参数说明,以及返回值的说明。
变量和常量注释:优先采用右侧 //
来注释,若注释说明太长则在上方添加注释。
框架
Java 是目前最热门的编程语言之一,随着 Java 面向对象语言的流行以及多层架构应用的出现,使得应用程序的可复用性得到了大大的提高,框架这个东西也在应用程序中开始出现,并得到了广泛的使用。
在面试中,面试官一般来说会问你一下你们项目中使用的框架,然后给你一些场景问你用框架怎么做。
整理的目前较受欢迎的 Java 框架:
SpringMVC:使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求-响应模型。
Struts2:用于构建当代 JavaEEWeb 应用程序,可以帮你快速搭建出一个MVC模型出来。
Hibernate:是一个开放源代码的对象关系映射框架,是一个全自动的 orm 框架,可参考:
「连Hibernate技术都不清楚,你敢说你自己会ORM框架?」
Spring:是一个开源开发框架,是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架,可参考:
「一文带你了解Spring框架的基本使用」
SSH:是 JAVA EE 中三种框架所集成,分别是 Struts,Spring,Hibernate 框架所组成,是当前比较流行的 java web 开源框架。
SSM:是三层结合所成的框架,分别是 Spring、SpringMVC、MyBatis 所组成。
Mybatis:是一个简化和实现了 java 数据持久层的开源框架,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。
Springboot:是一个全新的框架,简化 Spring 的初始搭建和开发过程,使用了特定的方式来进行配置,让开发人员不再需要定义样板化的配置。
Dubbo:是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及SOA服务治理方案,可参考:
「微服务面试必问的Dubbo,这么详细还怕自己找不到工作?」
Apache Shiro:是 Java 的一个安全框架,旨在简化身份验证和授权。
SpringCloud:是微服务的一种解决方案,依赖 SpringBoot 实现。包含注册中心(eureka)、客户端负载均衡(Ribbon)、网关(zull)、分布式锁、分布式会话等,可参考:
「图文详解:如何给女朋友解释什么是微服务?」
「再深一点:如何给女朋友解释什么是微服务?」
数据库
数据库是很重要的一部分,无论对于面试还是工作中,都是一个老生常谈的话题。
比较重要的是数据库优化部分,小羽之前总结过一篇关于 MySQL 优化的文章,想要了解的可以到下面文章查看:
「干货!MySQL优化原理分析及优化方案总结」
最常见的数据库模型主要是两种,即关系型数据库(SQL)和非关系型数据库(NoSQL)。
关系型数据库:
•大型:Oracle、DB2•中型:SQL Server、MySQL
•小型:Access
非关系型数据库:
•临时性键值存储(memcached、Redis
)•永久性键值存储(ROMA、Redis)•面向文档的数据库(MongoDB、CouchDB)•面向列的数据库(Cassandra、HBase)
经常使用的是 Redis,可以参考这篇文章理解:
「玩转Redis|学会这10点让你分分钟拿下Redis,满足你的一切疑问」
常见数据库:
常见数据库
数据结构
身为程序员的我们,每天都在和不同的数据打交道。那么我们真的对数据结构一清二楚了么?
小羽的文章中也详细的图文介绍了各种数据结构的使用:
「有人相爱,有人年少财务自由,有人数据结构都背不出来」
对各类数据结构进行了分类,并且从定义、特点、原理解析使用方法以及实现的相关案例相结合:
•栈 stack•队列 queue•链表 Link•散列表 Hash Table•排序二叉树•红黑树•B-TREE•位图
数据结构推荐书籍:
大话数据结构
算法
算法无论是对于学习还是工作,都是必不可少的。我们掌握了这些算法背后的逻辑思想,那么是会对我们的学习和工作有很好的促进作用的。
我在之前的文章中详细介绍过一些关于 Java 经典算法:
「算法很美,听我讲完这些Java经典算法包你爱上她」
「周末给女友讲了遍加密算法,没想到...」
主要有以下经典算法,详细介绍了各个算法的简介、应用场景、步骤、代码示例:
•二分查找•冒泡排序算法•插入排序算法•快速排序算法•希尔排序算法•归并排序算法•桶排序算法•基数排序算法•剪枝算法•回溯算法•最短路径算法•最大子数组算法•最长公共子序算法•最小生成树算法
算法推荐书籍:
算法图解
版本管理
在现在市面上的大部分公司的代码都是通过版本管理工具来进行托管的,从之前的 SVN 到现在基本人人必用的 Git。
我们需要了解 Git 的每一个具体命令和参数使用,知道执行每个命令会做什么,避免各类分支或者 fork 操作引起的冲突问题。
可以帮助我们:
1.保存开发过程中的代码,方便后续修改。2.能清楚的看到每一位团队成员提交、修改的代码,责任到人。3.方便我们完成协同开发的任务,高效工作。4.为后续客户提供关于项目不同版本的记录。
关于代码版本管理的工具有很多,下面是我常用的:
•SVN:替换了当年开源社区最为流行的版本控制软件 CVS,在 CVS 的功能的基础上有很多的提升同时也能较好的解决 CVS 系统的一些不足。•Git:用于 Linux 内核开发的版本控制工具,采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。•GitHub:GitHub 是目前为止,用户最多的工具了,而且也有很多的开源项目提供,一直都是程序员最钟爱的平台,想要学习的话,都可以去下载项目来学习。
主流工具:
主流工具
构建工具
构建工具和版本管理一样重要,公司实际开发中我们需要对 Jar 包进行依赖管理,目前主流的构建工具是
maven
(大部分城市) 和gradle
(西安使用比较多)这两款。要想成为一个标准的软件开发人员,我们不仅要学会使用这些工具构建,也要掌握发生依赖冲突该如何解决。
当然,除了 maven 和 gradle,这里也有其他一些构建工具,感兴趣的都可以了解下:
Hudson:用Java编写的持续集成(CI)工具。
Jenkins:用 Java 编写的一个开源持续集成工具。项目是在和 Oracle 发生争执后的来自于 Hudson 的分支。
Apache Ant:用于自动化软件构建过程的软件工具,源于 2000 年初的的 Apache Tomcat 项目。
SBT:用于 Scala 和 Java 项目的开源构建工具,类似于 Java 的 Maven 和 Ant。
Atlassian Bamboo:持续集成和交付工具,它将自动化构建、测试和发布捆绑到单个流程中。
TeamCity:来自于 JetBrains 的一个基于 Java 构建的管理和持续集成服务器。
Grape:嵌入到 Groovy 的 JAR
依赖项管理器。
Ivy:Apache Ant 项目的一个子项目,一个可传递的依赖项管理器。
Leiningen:一个自动化构建和依赖性管理工具,用于使用 Clojure 编程语言写的软件项目。
常用:
Jenkins
单元测试
我们在平时开发过程中,当完成自己的功能模块后,都需要自测一遍,这样可以保证代码的准确性,减少不必要的 bug 出现。
小羽用的最多的也就是 junit 进行单元测试了,使用的是 junit4 这种基于注解的方式来进行单元测试。
常用注解:
1、为了和 spring 集成获取配置的 bean, 通常使用 @RunWith
来加载 springjunit 这个核心类;
2、使用 @ContextConfiguration
来加载相关的配置的文件;
3、通过 @Resource
按名字来注入具体的 bean, 最后在需要测试的方法上面加上 @Test 来进行单元测试。
测试原则:
•源代码和测试代码需要分开;
•测试类和目标源代码的类应该位于同一个包下面,即它们的包名应该一样;
•测试的类名之前或之后加上 @Test
,测试的方法名通常也以 test 开头。
代码示例:
@RunWith(SpringJUnit4ClassRunner.class)//运行spring相关环境 相当于spring监听功能
@ContextConfiguration(locations={"classpath:spring-common.xml","classpath:spring-datasource.xml"})//读取spring配置文件 不识别* 只能识别具体文件 多个配置文件使用string数据传递
public class TestSpring {
//注入Service层
private @Resource UserService userService;
@Test
public void testFind(){
List userList = userService.findAllUserInfo();
for (User user : userList) {
System.err.println(user.toString());
}
}
}
想要学习更多关于单元测试的知识,可以到这篇文章查看:
「告别祈祷式编程|单元测试在项目里的正确落地姿势」
代码调试
代码调试在我们开发中,用的最多的是属于 debug 了,就是我们常说的打个断点,跟着程序一步一步执行,看哪一步有问题,从而排查 bug,是我们解决问题最有效的手段。
当然我们一定要有问题排查的能力,定位到问题来解决。此外,也要学会查看日志,日志能清楚记录我们每一步都做了什么。
这里也给大家提供一些在线调试的网站:
codepad:一款简单的在线 IDE 编辑器服务,只需要把代码粘贴进去就可以编译运行了,支持C、C++、PHP、Python等 9
种编程语言。
Ideone:一款在线的编译器和调试工具,它可以让你来编译,运行,测试和代码,支持 Java、 JavaScript、PHP、Python 等 40
多种编程语言。
PractiCode:是一款在线 Web
代码调试工具,支持HTML、CSS、JavaScript、VBScript 和 PHP 等语言。
cssdesk:是一个在线调试 CSS
代码的工具。
Google Code Playground:是一款在线调试各种 Google JavaScript API
的工具。
推荐:
IDdone
重构代码
每个程序员都需要有最基本的能力去重构目前已有的代码,使代码达到最优但却不能影响任何的已有的功能。
小羽整理了一些关于代码重构的常用方法:
•提取子函数•公共方法放到父类中•下移函数到子类•封装固定的调用逻辑•使用泛型去除重复逻辑•函数避免过多的入参•转移函数,函数职责分明•状态模式•避免对象为 null•拆分功能
推荐书籍:
重构
阅读源码
这个对于我们日后想要更好的晋升空间或者拿到更高的薪资是很重要的。所以我们平时要多阅读源码,掌握底层实现。
虽然会花费我们大量的时间精力去深刻专研,但是当你面试时候,能对某一个技术点的源码给面试官一阵输出的话,那么面试的主动权就会掌握在你的手里。同时多阅读源码,对于我们解决 bug 也有帮助。
总结一下在 IDEA 中如何阅读源码:
1.定位到构造器/方法实现类2.查看类层级关系3.查看类结构4.源码统计5.具体源码
问题排查与解决能力
我们选择开发这条路,会遇到形形色色的问题,发生问题的时候,就是检验程序员能力的时候。很多时候,解决问题并不难,难的是定位问题。
这里面会涉及到很多知识,对于我们的知识储备很重要,所以平时一定要做好积累。
也可以从以下几个方面来提升自己的能力:
•日志的查看•分析Java的堆栈信息•集群监控指标的查看
日志可以在这块了解:
「别小看 Log 日志,它难住了我们组的架构师」
面向Google编程
国内已经有百度了,为什么大部分程序都会去选择使用谷歌呢,因为百度搜索出来的东西太杂,例如你搜索一个技术类的东西,但是百度可能会搜索很多不相干的东西,而谷歌搜索的结果会更加的专业化,这样寻找你需要的信息的时候会更有效率。
普通程序员是面向对象编程的,而真正的高级程序员则是面试 Google 编程的,学好正确的使用 Google 编程是很重要的,同时也是因为 Google 的 Chrome 浏览器自带了丰富的插件,对于我们程序员也十分友好。
我之前介绍的一些关于 Chrome 浏览器插件的介绍:
《Chrome浏览器必备插件推荐》
《Chrome浏览器插件推荐之程序员系列》
有问题,多 Google:
编码之外
笔记
互联网这个行业更新换代很快,需要保持不断的学习,学习的知识点很多,光靠大脑不可能全部记得住。
我们可以把平时记录的技术点、知识、好文章保存或者记录在笔记上。
小羽在这里推荐几款我使用的不错的笔记:
•有道云•印象笔记•OneNote•语雀
推荐语雀:
语雀
MarkDown
Markdown 是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。
我一般都是使用 typora
,这款界面简洁,支持实时预览,支持多种公式类型,支持TOC等标签这款先编写好,然后复制到自己喜欢的编辑器里进行渲染格式,最后发布文章到各个平台。
推荐 Typora:
Typora
学会写作
写作是一个非常好的「进阶」 方式。但是平时我们的程序员同学都会很忙有很多事,导致了我们没有太多的时间,同时也很难持续的进行写作,那么我们应该要如何坚持写作呢?
其实是无论坚持什么事情都不是一件容易的事情,写作可以先从技术博客开始,后面也可以写一写生活中的事情。反正就是先让自己写起来,先写起来之后养成习惯,你会受益一辈子的。
一般都会选用上面所说的 Markdown 语法写作,编辑工具也很多,在线的、PC端的都有。
比如我书签里的这些:
编辑器
团队协作
我们开发过程中,无论哪一个项目都是很多人一起完成的。任何编程工作不可能会让你自己一个人完成,我们自己写的的代码必须与别人的交互或者混合。就算很优秀的程序员,如果无法与别人协作,都会给项目造成负面影响,对公司的正常运营造成影响。
作为一个合格的程序员,我们更应该学会与人合作。有一句话我记得非常清楚,没有一个人的成功,每个人的成功都是建立在和别人合作的基础之上的, 我们是一个整体,需要共同面对困难,一起分享成功。
下面的方法可以参考:
•分工合理,责任明确,模块化•高效的沟通机制(聊天软件,任务面板,邮件等)•定期检查,及时调整(codeReview
、日报、周报、大小会议)
不断学习
在日常开发中,一定要学会去 github 等网站上,学习一些别人的优秀开源项目,学习别人的思想和构架,学习别人的逻辑。
总结自己编码过程中的局限性,只有在不断的学习过程中,才能使的自己的技术不断上升。
之前整理过一些关于学习平台网站的总结:
《程序员必备的技术网站合集》
《程序员自由工作平台国内外汇总篇》
我书签中的学习网站:
学习网站
创建自己的产品
作为软件开发人员,我们不仅能够开发软件产品,还可以开发书籍和视频这样的信息产品。
我认识的很多大佬,都与出版社有合作关系,出版了自己的书籍,或者入驻 b 站等视频领域有不错的成绩,这对于个人的 ip
塑造以及后续发展会提供很好的影响力。
我认为应该具备以下能力:
•要选择好方向,多调研,了解用户的需要。•在开始之前,尽量先去市场做看看有没有同类产品,了解现状。•注重好细节,以免后续产品缺陷太多。
在以下平台都可以尝试:
创作平台
身体是革命的本钱
程序员的工作,大多是坐在电脑屏幕前,一坐就是几小时,缺乏锻炼,我们当中很多人都会得颈椎病,还有得了脂肪肝,一些人得了腰间盘突出,以至于年纪轻轻,身体就不行了。
所以,一定要爱护自己的身体,学会养生,不仅是对自己负责,也是对社会负责。
小羽在这里给出的一点建议:
•保持充足的睡眠•养成规律的饮食•坚持健身•多跑步走动•合理的加班•培养其他兴趣
学会技术输出和分享
将学到的编程知识写下来,并且将它分享给其他的程序员,将让你变得更优秀。写文章的好处是多方面的。你能够分享想法,并帮助全世界的程序员
我们应该把每天学习的知识、技术,或者是看书的心得体会,用自己的方式表达出来。可以通过发博客、公众号等等平台,也可以通过视频的方式。
在我书签里的这些平台,我都会坚持在每个平台分享:
博客网站
尝试自媒体
什么是自媒体呢?从名称属性来看,很简单,就是自己做自己的媒体,自己将自己的东西分享出来,就是自媒体。
对于我来说呢,我觉得自媒体还是很有前景的,有很多人说哪个类型自媒体已经很晚了。我觉得只要你自己用心做这件事,什么时候都不算晚。成功都是属于那些坚持到最后的人的。
我之前也分享过一些关于自媒体的心得和总结:
「自媒体人必不可少的多平台同步、一文多发小助手」
「人人自媒体的时代,程序员该如何利用好自己的优势?我记住了这些神器...」
「写给普通人看的自媒体分享|万事开头难,勇于分享自己,我们都很棒!」
需要我们平时多收集整理一些需要会用到的方方面面的工具,才会如鱼得水,应用自如:
自媒体创作工具
多看官方文档
官方文档远比网上的各种博客和论坛等更适合入门学习。当我们遇到很多问题和技术细节的时候,认真将官方文档过一遍,你会发现很多问题和认识模糊的地方都会清晰起来。
程序员都应该掌握通过官方文档去学习一个技术的能力,掌握了这项能力,你就具备了学会其他一切技术框架的基础;而且最原始的官方文档,还能锻炼你的自我学习总结能力。
Spring 官方文档示例:
Spring官方文档
培养自学能力
程序员无论合适都要有一颗保持学习的心,因为技术更新快、需求变化快,我们不学习就会被淘汰。
机会和挑战只会分配给有准备的人,当我们有机遇能进更好的公司的时候,还是需要依靠自身的硬实力的,这个时候如果我们长期自学积累知识的话,相信都可以把握住任何机会的。
我认为自学应该从这几方面入手:
•先确定好当前的方向•做好长期吃苦的准备•有规律有目的型的学习•在一个安静的地方学习•利用好现有的**网络资源与书籍****
我虽然是做 Java 的,但是有时间也会去了解其他语言的书籍:
技术书籍
英语水平
对于我们来说,因为技术文档都是英文的,虽然阅读别人的文档可以通过翻译成中文文档来查看,但是一味相信翻译并不可取,毕竟有错误和疏漏有时候都不知道。
而且我们编程每天都在和英语打交道,有更好的英语水平,对我们代码的命名等等都会有很大的帮助。
推荐几款不错的练习英语的软件:
•百词斩•羊驼英语•扇贝单词•有道词典•英语流利说
推荐百词斩:
百词斩
扩展人际关系
程序员是一个长时间在电脑旁边的人类,我们的业余时间不多,周六日可能还加班,所以封闭性很强。
但是我们一定要抽出时间来维护自己的人脉管理。本身压力也比较大,有了更多的朋友的话,我们闲时也可以一起约出来,聊聊天,谈谈未来的发展。每个人的格局都不一样,多多交流,才能不断进步。
下面我给大家说一下我是怎么维护自己的人脉:
•要学会主动联系•多参加一些社交活动•像优秀的人多取经•线上线下都可以认识
良好的逻辑思维
逻辑思维能力是我们学习、工作、以及生活中必不可少的一种能力。
拥有良好的逻辑思维,有助于我们高效地学习,工作,以及生活。总之,练好逻辑思维,可以让我们变聪明、变自信,脱颖而出。
•结构化思维:把事物组成框架,分类、有序的整合起来•系统化思维:整体考虑,注重每一个联系。•打破定势思维:要学会创新,增加求知欲。•情绪控制:合理控制自己的情绪。•换位思考:发生事情冲突,也要在别人角度考虑。
时间管理能力
时间就是金钱,效率就是生命,一点也不过。我们现在这个社会大部分人都有拖延症,该如何解决呢?
其实现在影响我们最大的就是手机了,相比大部分都会一有闲暇时间就会大有手机上的娱乐软件(短视频之类)来打发时间,避免这样,我们就需要一些时间管理工具来改善。
给大家介绍一些我觉得不错的时间管理工具:
•番茄 ToDo•Forest 专注森林•滴答清单•小日常•Pendo•块时间•极简代办•Todolist
推荐滴答清单:
滴答清单
最后
哈哈,不好意思,因为很久没更文,所以这一篇就写的有点多了,也算是补上欠下的文章。但是以上列出来的这些清单我相信你用心读完后,肯定还是会有所收获的。
的确,软件开发最重要的技能是提升技术,只要完成任务即可,但是一味的为了完成公司代码而编程我觉得并不可取。
我们也要为自己的未来考虑,毕竟摆在我们面前的 35 岁抉择是迟早会到的,所以不断提升自己的各方面技能才能起到未雨绸缪的作用。
最后一句话,送给大家:硬实力决定下限,软实力决定上下限。编码之外的软实力也是我们不断前进的源源动力,一起加油吧!