- 博客(81)
- 资源 (6)
- 收藏
- 关注
原创 程序员的晋升困境
点击蓝字,立即关注你是一位工作多年的程序员,在公司的职位是”软件工程师”,用国内常说的职级体系来看,你是一个 P6,一线干活写代码的大头兵。但在日常工作内容中,却并没有太多时间去写代码,似乎大部分时间都在开会,不停地开会。你希望能够有时间停下来写代码,但似乎有更多的工作需要你来做,比如:给刚毕业的校招生讲解业务知识,帮助他们更好地解决工作中的问题;与其他合作团队沟通、对齐,帮助团队成员梳理工作内容...
2024-08-18 13:12:31 6205
原创 你不会到现在还不知道 Android 中的那些 JDK 配置吧?
在做 Android 应用开发时,不可避免的要使用到 JDK 。在众多版本的 JDK 中, 项目代码的编译会使用哪个版本,开发者要如何指定使用的 JDK 版本?选择和指定 JDK 是一个非常重要的步骤,它会影响整个开发过程。不论你的源码是用 Java 还是 Kotlin 进行编写的,或者是两者皆用。在整个项目开发迭代周期中,都会有很多地方涉及到 JDK 版本,如下图所示,我们可以看到其中错综...
2024-08-13 08:30:29 1661
原创 函数式编程:尾调优化
在函数式编程中, 函数是一等公民,实现中,会有很多代码都使用递归进行实现。在编写优雅代码的过程中,也会引入一定的风险:栈溢出。为了解决这个问题, 作为函数式编程风格的语言都会提供「尾调优化(Tail Call Optimization, TCO)」的特性。什么是尾调用?尾调用(Tail Call)指的是一个函数的最后一条语句是一个返回调用函数的语句,这个函数调用可以是对另一个函数的调用,也可以是对...
2024-08-10 10:03:14 434
原创 Android 中compileSdk、minSdk、targetSdk 是干什么用的?
作为多年 Android 开发的老司机, compileSdk 、minSdk、targetSdk 都是经常见到,但其具体含义是什么?它们都是在什么场景下去使用的。回想起来还真不太能说得清楚。背景要想说清楚它们是干什么的,那就不得不说一下主角 Android 操作系统。Android 操作系统在 2008 年发布了第一个版本,到今年已经发布了几十个版本:Android 版本历史(图源维基百科)在如...
2024-08-02 09:03:04 2473
原创 ProGuard 进阶系列(四)访问者模式
在进行后面的内容分析之前,不得不讲到访问者模式,这是 GOF 23 个设计模式中最难的几个模式之一。如果能够很好的理解访问者模式, 后续源码解读会相对容易一些。本文将结合 ProGuard 的部分源码,理解分析访问者模式的用途及使用场景。一、什么是访问者模式先来看定义,访问者模式是一种将对象操作算法与对象结构分离的设计模式。这句话很抽象,不是很好理解。用通俗的话来讲就是:我们在写代码的时候,一般情...
2023-06-29 09:01:44 293
原创 ProGuard 进阶系列(三) Java 类文件解析
书接上文,当我们从用户的配置文件中读取到所有的配置信息后,下一步便是将配置中的指定的类文件进行读取,构建需要混淆的 Java 类文件的语法树。在阅读类文件之前,先来看一下输入输出参数中的内容,我使用的是一个 Android 项目的输出产物,使用 -injars、-outjars、-libraryjars 指定了相关的信息,运行起来,这些信息会放到 Configuration 中,具体信息看下图:p...
2023-06-20 09:00:45 1087
原创 ProGuard 进阶系列(二)配置解析
书接上文,从开源库中把代码下载到本地后,就可以在 IDE 中进行运行了。从 main 方法入手,可以看到 ProGuard 执行的第一步就是去解析参数。本文的内容主要分析源码中我们配置的规则解析的实现。在上一篇文章末尾,在 IDE 中,添加了 @/Users/xxx/debug_proguard.pro 作为函数运行的入参,将配置文件的路径传递给 ProGuard 使用。先来看一下 Main 函数...
2023-06-15 09:00:17 989
原创 ProGuard 进阶系列(一): 运行源代码
在前面的文章深入 Android 混淆实践:ProGuard 通关秘籍和深入 Android 混淆实践:多模块打包爬坑之旅中,已经讲到了如何在 Android 中使用 ProGuard,以及如何自定义实现混淆规则的生成。为了更深入地理解 ProGuard 的细节,本系列文章从我感兴趣的点出发,记录在阅读 ProGuard 源码过程中的思考与启发,希望对你也有所帮助。本文为此系列文章的开篇,将最基础...
2023-06-09 08:50:30 968
原创 Android 图片编码之必备技能
在进行 Android 开发时,不可避免地会接触到许多图片格式,例如 JPEG、PNG 等。就以 JPEG 格式为例,它是一种有损压缩模式,使用 YCbCr 的颜色空间来保存色彩信息。当需要在屏幕上显示图片时,会将 JPEG 数据解码成 RGB 进行显示。本篇文章可能对初学者来说略显复杂。因此,建议读者具备一定的图像处理和 Android 开发基础知识。下面,一起来看看在 Android 中,如何...
2023-05-26 09:00:36 879
原创 解密Java Class文件不为人知的秘密
Java 诞生多年,因此在网络上,有关 Java Class 文件格式解析的文章有很多,但他们大多数都是在列举《Java 虚拟机》中定义的格式,通读下来,好像所有的东西都讲清楚了,但是我个人好像并没有看懂,不知道定义的这些东西到底是用来存储什么东西的。本文仍然是在讲《Java 虚拟机》中定义的 Class 文件的格式,但会更多的从一个应用开发者的角度,将字节码文件中定义的字段与原始的 Java 代...
2023-05-24 09:00:56 942
原创 深入理解 Java Class 文件格式
Java 诞生多年,因此在网络上,有关 Java Class 文件格式解析的文章有很多,但他们大多数都是在列举《Java 虚拟机》中定义的格式,通读下来,好像所有的东西都讲清楚了,但是从我个人角度,并没有看懂,不知道定义的这些东西到底是用来存储哪些信息。本文仍然是在讲《Java 虚拟机》中定义的 Class 文件的格式,但会更多的从一个应用开发者的角度,将字节码文件中定义的字段与原始的 Java ...
2023-04-28 14:43:20 117
原创 Git 必知必会:原理剖析(二)
书接上文,在上一篇文章记录Git 必知必会:原理解析 中记录了 Git 原理中的一部分信息,但在后续的学习过程中,还有部分内容需要记录,但有了此篇内容。一、Git 中的引用从前面文章中的的 Git 仓库树目录存储结构图中,可以看到,通过 commit 的 SHA-1 值,我们就一步一步查看所有的提交记录,以及项目中的文件内容。但 40 位的字符串几乎不可能记忆下来,也没有什么实质性的意义。那如果我...
2023-02-25 09:30:08 311
原创 Git 必知必会:原理剖析
作为程序员,最常用的版本管理工具便是 Git。但我相信大多数人和我一样,从没有认真了解过其具体实现的原理。但了解 Git 的原理,能有助于我们工作更好的使用 Git。下面,让我们一起来了解 Git 中的一些概念,以及实现。一、概念Git 是一个分布式版本控制软件,在使用的过程中,与 CVS 类不同,不需要使用服务端,就可以实现版本控制。但在我们常用的使用过程中,依然会一个中间服务器作为 origi...
2023-02-17 09:30:13 1040 2
原创 深入理解 Java 字符编码
近期在工作中,遇到了一段历史代码,在代码中,将一个字符串进行加密,得到一个 byte 数组, 在代码中,这个 byte 数组 需要存储到 文件中,但代码却是用这个 byte 数组 创建了一个 String ,然后再将 String 写入到文件中。聪明的你应该发现问题了,byte 数组 直接转成 String 会有问题,一般的处理方法是将 byte 数组 使用 Base64 编码,然后将编码后的字符...
2022-10-13 08:30:29 330
原创 深入 Android 混淆实践:多模块打包爬坑之旅
在做 SDK 开发的时候,会将 SDK 中不同功能进行模块化拆分,分解成不同的模块,在对外提供 SDK 时,将多个 AAR 文件交付给使用方。来看一下这个场景,假设现在 SDK 有 A模块、B模块 两个模块,其中 B模块 依赖 A模块 。现在,对这两个模块进行打包,并且要开启混淆。发现了吗?要让 B模块 中的类,能正常使用 A模块 中的接口/类,我们需要将 A模块 中的接口/类进行 keep ...
2022-10-01 10:24:15 2000
原创 深入 Android 混淆实践:ProGuard 通关秘籍
使用 Java 编写的源代码在编译时会生成 CLASS 文件,而 CLASS 字节码的规则非常的标准,按照对应的格式能够很好的反编译出原代码。市面上也存在很多很好用的工具,来帮助我们进行反编译并阅读 CLASS 中的代码逻辑。为了更好的保护代码安全,混淆是最容易做的一件事情。针对 Java 的混淆,有一个开源项目 ProGuard 就是常用的混淆工具。它可以对代码进行 压缩、优化 、混淆。本文将基...
2022-09-23 08:30:21 2684
原创 那些年配置的终端 -- iTerm2 系列
工欲善其事,必先利其器。当我们拿到一台新电脑,为了让自己的效率更高,当然需要做一些配置。本文将介绍对于终端的一些配置。1. 安装 iTerm2Mac OS 有自己自带的终端软件 Terminal ,但其功能相对较弱。在 Mac 上,有一个三方终端 iTerm2 可以使用。当拿到新电脑时,当然是第一时间装上这个软件。iTerm2 下载地址:https://www.iterm2.com/对于 iTer...
2022-08-20 09:00:24 383
原创 LeetCode 46 全排列
给定一个不含重复数字的数组 `nums` ,返回其 *所有可能的全排列* 。你可以 **按任意顺序** 返回答案。
2022-07-23 18:25:03 184
原创 这么多年,Android 虚拟机到底干了些什么?
在 Android 操作系统中,有一个非常重要的核心部分:Android Runtime。说到这个,我相信很多人都听到过 Dalvik、ART、JIT 以及 AOT。或许好多人也和我之前一样,并不了解这些名词,以及这些名词背后做了些什么事情。本文从笔者了解到的信息,记录了 Android Runtime 中设计的一些概念,以及应用。1. 虚拟机在了解上面提到的名词之前,我...
2022-06-30 16:40:03 1858
原创 走进微软之所见所想
2020.11.24 号,是程序员节后的一个月,有幸参加了《新程序员》组织的“走进名企”的活动,参观了科技领域的巨头,微软北京总部。微软的业务版图从 PC 时代,操作系统的巨头,大名顶顶的微软,错过了移动互联网时代,没有拿到移动操作系统的门票,整个微软的发展一直走下坡路,并慢慢的淡出了消费者的视野,这或许是一个大公司发展到一定时间,都会遇到的瓶颈。但微软并没有被打倒,快速调整赛道,在多个领域内都占据了举足轻重的地位。到现在,很多人还是只知道他们的操作系统 Windows 以及办公套件 Office,
2021-11-27 15:44:38 1188
原创 实现一门超简单的语言最快需要多久
这是宫文学老师的第一节课程,本次课程的内容读完,并没有完全清楚我自己要做什么,该怎么做,经过阅读配套的原码,终于明白需要做一些什么事情,此处仅作为记录,梳理思路。以下为正文:0x00 代码...
2021-11-17 22:13:48 961
原创 实现一门超简单的编程语言最快需要多久?
这是宫文学老师的第一节课程,本次课程的内容读完,并没有完全清楚我自己要做什么,该怎么做,经过读配套的原码,终于明白需要做一些什么事情,此处仅作为记录,梳理思路。
2021-11-17 21:32:37 4122 1
翻译 程序员如何用代码彻底终结系统那些事儿?
互联网发展至今,瞬息万变的市场要求我们的产品具有更快的响应速度。技术的快速进步,软件的快速迭代升级,各种软件基础设施也不得不随之进行频繁的修改。为更好地适应各各式各样各样的需求,将基础设施、工具、服务以及对基础设施的管理作为一个软件系统,使用软件工程实践中的方式来处理各种基础设施的变化。本文作者在文中详细讲解了软件设施代码背后的思想,带领我们详细了解背后的原理。作者 | Tylor Borg...
2020-04-06 14:13:25 349
翻译 为什么许多程序员讨厌结对编程?
结对编程是国外非常盛行的一种敏捷开发方式,今天 Google 最顶级的两位程序员 Jeff Dean 和 Sanjay Ghemawat 就是结对编程世界让人颇为津津乐道的人物。不过,有人喜欢有人讨厌,本文作者 Tylor Borgeson 作为结对编程的实践者,为我们具体分析了它的好与坏,以及可以如何执行结对编程来更好地适合团队现状。作者 | Tylor Borgeson,已获作者翻译授权...
2020-04-06 14:07:27 465
翻译 程序员为什么千万不要瞎努力?
本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用容器化技术、CI/CD,不仅能让开发环境、测试环境、预发环境、生产环境保持一致,同时也对测试和质量保证有至关重要的作用。作者 | Tylor Borgeson,已获作者翻译授权译者 | 罗昭成原文 | A Tale of Two Soft...
2020-04-06 14:03:35 471
翻译 为什么程序员如此“嫌弃”主干开发模式?
软件开发中,多人协作是一个常见的场景,如何来协作管理不同开发人员开发的代码变成重中之重,因此 CVS 等版本管理工具也应运而生。现如今,Git 已经占据了版本管理的主导地位。基于版本控制出现了一系列的开发模式,用以帮助团队更加快速地协作。本文中,作者从他的实践,全面的展示了主干开发的模式在开发中应用的优势,希望能给你的工作带来更高的效率。作者 | Tylor Borgeson,已获作者翻译授...
2020-04-06 13:59:30 858
翻译 为什么持续集成和部署在开发中非常重要?
让重复的事情自动化。如果运用得当,CI/CD 将会是一个很好的工具,帮助团队提效。你要相信,肯定没有人愿意花几个小时时间,去“盯”部署脚本执行的结果,还要手动测试来确认系统是否能正常运行。作者 | Tylor Borgeson,已获作者翻译授权译者 | 罗昭成原文 | Here’s Why Continuous Integration and Deployment is so Impo...
2020-04-06 13:51:21 563
翻译 Kotlin 风险高、RxJava 已过时,Android 原生开发现状分析!
原文:The State of Native Android Development作者 | Vasiliy Zukanov,独立 Android 开发及软件顾问,已获作者翻译授权译者 | 罗昭成,Android 开发者,责编 | 唐小引本文首发 CSDN(ID:CSDNnews)许多 Android 开发者经常会问我,要学会哪些东西才能成为一个优秀的 Android 工程师?对于这个...
2020-04-06 13:39:28 599
翻译 被高估了的测试驱动开发?
测试驱动开发(TDD)始于上世纪 90 年代,时至今时今日,依然只有少数的开发者在践行着。本文作者从软件开发者的角度,又一次帮助我们定义了测试驱动开发,解答了众多开发着对 TDD 常见的谬误。
2020-03-01 20:59:02 423
原创 Python 分析 9 万条数据告诉你复仇者联盟谁才是绝对 C 位!
作者 | 罗昭成责编 | 唐小引本文首发于 CSDN 微信(ID:CSDNnews)《复联 4》国内上映第十天,程序员的江湖里开始流传这样一个故事,即:漫威宇宙,其实就讲了一件事情。整个宇宙就好比一个项目组。其中有一群叫作美国队长、钢铁侠、惊奇队长、浩克、索尔等人在维护这个项目,兢兢业业的维护整个项目。某一天,出现了一个天才程序员,叫灭霸。当他加入到这家公司的时候,他意识到,这个项...
2019-05-03 16:49:29 3502 12
翻译 “编程不规范,同事两行泪!”
本文首发 CSDN(ID:CSDNnews)编程江湖中一直盛传着一个段子,那就是要问程序员最讨厌哪 4 件事?那必须是:写注释、写文档、别人不写注释、别人不写文档。更甚者,在《流浪地球》形成刷屏之势之后,仿其而出的“代码千万行,注释第一行;编程不规范,同事两行泪”在技术圈中开始盛传,由此可见对于所有的程序员来说这是多么痛苦的事情。本文作者 —— 全栈开发者 Nitin Sharma 分享...
2019-02-21 10:53:14 255
原创 Python 分析程序员最关心的竟不是技术,而是…
本文首发于 CSDN 程序人生(ID:coder_life)从工业时代进入到信息服务时代,互联网行业逐渐兴起,传统行业逐渐没落。现如今,很多人混迹于互联网+的时代,人人都要学习编程已经逐渐被重视起来。作为一个入行五年的老鸟,回首看看这五年的经历,恍若隔世。从PC互联网时代到移动互联网时代的转变,也就是前几年的事情。IT界的快节奏已经成为常态。小步快跑 ,产品的快速的迭代,移动互联网有了飞...
2019-02-17 21:33:23 426
翻译 未来五年,iOS 开发如何前行?
本文首发在 CSDN 微信(ID:CSDNNews)。英文原文地址: https://hackernoon.com/four-exciting-areas-ios-app-development-will-evolve-over-the-next-five-years-23dc5c11f562近十年,10~15 年前不存在的技术,让这个世界变得黯然失色。有趣的是,这些概念正在构建未来的生活...
2019-02-17 21:19:27 438
翻译 为什么所有人都对 HTML、CSS 失望了?
本文首发在 CSDN 微信(ID:CSDNNews)。英文原文地址: https://rachelandrew.co.uk/archives/2019/01/30/html-css-and-our-vanishing-industry-entry-points/所有的人再一次对 CSS 失望。我不打算去总结这些让人失望的点。事实上,CSS 太容易被覆盖修改,如果要让它实时生效,你需要将它用...
2019-02-17 21:13:57 305
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人