I think as a software engineer by far the best you can do for the environment is working with compiled languages. That's languages that use pre-compiled code like C, C++, Go or Rust, or languages that are compiled to bytecode and the JIT'd to machine code like Java, or languages that are directly JIT'd like many JavaScript implementations similar to NodeJS/V8 do or like LuaJIT does (although there are implementation of JavaScript and Lua that are not JIT'd).
If you find C, C++, Go, Rust, Java, NodeJS or LuaJIT isn't good for some use, such as due to lack of libraries, you can implement the missing library and share it on Github.
The reason this is important is that interpreted languages are 30 times slower than compiled languages. This matters due to two reasons. Firstly, computers that run programs made in interpreted languages use 30x more dynamic energy (although there's always a small constant idle energy use) and secondly, if many computer programs are inoptimally implemented in interpreted languages, this means more powerful computers need to be purchased more often, and more of these computers are needed. Electronics manufacturing creates a surprisingly large amount of CO2, especially if it's happening in China like it's nowadays.
If you are really ambitious and willing to become a guru, perhaps you could start working on LuaJIT. The sole author, Mike Pall, has abandoned the project and nobody has stepped in to become the new maintainer. However, I have to warn that becoming the new LuaJIT maintainer is not for amateur developers, it requires so much expertise that for example I would be unfit for the job.