大家好,我是小羽。
好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章。
会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全面发展,才能在这个日趋激烈的社会,在未来有更好的发展空间。
话不多说,本期为大家介绍的是关于一些程序员必备技能介绍,相信掌握这些编码内外的技能,我们会朝优秀软件开发人员更近一步。
下面就来看看我总结的这些技能,准备好进收藏夹(吃灰)了嘛?
编码之内
代码规范
虽然说我们现在可以用不规范的方式写代码,现在能看得懂,但等过了几个月后,你再回头看时估计就两眼懵圈了。更不要说万一项目迭代开发,交接给其他人了,所以代码一定要写规范。
下面的是我总结的一些代码规范注意事项:
编码方式:统一用 UTF-8
,一般情况下不要去改动它。
缩进:统一为 4 个空格,将 Tab size 设置为 4 则可以保证 tab 键按 4 个空格缩进。
括号:花括号不要单独一行,和它前面的代码同一行。而且,花括号与前面的代码之间用一个空格隔开。
空格:if、else、for、switch、while 等逻辑关键字与后面的语句留一个空格隔开;运算符两边各用一个空格隔开;方法的每个参数之间用一个空格隔开。
空行:将逻辑相关的代码段用空行隔开,以提高可读性。空行也只空一行,不要空多行。
变量:一行声明一个变量,不要一行声明多个变量,这样有利于写注释。
推荐书籍:
代码整洁之道
命名规范
良好的命名,则可以大大提高我们的代码易读性,也能大大增强代码的可维护性。
下面的是关于命名规范的一些基础:
包命名:域名反写 + 项目名称 + 模块名称,全部单词用小写字母。
类和接口命名:使用大驼峰规则,用名词或名词词组命名,每个单词的首字母大写。
方法命名:使用小驼峰规则,用动词或者动名词命名,第一个单词的首字母小写,其他单词的首字母大写。
常量命名:全部为大写单词,单词之间用下划线分开。
变量命名:范围描述 + 意义描述 + 类型描述的组合,用驼峰式,首字母小写。
注释规范
注释不仅可以让人读懂代码,甚至能让读代码的人获取更多信息。
下面是关于注释规范的一些建议:
文件头注释:文件顶部统一添加版权声明。
类和接口注释:类和接口统一添加 javadoc
注释。
方法注释:方法的用途和参数说明,以及返回值的说明。
变量和常量注释:优先采用右侧 //
来注释,若注释说明太长则在上方添加注释。
框架
在面试中,面试官一般来说会问你一下你们项目中使用的框架,然后给你一些场景问你用框架怎么做。
整理的目前较受欢迎的 Java 框架:
SpringMVC:使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求-响应模型。
Struts2:用于构建当代 JavaEEWeb 应用程序,可以帮你快速搭建出一个MVC模型出来。
Hibernate:是一个开放源代码的对象关系映射框架,是一个全自动的 orm 框架,可参考:
「连Hibernate技术都不清楚,你敢说你自己会ORM框架?」
Spring:是一个开源开发框架,是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架,可参考:
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 优化的文章,想要了解的可以到下面文章查看:
最常见的数据库模型主要是两种,即关系型数据库(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 经典算法:
主要有以下经典算法,详细介绍了各个算法的简介、应用场景、步骤、代码示例:
•二分查找•冒泡排序算法•插入排序算法•快速排序算法•希尔排序算法•归并排序算法•桶排序算法•基数排序算法•剪枝算法•回溯算法•最短路径算法•最大子数组算法•最长公共子序算法•最小生成树算法
算法推荐书籍:
算法图解
版本管理
我们需要了解 Git 的每一个具体命令和参数使用,知道执行每个命令会做什么,避免各类分支或者 fork 操作引起的冲突问题。
可以帮助我们:
1.保存开发过程中的代码,方便后续修改。2.能清楚的看到每一位团队成员提交、修改的代码,责任到人。3.方便我们完成协同开发的任务,高效工作。4.为后续客户提供关于项目不同版本的记录。
关于代码版本管理的工具有很多,下面是我常用的:
•SVN:替换了当年开源社区最为流行的版本控制软件 CVS,在 CVS 的功能的基础上有很多的提升同时也能较好的解决 CVS 系统的一些不足。•Git:用于 Linux 内核开发的版本控制工具,采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。•GitHub:GitHub 是目前为止,用户最多的工具了,而且也有很多的开源项目提供,一直都是程序员最钟爱的平台,想要学习的话,都可以去下载项目来学习。
主流工具:
主流工具
构建工具
当然,除了 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
单元测试
小羽用的最多的也就是 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<User> userList = userService.findAllUserInfo();
for (User user : userList) {
System.err.println(user.toString());
}
}
}
想要学习更多关于单元测试的知识,可以到这篇文章查看:
代码调试
当然我们一定要有问题排查的能力,定位到问题来解决。此外,也要学会查看日志,日志能清楚记录我们每一步都做了什么。
这里也给大家提供一些在线调试的网站:
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的堆栈信息•集群监控指标的查看
日志可以在这块了解:
面向Google编程
普通程序员是面向对象编程的,而真正的高级程序员则是面试 Google 编程的,学好正确的使用 Google 编程是很重要的,同时也是因为 Google 的 Chrome 浏览器自带了丰富的插件,对于我们程序员也十分友好。
我之前介绍的一些关于 Chrome 浏览器插件的介绍:
有问题,多 Google:
编码之外
笔记
我们可以把平时记录的技术点、知识、好文章保存或者记录在笔记上。
小羽在这里推荐几款我使用的不错的笔记:
•有道云•印象笔记•OneNote•语雀
推荐语雀:
语雀
MarkDown
我一般都是使用 typora
,这款界面简洁,支持实时预览,支持多种公式类型,支持TOC等标签这款先编写好,然后复制到自己喜欢的编辑器里进行渲染格式,最后发布文章到各个平台。
推荐 Typora:
Typora
学会写作
其实是无论坚持什么事情都不是一件容易的事情,写作可以先从技术博客开始,后面也可以写一写生活中的事情。反正就是先让自己写起来,先写起来之后养成习惯,你会受益一辈子的。
一般都会选用上面所说的 Markdown 语法写作,编辑工具也很多,在线的、PC端的都有。
比如我书签里的这些:
编辑器
团队协作
作为一个合格的程序员,我们更应该学会与人合作。有一句话我记得非常清楚,没有一个人的成功,每个人的成功都是建立在和别人合作的基础之上的, 我们是一个整体,需要共同面对困难,一起分享成功。
下面的方法可以参考:
•分工合理,责任明确,模块化•高效的沟通机制(聊天软件,任务面板,邮件等)•定期检查,及时调整(codeReview
、日报、周报、大小会议)
不断学习
总结自己编码过程中的局限性,只有在不断的学习过程中,才能使的自己的技术不断上升。
之前整理过一些关于学习平台网站的总结:
我书签中的学习网站:
学习网站
创建自己的产品
我认识的很多大佬,都与出版社有合作关系,出版了自己的书籍,或者入驻 b 站等视频领域有不错的成绩,这对于个人的 ip
塑造以及后续发展会提供很好的影响力。
我认为应该具备以下能力:
•要选择好方向,多调研,了解用户的需要。•在开始之前,尽量先去市场做看看有没有同类产品,了解现状。•注重好细节,以免后续产品缺陷太多。
在以下平台都可以尝试:
创作平台
身体是革命的本钱
所以,一定要爱护自己的身体,学会养生,不仅是对自己负责,也是对社会负责。
小羽在这里给出的一点建议:
•保持充足的睡眠•养成规律的饮食•坚持健身•多跑步走动•合理的加班•培养其他兴趣
学会技术输出和分享
我们应该把每天学习的知识、技术,或者是看书的心得体会,用自己的方式表达出来。可以通过发博客、公众号等等平台,也可以通过视频的方式。
在我书签里的这些平台,我都会坚持在每个平台分享:
博客网站
尝试自媒体
对于我来说呢,我觉得自媒体还是很有前景的,有很多人说哪个类型自媒体已经很晚了。我觉得只要你自己用心做这件事,什么时候都不算晚。成功都是属于那些坚持到最后的人的。
我之前也分享过一些关于自媒体的心得和总结:
「人人自媒体的时代,程序员该如何利用好自己的优势?我记住了这些神器...」
「写给普通人看的自媒体分享|万事开头难,勇于分享自己,我们都很棒!」
需要我们平时多收集整理一些需要会用到的方方面面的工具,才会如鱼得水,应用自如:
自媒体创作工具
多看官方文档
程序员都应该掌握通过官方文档去学习一个技术的能力,掌握了这项能力,你就具备了学会其他一切技术框架的基础;而且最原始的官方文档,还能锻炼你的自我学习总结能力。
Spring 官方文档示例:
Spring官方文档
培养自学能力
机会和挑战只会分配给有准备的人,当我们有机遇能进更好的公司的时候,还是需要依靠自身的硬实力的,这个时候如果我们长期自学积累知识的话,相信都可以把握住任何机会的。
我认为自学应该从这几方面入手:
•先确定好当前的方向•做好长期吃苦的准备•有规律有目的型的学习•在一个安静的地方学习•利用好现有的网络资源与书籍**
我虽然是做 Java 的,但是有时间也会去了解其他语言的书籍:
技术书籍
英语水平
而且我们编程每天都在和英语打交道,有更好的英语水平,对我们代码的命名等等都会有很大的帮助。
推荐几款不错的练习英语的软件:
•百词斩•羊驼英语•扇贝单词•有道词典•英语流利说
推荐百词斩:
百词斩
扩展人际关系
但是我们一定要抽出时间来维护自己的人脉管理。本身压力也比较大,有了更多的朋友的话,我们闲时也可以一起约出来,聊聊天,谈谈未来的发展。每个人的格局都不一样,多多交流,才能不断进步。
下面我给大家说一下我是怎么维护自己的人脉:
•要学会主动联系•多参加一些社交活动•像优秀的人多取经•线上线下都可以认识
良好的逻辑思维
拥有良好的逻辑思维,有助于我们高效地学习,工作,以及生活。总之,练好逻辑思维,可以让我们变聪明、变自信,脱颖而出。
•结构化思维:把事物组成框架,分类、有序的整合起来•系统化思维:整体考虑,注重每一个联系。•打破定势思维:要学会创新,增加求知欲。•情绪控制:合理控制自己的情绪。•换位思考:发生事情冲突,也要在别人角度考虑。
时间管理能力
其实现在影响我们最大的就是手机了,相比大部分都会一有闲暇时间就会大有手机上的娱乐软件(短视频之类)来打发时间,避免这样,我们就需要一些时间管理工具来改善。
给大家介绍一些我觉得不错的时间管理工具:
•番茄 ToDo•Forest 专注森林•滴答清单•小日常•Pendo•块时间•极简代办•Todolist
推荐滴答清单:
滴答清单
最后
哈哈,不好意思,因为很久没更文,所以这一篇就写的有点多了,也算是补上欠下的文章。但是以上列出来的这些清单我相信你用心读完后,肯定还是会有所收获的。
的确,软件开发最重要的技能是提升技术,只要完成任务即可,但是一味的为了完成公司代码而编程我觉得并不可取。
我们也要为自己的未来考虑,毕竟摆在我们面前的 35 岁抉择是迟早会到的,所以不断提升自己的各方面技能才能起到未雨绸缪的作用。
最后一句话,送给大家:硬实力决定下限,软实力决定上下限。编码之外的软实力也是我们不断前进的源源动力,一起加油吧!