程序员进阶系列:年少不懂爱家家,懂了已是猿中人。

为大家整理一波程序员才懂的扎心图片!看不懂别说自己是程序员! 程序员真的是世界上一种独特的生物男人、女人、程序员 今天为大家整理了一波程序员才懂的扎心图片! 工作前vs工作后 自己眼中vs别人眼中 期望vs现实 有人问过,“HTML CSS 和 JavaScript有什么区别” Java VS C++ 功能上 开发人员作为一个团队进行编程 调试CSS 开发人员重构代码 当尝试进入BIOS 程序员... 阅读详情

正式分享之前,先回忆一下作者年少时的一次真实的面试囧途。

经验老道的面试官:

    先问个简单的问题,i++ 与 ++i 有啥区别?

年少懵懂的攻城狮:

    i++ 先把操作数加 1,然后把操作数放入表达式中运算;

    ++i 先把操作数放入表达式运算,然后把操作数加 1。

经验老道的面试官:

    略微点点头,虽然面带微笑,不过感觉不太满意的样子... ...

时隔多年,回想起那个面试场景,忍不住要感叹:年少不懂i++(爱家家),如今懂了却已是老码农(双鬓白)。

相信大部分人都会这么教科书式的回答,但是能否从字节码角度再深入一点点呢?

1

 准备:拿到字节码指令集文件  

首先具备 Java 环境(能打开此文章,说明你肯定具备此环境)。

java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)

能开发代码的工具(不强求IntelliJ IDEA),然后写出如下图 IPlus.java 就可以。

public class IPlus {
    public static void main(String[] args) {
        int i = 0;
        i = i++;
        System.out.println(i);
    }
}

编译 IPlus.java 源文件,生成对应的字节码文件。

接下来对 IPlus.class 文件进行反编译,当然推荐可以使用工具 ClassPy、JavaClassViewer、jclasslib 查看 class 文件结构,本次就用 jdk 自带的命令 javap 来查看 class 文件的结构,并把字节码指令集重定向输出到文件 iplus_javap.txt 中。

javap -v IPlus.class >> iplus_javap.txt

javap 是 Java class 文件分解器,可以反编译,也可以查看 java 编译器生成的字节码,用于分解 class 文件,可以解析出当前类对应的 code 区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。

Classfile /Users/yiyuanxiaojiangV5/IdeaProjects/IPlus.class
  Last modified 2020-8-27; size 516 bytes
  MD5 checksum a5279417c4e7cce8408ce9bb53c44205
  Compiled from "IPlus.java"
public class IPlus
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#21         // java/lang/Object."<init>":()V
   #2 = Fieldref           #22.#23        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = Methodref          #24.#25        // java/io/PrintStream.println:(I)V
   #4 = Class              #26            // IPlus
   #5 = Class              #27            // java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               LocalVariableTable
  #11 = Utf8               this
  #12 = Utf8               LIPlus;
  #13 = Utf8               main
  #14 = Utf8               ([Ljava/lang/String;)V
  #15 = Utf8               args
  #16 = Utf8               [Ljava/lang/String;
  #17 = Utf8               i
  #18 = Utf8               I
  #19 = Utf8               SourceFile
  #20 = Utf8               IPlus.java
  #21 = NameAndType        #6:#7          // "<init>":()V
  #22 = Class              #28            // java/lang/System
  #23 = NameAndType        #29:#30        // out:Ljava/io/PrintStream;
  #24 = Class              #31            // java/io/PrintStream
  #25 = NameAndType        #32:#33        // println:(I)V
  #26 = Utf8               IPlus
  #27 = Utf8               java/lang/Object
  #28 = Utf8               java/lang/System
  #29 = Utf8               out
  #30 = Utf8               Ljava/io/PrintStream;
  #31 = Utf8               java/io/PrintStream
  #32 = Utf8               println
  #33 = Utf8               (I)V
{
  public IPlus();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LIPlus;


  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: iconst_0
         1: istore_1
         2: iload_1
         3: iinc          1, 1
         6: istore_1
         7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        10: iload_1
        11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        14: return
      LineNumberTable:
        line 3: 0
        line 4: 2
        line 5: 7
        line 6: 14
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      15     0  args   [Ljava/lang/String;
            2      13     1     i   I
}
SourceFile: "IPlus.java"

接下来跟随小猿的脚步,一起去分析字节码指令集文件 iplus_javap.txt,尝试彻底搞懂 i++。

2

 解剖:字节码全局了解 

一:Classfile 文件信息

Classfile /Users/yiyuanxiaojiangV5/IdeaProjects/IPlus.class //class文件的路径
  Last modified 2020-8-27; size 516 bytes //最后一次修改时间以及该class文件的大小
  MD5 checksum a5279417c4e7cce8408ce9bb53c44205 //该类的MD5值
  Compiled from "IPlus.java" //编译自源文件

这块感觉不用详细解释,仔细去看,应该都能懂。

第 1 行:class 文件的路径
第 2 行:最后一次修改时间;该 class 文件的大小。
第 3 行:MD5 checksum 值,例如下载文件的场景下会用于检查文件完整性,检测文件是否被恶意篡改。
第 4 行:编译自 IPlus.java 源文件。

二:类主体部分定义信息

public class IPlus //类名
  minor version: 0 //次版本号
  major version: 52 //主版本号,52 对应 JDK 1.8
  flags: ACC_PUBLIC, ACC_SUPER //该类的权限修饰符(访问标志)

重点关注第 2、3 两行,为什么要重点关注呢?业务开发中估计多数都遇到过 Unsupported major.minor version 的错误。其实就是通过高版本的 JDK 进行编译(例如 JDK 1.8),然后跑在低版本的 JDK 上(JDK 1.5),就会报版本不支持。

为了使用方便,特意整理一 JDK 各版本图,请拿走不谢。

三:常量池信息

Constant pool: // 常量池,#数字相当于是常量池里的一个索引
   #1 = Methodref          #5.#21         // java/lang/Object."<init>":()V // 方法引用
   #2 = Fieldref           #22.#23        // java/lang/System.out:Ljava/io/PrintStream; // 属性引用
   #3 = Methodref          #24.#25        // java/io/PrintStream.println:(I)V
   #4 = Class              #26            // IPlus // 类引用
   #5 = Class              #27            // java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               LocalVariableTable
  #11 = Utf8               this
  #12 = Utf8               LIPlus;
  #13 = Utf8               main
  #14 = Utf8               ([Ljava/lang/String;)V
  #15 = Utf8               args
  #16 = Utf8               [Ljava/lang/String;
  #17 = Utf8               i
  #18 = Utf8               I
  #19 = Utf8               SourceFile
  #20 = Utf8               IPlus.java
  #21 = NameAndType        #6:#7          // "<init>":()V //返回值
  #22 = Class              #28            // java/lang/System
  #23 = NameAndType        #29:#30        // out:Ljava/io/PrintStream;
  #24 = Class              #31            // java/io/PrintStream
  #25 = NameAndType        #32:#33        // println:(I)V
  #26 = Utf8               IPlus
  #27 = Utf8               java/lang/Object
  #28 = Utf8               java/lang/System
  #29 = Utf8               out
  #30 = Utf8               Ljava/io/PrintStream;
  #31 = Utf8               java/io/PrintStream
  #32 = Utf8               println
  #33 = Utf8               (I)V

#数字相当于是常量池里的一个索引,例如上面代码段里 #1 代表的是一个方法引用,并且该引用由 #5.#21 构成。

在 JVM 规范中定义了很多常量类型,汇总本次的遇到的几个。

四:构造方法信息

public IPlus();
    descriptor: ()V //方法描述符,这里的V表示void
    flags: ACC_PUBLIC //权限修饰符
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0 // aload_0 把this装载到了操作数栈中
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LIPlus;

descriptor:方法入参和返回描述;

flags:访问权限控制符为 public;

stack:方法对应栈帧中的操作数栈的深度为 1;

locals:本地变量数量为 1;

args_size:参数数量为 1;

aload:从局部变量表的相应位置装载一个对象引用到操作数栈的栈顶;

invokespecial:调用一个初始化方法;

LineNumberTable、LocalVariableTable:前者代表行号表,是为调试器提供源码行号与字节码的映射关系;后者代码本地变量表,存放方法的局部变量信息,属于调试信息。

思考一:通过这段字节码信息,印证了一个准则:在没有显示声明构造的情形下,Java 会默认提供无参构造方法。

思考二:虽然是无参构造器,为什么 args_size 的值是 1 呢?是因为无参构造器和非静态方法调用会默认传入 this 变量参数,其中 aload_0 即表示的 this。

五:main 方法的信息

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: iconst_0
         1: istore_1
         2: iload_1
         3: iinc          1, 1
         6: istore_1
         7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        10: iload_1
        11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        14: return
      LineNumberTable:
        line 3: 0
        line 4: 2
        line 5: 7
        line 6: 14
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      15     0  args   [Ljava/lang/String;
            2      13     1     i   I

通过 descriptor 、flags 能直观的能够读懂 main 方法的入参,返回值以及访问修饰符;通过 LocalVariableTable 运行时候的局部变量表,能够看到 main 函数的 args 参数保存在了 LocalVariableTable 中。

3

 解剖:字节码指令看看 i++ 的执行 

为了便于理解,把本次用的字节码指令先列一下,大家结合着去读。

重点关注 main 方法中的如下指令(红色圈住部分)

结合字节码指令列表,把上面红色圈住部分解读一下,主要分两部分。

//第一步:int i = 0;
0: iconst_0 // 将常量 0 推送至栈顶。
1: istore_1 // 将栈顶的值保存到局部变量 1 中,i = 0。


//第二步:i = i++;
2: iload_1 // 从局部变量 1 中装载 int 类型值入栈,此时栈顶的值为 0。
3: iinc    1, 1 // 将第 1 个局部变量进行加 1 操作,此时局部变量 i = 1。
6: istore_1 // 取出栈顶元素 0 保存到局部变量 1 中,此时的值为 0。

为了更清晰,不妨贴一个字节码里的指令与源代码的一个对应关系图。

懂了 i++ 的执行原理,再去看 ++i 的执行原理,就很容易了,本次不带着刻意去分析,放一张图你就懂了(左侧是 i++ 的指令,右侧是 ++i 的指令)。

简单做个总结:i++ 会在本地局部变量中对数字做相加,但是并没有将值推至栈,那么再次从栈中便会拿到相加前的数值,保存到本地变量中;而 ++i 也会将本地局部变量中的数字做相加,但是将数据做了入栈操作,那么再次从栈中便会拿到相加后的数值,再次压入到本地变量中。

4

 寄语写最后 

本次,主要让大家从字节码角度看看 i++、++i 的执行原理,希望通过本次分享,大家对 Java 字节码不再恐惧,并且希望能够学以致用,尝试分析更多场景,从骨子里理解所以然。

好了,本次就谈到这里,一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!

推荐阅读:

程序员进阶系列:你真的懂 HelloWorld 吗?

Java线程池深度揭秘

彻底搞懂 Java 线程池,干啥都不再发憷

Java程序跑的快,全要靠线程带

fastjson的这些坑,你误入了没?

真实|技术人员该如何站好最后一班岗?

Java 8 的这些特性,你知道吗?

改掉这些坏习惯,还怕写不出健壮的代码?(一)

改掉这些坏习惯,还怕写不出优雅的代码?(二)

改掉这些坏习惯,还怕写不出优雅的代码?(三)

改掉这些坏习惯,还怕写不出健壮的代码?(四)

改掉这些坏习惯,还怕写不出精简的代码?(五)

改掉这些坏习惯,还怕写不出精简的代码?(六)

当算力遇上520,AI不仅懂你,还能爱你 每年一到5月20日,朋友圈、微博、小红书就像被恋爱病毒入侵了一样,满屏都是“我爱你”“官宣”“求婚”“撒狗粮”……单身狗被虐得体无完肤,恋爱狗又忙着P图发红包。但今年的520,注定不一样。你有没有发现一个神奇的现象——越来越多的“表白”不再是人对人,而是“人对AI”的倾诉。比如:有人用ChatGPT写了一封完美的情书;有人用AI生成女友的虚拟形象,陪他过节;还有程序员直接送女朋友一张“H100”的显卡,说“这就是我爱的算力”。听起来离谱?但这,正是“AI+情感经济”全面渗透我们生活的开始。今年的520,已经 阅读详情

相关推荐

最新Mamba环境配置教程:从CUDA到causal-conv1d的完整安装流程

本文提供最新Mamba环境配置教程,涵盖从CUDA到causal-conv1d的完整安装流程。针对深度学习领域的长序列处理需求,详细指导如何正确配置CUDA工具链、安装PyTorch及关键依赖causal-conv1d,解决常见报错问题,并验证mamba-ssm集成效果。

bush的博客 417

【转帖】每一个不懂爱的人都会遇到一个懂爱的人,然后经历一场撕心裂肺的爱情。不懂爱的人慢慢懂了。懂爱的人,却不敢再爱了。。。

每一个不懂爱的人都会遇到一个懂爱的人,然后经历一场撕心裂肺的爱情。不懂爱的人慢慢懂了。懂爱的人,却不敢再爱了。。。每一个不懂爱的人都会遇到一个懂爱的人 这个懂爱的人会让那个不懂爱的改变 让他长大 让他懂得爱 珍惜爱 明白爱的含义 但当那个不懂爱的人学会了 懂得了的时候 那个教会他懂爱的人 已被他伤的遍体鳞伤 经过了撕心裂肺的爱情 当那个人懂得珍惜之后 那个遍体鳞伤的人已没力去再爱了 我们要学会珍惜

lxmky的专栏 2195

HFSS 3D Layout一键导入PCB,高效搞定微带线损耗仿真

在高速PCB设计中,信号完整性与电磁仿真是确保链路质量的关键环节。传统的HFSS手动建模流程繁琐且极易出错,尤其面对微带线、带状线等高频结构时,叠层参数、铜箔粗糙度等细节难以精准还原,导致仿真结果与实测偏差较大。HFSS 3D Layout模块提供了从EDA工具直接导入PCB文件的能力,完整保留走线、过孔、叠层及材料属性,结合精确的介质损耗模型与端口设置,大幅缩短建模时间并提升仿真精度。该技术广泛应用于DDR、SerDes等高速数字链路的设计验证,以及SI/PI工程师对PCB损耗性能的快速评估。本文从导入操

weixin_29191081的博客 254

羊了个羊火爆,猿了个猿怎么样呢?

最近微信「羊了个羊」小游戏火爆全网,据说狂赚几千万。那么作为程序猿的我们,能不能做个猿了个猿(程序猿了个程序猿)呢?当然可以

江拥羡橙的博客 7万+

SAP BTP开发入门:从PaaS到CAP/UI5的30天学习路线

在云计算与数字化转型的大背景下,企业系统集成与云端扩展需求激增,传统的单点开发模式正面临深刻变革。PaaS(平台即服务)作为云原生的核心概念,将基础设施、开发环境与应用服务统一封装,为企业提供了灵活的扩展能力。SAP BTP正是SAP生态中的PaaS平台,它承载着系统集成、低代码开发、AI服务与数据管理,成为连接S/4HANA等核心业务系统与创新应用的桥梁。对于ABAP开发者而言,掌握BTP不仅是技能升级,更是应对从传统部署向云端订阅模式转型的必由之路。本文从平台基础出发,梳理BTP的核心服务与开发模型(如

weixin_31766003的博客 283

CH582低功耗实战:从1.2mA降到5uA,我的蓝牙广播功耗优化笔记

本文详细记录了沁恒CH582蓝牙芯片从1.2mA降至5μA的功耗优化全过程。通过建立基准测试环境、分层排查软件配置与IO状态、精细调优射频参数以及硬件层面的电源管理,实现了极致的低功耗表现。文章还提供了实用的功耗测量方法和典型问题排查指南,为蓝牙设备开发者提供了宝贵的参考经验。

weixin_30368405的博客 572

大妈招女婿,专找程序员:程序员的好,别人不懂阿姨懂!

关于找对象一事,有的人喜欢找程序员对象,觉得程序员踏实,本分,勤劳还聪明,薪水也高,而有的则不看好程序员,认为程序员呆板,没有情调,生活会不幸福,特别在一些老一辈的眼里,对程序员这个行业不了解,不太看好程序员这个职业,记得,之前曾经有一名程序员发帖吐糟称,自己的丈母娘认为他的职业不是一个正当行业,让他很是无奈,也引来好多网友的同情,不过近期一名网友则曝料了一个比较喜剧化的事情,与这个例子恰好相反!...

sssdhua的博客 2396

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

程序员兼职网站大全

在网上收集整理了一些程序员兼职网站,国内外都有,方便大家查阅使用。 一、国内垂直众包平台 1、猿急送-程序员兼职平台:https://www.yuanjisong.com/ 猿急送是于15年成立,国内起步很早的垂直众包平台,目前提供的兼职职位还是比较多的,而且有竞标类职位是可以直接访问直接投递的,可以很方便小猿们进行报名匹配。 2、外包大师:http://www.waibaodashi.com/ PMCAFF旗下(PMCAFF是比较知名的产品经理社区)的一个众包开发平台,17年成立..

朽木自雕i的博客 2万+

手把手教你用Qwen-7B打造医疗大模型:从数据准备到RLHF全流程实战

本文是一篇基于Qwen-7B-Chat模型构建医疗领域大模型的实战全流程指南。文章详细拆解了从数据准备、环境搭建,到增量预训练、监督微调(SFT)以及偏好对齐(DPO)的核心技术步骤,并分享了部署与持续优化的实践经验。通过LoRA等高效微调技术,帮助开发者掌握将通用大模型改造为专业领域专家的完整方法论。

weixin_29191761的博客 129

合肥工业大学操作系统实验9

依据操作系统课程所介绍的页面置换算法与动态内存分配的原理,本实验的目的是掌握OPT、FIFO、LRU、LFU、Clock等页面置换算法;掌握可用空间表及分配方法;掌握边界标识法以及伙伴系统的内存分配方法和回收方法。从而深入理解操作系统的内存管理。从而加深对教材上页面置换算法与动态内存分配的理解。

Martin-share的博客 1094

懂算法的程序员与不懂算法的程序员

懂算法的程序员 ↓↓↓ 不懂算法的程序员 ↓↓↓ 看完此文,你有什么想法或观点呢?欢迎在留言区留言评论。

程序员之家 2889

电机瞬态分析基础(2):理想电机的基本假设和正方向规定

电机瞬态分析基础之理想电机假设条件和正方向规定

weixin_45670943的博客 1145

年少不懂宋公明,读懂已是中年人

懂得从他人利益的角度出发,我们才能调动更多的人和资源,成就一番事业。年轻的时候,以为聚义厅聚的是义,中年以后才看明白,聚义厅聚的是利。年轻的时候,世界是黑白的,凡事都要分出个是非对错,剖个明明白白。凡事多看一步,多考虑一点,做好属于自己的规划,做到心里有谱。人生半坡才明白,这辈子要想做出点成就,还是要拼格局。来源:年少不懂宋公明,读懂已是中年人。及时雨宋江及时的不是雨,而是银子。与王伦、曹盖相比,宋江能容天下人。年纪大了才发现,很多事情是灰白的。无胸怀不立人,无格局不成事。利益是纽带,是动力。

冯真海的博客 534

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

成语新编:开猿节流、破竞难猿、花好约猿、一切随猿才好

花猿巧语……

cxyITgc的博客 1643

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

@人生最痛苦事是,在不懂爱的年龄,选择了婚姻,而在懂爱的年龄,遇到了不能在一起的人。

人生最痛苦事是,在不懂爱的年龄,选择了婚姻,而在懂爱的年龄,遇到了不能在一起的人。杯中倒满无情酒,心中再无意中人,看尽人生红尘梦,尝尽人间疾苦情,喝着最烈的酒,忘最难忘的情。 ...

bjhjwy的博客 1988

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

无猿无故!程序员成语大全

(给程序员的那些事加星标)综合整理:程序员的那些事(id:iProgrammer)之前我们在微博和微信发了一张程序员成语图,不少读者陆陆续续补充了一些,抽空整理汇总。补充...

程序员的那些事 2272

假如我年少有为不自卑

假如我年少有为不自卑懂得什么是珍贵那些美梦没给你我一生有愧 仓央嘉措说:人们生来就伴随着一颗残缺的心。需要有另一半来填补,这是生活的真谛。生活中我们始终伴随着遗憾,对于当下的年轻人们最渴望的就是可以年轻有为,但是现实的残酷让我们感到绝望和痛苦,不知日出在何处!一首《年少有为》在爱情方面深刻诠释了这样的矛盾与遗憾。 情歌之所以动人,其原因就是太过伤人。我想并不是只因为那些作曲有多么的精湛,也不...

weixin_30872867的博客 640

程序员进阶系列:你真的懂 HelloWorld 吗?

作为入了门的 Java 程序员,相信在脑海中都能够秒写出 HelloWorld.java,都知道编译成 HelloWorld.class,然后就可以跨平台执行了。常言道:知人知面不知心。...

一猿小讲 5322

趣图 | 懂算法的程序员,不懂的程序员

懂算法的程序员 ↓↓↓ 不懂算法的程序员 ↓↓↓ 看完此文,你有什么想法或观点呢?欢迎在留言区留言评论。 更多精彩 “ 程序员提升外观丨王小波程序员丨我会编程丨七夕表白丨程序员最高殊荣丨程序猿(媛)CP丨祭天丨Python歌词丨特斯拉丨程序媛丨直播丨鄙视链丨敲代码丨404丨结婚丨Facebook丨怎么进BAT丨女友日记丨

程序人生的博客 589

网友:程序员不懂人情世故,问路不带称谓!程序员:这锅我们不背

程序员被黑在圈内也算是常见的事情,各种各样带节奏的段子层出不穷,作为一名程序员也已经习以为常了,并且对此好多程序员也没有表现出抵触的意思,从而就助长了这种现象,近期有一名程序员网友分享了一段他和同事之间的一个小故事,让我们来一起看看吧。 这名程序员是一名java开发工程师,他和他一个同事(没有具体说,可能非技术的其他部门同事)一起去吃饭,突然有位穿着貌似挺商务的男士朝他们问了一句:“某某路是朝这...

sssdhua的博客 783

少年不懂孔乙己,读懂已是书中人

进一步的标准是:你有和公司类似的价值观,公司有适合你性格的职位,做的是你感兴趣的事情等等。你找到这样公司的话,可以在面试时表现出强烈的应聘渴望,哪怕你并不具备什么特别技能或优势,没准也会有一些意外之喜——因为不少小公司通常愿意接纳意愿意强烈但目前还普普通通的人,这样的候选人可塑性强、忠诚度高,有一定比例会成为几年后公司的骨干。具体而言,一些雇主或HR会将学历作为最重要、最直接也是最简单的招聘要素之一,因此在同种岗位需求之下,具有更高学历背景的人员往往更有机会被其选定,进入该岗位。没考上的,是大多数。

Auspicious航的博客 837

程序员段子,看不懂不是真的猿

程序员的段子数不清,但你能不能看懂就说不定啦!不信你来试试能坚持到第几题第 1 题程序员A向程序员B抱怨:“干IT太苦了,数据是越存越多,预算是越来越少,好基友是越来越多,女朋友是越来越...

yeluoxiang的专栏 694

程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂——给自己的话

程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。

happyfish319的博客 289

程序员的工作不止 “技术”,还要懂 “业务”?真相太现实​​​

比如,业务人员说 “这个功能要实现用户的分级管理,不同等级的用户享受不同的权益”,不懂业务的程序员可能会只关注如何实现分级的技术逻辑,而忽略了不同等级用户权益的具体内容和业务规则,导致开发出来的功能与实际需求不符,需要反复修改,严重影响项目进度。因此,作为一名程序员,我们必须认识到业务能力的重要性,主动学习业务知识,深入参与业务实践,培养业务思维,关注行业动态,不断提升自己的业务素养。在企业看来,懂业务的程序员能够更好地理解企业的战略目标和业务需求,能够将技术与业务紧密结合,为企业带来实际的效益。

2503_92604243的博客 587

漫谈程序员系列:千奇百怪的程序员

这样的程序员,你见过吗?

安晓辉生涯——聚焦程序员的职业规划与成长 2万+
上一篇: 程序员进阶系列:你真的懂 HelloWorld 吗?
下一篇: 程序员进阶系列:多图教你掌握JVM
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值