2020年,我在编程时遇见的几个好物

4,804 阅读12分钟

年年都写年终总结,确实没什么新意,虽然今年也做了总结,但写完之后总觉得过于悲观,只是到了年底应该要有些什么表示,想着今年是该换个花样了,于是便有了这篇《2020 年,我在编程时遇到的几个好物》。

这篇文章介绍的,有框架,有工具,有软件,都是自己在编程时遇到的有用的,而且自己比较喜欢的,这里分享给大家。正所谓相遇即是缘,若是你有幸读到这篇文章并且觉得还不错,不妨点赞关注支持一波。

Hutool

第一个要介绍的便是 Hutool,Hutool 是一个 Java 工具包,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行封装,组成各种 Util 工具类。他的作用就是帮助我们简化代码,让程序员将更多的经历放在业务上而非一些无关紧要的工作上。

举个例子,近期我有一个很小的需求,一个大文件夹里有很多小文件夹,每个小文件夹里有一些我需要整理出来的 word 文档,如果通过界面点击的话,我可能需要点击 100 多个文件夹,所以很自然的就会想到用程序去实现这个需求,第一想法肯定是 shell 脚本或者 python 脚本,但其实借助 hutool 和 Java8 里的 lambda 表达式,同样可以很方便的实现这么一个小需求,如下所示:

public class Main {
    public static void main(String[] args) {
        List<File> files = FileUtil.loopFiles("xxxPath", file ->
                FileUtil.extName(file).equalsIgnoreCase("docx") || FileUtil.extName(file).equalsIgnoreCase("doc")
        );
        files.forEach(file -> FileUtil.copyFile(file.getAbsolutePath(), "xxxxxPath", StandardCopyOption.REPLACE_EXISTING));
    }
}

使用FileUtil.loopFiles就可以直接获取该路径下的所有文件,如要筛选,只需要在后面追加参数即可。 这样的工具类还有很多,例如发邮件,直接使用 MailUtil.send 即可。

MailUtil.send("yueyong1030@outlook.com", "新年快乐", "赶紧关注「01二进制」,现在关注以后就是老粉了", false);

安装方法也非常简单,Maven 安装

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.6</version>
</dependency>

如果你使用的是 Gradle,进行以下配置即可

compile 'cn.hutool:hutool-all:5.5.6'

Flutter

第二个要介绍的是一个跨平台应用开发框架——Flutter。说到 Flutter,还真是有些缘分。2018 年我开始写公众号,我的第一篇破 10w 阅读的便是发表在简书上的《你好,Flutter》。那一年,Flutter 横空出世,颇有一番要改变移动端开发的势头。因为自己本科时做过一段时间的移动端开发,在阅读其官方文档后便被其深深吸引了,期间也写过一些入门文章,只是不成体系罢了。如今虽然不做移动端开发了,但总还是在关注着 Flutter 社区的发展,今年因为要忙活毕业设计,于是便又将其重新拾起了。

官网说 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。简单而言就是,Flutter 是 Google 一个新的用于构建跨平台的手机 App 的 SDK。写一份代码,在 Android 和 iOS 平台上都可以运行,当然了,现在也可以运行在 web 端和桌面端,只是效果还不如移动端好。

虽然在 Flutter 之前,已经出现过一些跨平台方案了,比如 ReactNative、Weex 等,但仍然有很多人喜欢 Flutter,我也曾在知乎回答过为何有人会喜欢 Flutter? - LYYYYY 的回答 - 知乎 。个人认为原因有以下几点:

  1. 大厂背书,谷歌一直在推广
  2. 学习成本低,只要会 Java,就可以快速上手 Dart 语言
  3. 跨平台,这是最重要的一点,目前 Flutter 已经可以运行在 Android、iOS、MacOS、Windows、Linux 等平台上,编写一次到处运行对于一个想要快速做出成品的团队来说无疑是一个好的选择
  4. 组件丰富,Flutter 内置了许多非常好看的组件,pub.dev 上也有很多优秀的第三方组件,使用起来也很方便
  5. 开发出的 App 性能足够强大。

总的来说,对于一个想要快速做出跨平台 App人/小团队来说(比如做毕业设计、初创公司等),Flutter 确实是一个很好的选择。

Docker

第三个要说的是一个运维工具——Docker。说起 Docker 想必很多人都不陌生了,Docker 是近几年非常火的一个工具,虽然前几年就有所耳闻,但直到今年我才算是日常使用。

其实 Docker 的出现就是为了解决软件开发的一大难题——环境配置。每个用户的设备不一致,环境自然也是千差万别。如何保证你的代码在其他地方也可以运行?

用户必须保证两件事:操作系统的设置以及各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

那有没有一种办法,从根本上解决问题,让软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

虚拟机就是一种解决方案,只是这种解决方案占用资源多、荣誉步骤繁杂且启动慢,于是 Linux 发展出了另一种虚拟化技术:Linux 容器。**Linux 容器不是一个完整的操作系统,而是对进程进行隔离。**或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。简单而言就是容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

Docker 就属于Linux 容器的一种封装,提供简单易用的容器使用接口**。它是目前最流行的 Linux 容器解决方案。**

今年我使用 Docker 主要是为了提供一次性的环境以及组建微服务架构。我通过 docker-compose 整合项目中所需要的中间件,例如 MySQL、Redis、MQ 等。

我也曾在掘金上翻译过相关的文章,如《【译】在几秒钟内为你的开发环境创建一个私有 PostgreSQL 数据库》以及《【译】5 分钟内从单体架构迁移到微服务架构》等,有兴趣的小伙伴不妨点击阅读。

Lambda

第四个要介绍的既不是框架也不是工具,而是 Java8 新引入的一种特性——Lambda。说起 Lambda 表达式,就不得不说函数式编程。

和面向对象(OOP)一样,函数式编程也是一种思想,一种理念。如果说面向对象编程是对数据的抽象,那么函数式编程就是对行为的抽象。

而 Lambda 正是函数式编程这种思想的实际体现。Lambda 表达式,也可称为闭包,它允许把函数作为一个方法的参数(函数作为参数传递进方法中),可以使代码变的更加简洁紧凑。

说了这么多,太过空洞,举一个简单的例子。

下面的代码所做的事情是:为一个按钮增加一个监听事件,当点击这个按钮时,将会触发打印“button clicked”行为。

button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            System.out.println("button clicked");
        }
});

这段代码很好理解,但也侧面说明了一个问题,在 Java 支持函数式编程以前,我们如果需要传递一个行为常用的方式就是传递一个对象,而匿名内部类正是为了方便将代码作为数据进行传递。

只是在 Java8 引入函数式编程后,我们可以将点击事件抽象出来,作为参数传递,示例代码如下:

button.addActionListener(event -> System.out.println("button clicked"));

这种方式,就被称为 Lambda 表达式。Lambda 表达式语法规则主体分为两个部分,中间用“->”右箭头连接,左边代表参数,右边代表函数主体。

函数式编程出现已经很久了,但是我之前也只是简单的学习过,真正开始日常使用还是暑期在淘宝实习的时候,项目代码里有很多 Lambda 的身影(不排除师兄们炫技的可能),虽然一开始看起来有点烦人,不太好理解,但熟悉之后,对项目代码的精简也是有目共睹的。

关于 Lambda 的资料网上有很多,这里只是推荐,有兴趣的小伙伴可以搜索学习,相信了解之后你一定会对他爱不释手的。

Proxyman

接下来要说的就都是一个软件了。第一个软件便是 Proxyman。无论是前端开发还是后端开发,尤其是爬虫工程师,抓包都是一个非常重要的技能,而一个好的抓包工具至关重要。Proxyman 是我今年无意中发现的一款抓包工具,只用了一次我就喜欢上他了。

选它的理由很简单,使用简单。相比 Charles,可以随意布局,可以多设备分别管理,一屏可以预览所需的关键信息。而且做移动端的抓包时,配置相较于 Charles 简单许多。最最重要的是,颜值足够高。正所谓颜值即正义,对于一个软件来说,同样如此,如果一个软件长得不好看,那也一定不是一个好软件。

不过这款软件只在 Mac 上有,这倒是一个遗憾。

iTerm2

和 Proxyman 一样,iTerm2 也是 Mac 独占的软件。可以说 iTerm2 是 MacOS 上首选的终端工具,毕竟作为一个 Coder,总是用图形化界面可不是什么好事情。虽然 MacOS 默认给我们提供了一个终端软件,但是 iTerm2 的比之强大太多,各种花里胡哨的配置网上已有很多,这里也不多说什么了。

这一年,我用它连接远程服务器,查看日志等信息,iTerm2 帮了我不少忙,如果你想尝试使用命令处理操作,iTerm2 会是一个很好的选择的。

PPRows 或cloc

image.png

其实这两个东西的功能都是一样的,就是用来统计代码行数的,只不过一个是图形化界面,一个是终端命令,就看你更喜欢的是哪一个了,只不过 PPRows 只能在 Mac 上使用,这点可能会影响你们的选择。

我个人倾向使用 cloc,毕竟能用命令解决的事情为什么要用鼠标去完成呢?

不说了,这就去统计我的毕设有多少代码了。

uTools

只一张图,我想你一定立刻就能知道 uTools 是一个怎样的软件。

uTools  是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。 当你熟悉它后,能够为你节约大量时间,让你可以更加专注地改变世界。

这是来自  uTools 官方网站的一段话,它其实是几个程序员为自己开发的一个工具,当然也适用于大部分的人。

阅读英文文档时,如果有些单词不太清楚,直接快捷键呼出翻译;突然要计算时,直接快捷键呼出计算器;想要查看颜色代码?想要 OCR?uTools 都可以实现。

相比较 Alfred,uTools 更加本土化,操作逻辑更加直观简单,最重要的是,对于非 macOS 用户来说,没有一款可以媲美 Alfred 的 Spotlight 应用,一直是一个遗憾。而 uTools 同时支持 MacOS、Linux 和 Windows。不管你换到了什么操作系统,都可以无缝体验到 uTools 给予你强大的功能支持。

VSCode

既然文章说的是在编程时遇见的好物,那一定离不开 IDE。我之所以没有介绍诸如 IDEA、WebStorm 这些主流 IDE,就是觉得太过普遍,吃饭的家伙没什么好说的。

但是 VSCode,今年确实给了我很大的惊喜。之前使用 VSCode,我更多是将其作为一个文本编辑器的。不过今年在任务加重的情况下,同时开了 IDEA、AndroidStudio 和 WebStorm 时,我的 16g 内存的 MacBook pro 明显感觉吃力很多,于是我便将目光转向了之前这个“文本编辑器”了。

他的优势很明显,插件丰富,语言支持完善,不管是前端的 Vue、React 还是 Flutter,都完美支持。配合着 LeetCode 插件,还可以直接在编辑器中做题提交。安装配置了 Java 的插件后,写 Java 代码的体验也接近 IDEA。不仅占用内存小,打开文件的速度还极快。最最关键的是,好看。想当初,众多开发者还在其与 sublime text 和 atom 中纠结,现如今,后两者不知还有多少分量了。

就像我之前说的,VSCode 更多是做“文本编辑器”用,这一年我用 Markdown 写博客、公众号,内容几乎都是 Typora 和 VSCode 搭配使用。不仅如此,最近我又用 VSCode 解锁了编写 Latex 的新姿势。写论文的体验又上升了。

不说了,这就用 VSCode 肝论文去。

总结

以上就是我在 2020 年编程时遇见的几个好物,写着写着都感觉自己成恰饭的了。2020 已到年尾,不知道你们对于新的一年又有什么新的计划呢?不妨拿个小本本记录下今年要做的事情哦,最后祝看到这里的读者们可以在牛年牛气冲天!