新入职百度某员工发飙:前人代码写得像一坨屎,不能忍受,颠覆了对大厂的认知,...

程序员吐槽前人代码现象探讨
本文围绕程序员对前人代码的看法展开。提到职场论坛上刚入职百度一周的新员工抱怨前人代码烂,网友评论也多有共鸣。还分析了这种现象,有人认为代码垃圾不易被裁等,最后呼吁程序员不必相互指责,还介绍了知识星球及获取进阶资源的方式。

文导读|   点击标题阅读

互联网寒冬下,程序员如何突围提升自己?

Android进阶之仿抖音的音乐旋转效果

裸辞两个月,海投一个月,从 Android 转战 Web 前端的求职之路

今天在浏览某职场论坛时,发现了如下的帖子。这个帖子一下子吸引了我的眼球。

这名刚入职百度才一周的新员工发帖抱怨说:看前人代码不忍直视,那代码写的跟一坨屎一样。完全颠覆了他之前的认知和对所谓大厂的憧憬。

640?wx_fmt=jpeg

大家是不是觉得说出了大家的心声,是不是你也觉得前人的代码想一坨屎?是不是也有似曾相似的感觉?

卧槽,这是谁写的代码?真烂”,曾经,当你看别人代码的时候,是不是心底不由自主的发出这一句。

看帖子下面的评论就知道了,很多网友发出了这样的感叹,表示彼此彼此。作为程序员的我们都会有这种感受:确实,有很多屎一样的老项目,但等你去其他厂,你可能会发现这坨屎居然有点香。

还有网友评论说等你准备重构这代码的时候,你会发现这屎冲了厕所就塌了;新人总觉得别人是屎;当你离职时回顾自己的遗产,发现也是一坨屎;果然大家都是一样的,没人交接的项目满满的就变成屎山了。

是不是评论的也很有道理。

640?wx_fmt=jpeg

看评论就知道了,网友观点一边到,不过,有些网友也很冷静。自己虽然也会觉得前人的代码写的烂,但当自己离职了,后来接手者也会有同样的感受。


比如另外一些网友的评论:新人都觉得别人代码烂,自己写连屎都不如;取其精华,去其糟粕就好啦;大厂就像围城,里面的不想出来,外面的人进不去;过一年看你自己的代码,也是屎一样;程序员都是这样,看谁的代码都要喷,连自己以前写的也不放过;软件开发不是永远能先理想的设计,很多是历史迭代再迭代的原因,不过新人嘛,到哪都自己最牛,别人都是屎,正常;

不过,还有人给这种现象找出了另一种解释:代码越垃圾越不容易被裁;前人晋升后留下的,后人做好了也没产出,就这么传下去了。当然,对于这种解释,我是不认同的,你们觉得呢?

640?wx_fmt=jpeg

所以,最后我想说一句:前人复又前人,“冤冤相报何时了”,程序员996已经够惨了,何必相煎太急呢?


大家如何觉得呢?请说说你们的看法更多学习和讨论,欢迎加入我们的知识星球,这里有1000+小伙伴,让你的学习不寂寞~·

看完本文有收获?请转发分享给更多人


我们的知识星球第三期开期了,已达到1100人了,能连续做三期已很不容易了,有很多老用户续期,目前续期率达到50%,说明了大家对我们的知识星球还是很认可的,欢迎大家加入尽早我们的知识星球,更多星球信息参见:

欢迎加入Java和Android架构社群

如何进阶成为Java的Android版和架构师?

说两件事

640?wx_fmt=jpeg

微信扫描或者点击上方二维码领取的Android \ Python的\ AI \的Java等高级进阶资源

更多学习资料点击下面的“阅读原文 ”获取

640?wx_fmt=gif

谢谢老板,点个好看↓

<think>我们正在解决一个分布式训练中的问题,具体是在训练DEIM模型时遇到ValueError:Defaultprocessgrouphasnotbeeninitialized的错误。这个错误通常发生在使用PyTorch进行分布式训练时,尝试使用分布式通信函数(如all_reduce)之前没有初始化进程组。解决这个问题的关键是在训练脚本中正确初始化进程组。根据PyTorch的分布式训练文档,我们通常使用`torch.distributed.init_process_group`函数来初始化进程组。步骤:1.在训练脚本的开始时,确保调用`init_process_group`函数。2.这个函数需要指定后端(如nccl、gloo)、初始化方法(如env://)以及进程组相关的参数(如world_size和rank)。通常,我们使用环境变量来传递rank和world_size等信息,这些环境变量由启动器(如torch.distributed.launch)设置。示例代码:在训练脚本中,我们可以这样初始化:```pythonimporttorch.distributedasdistdist.init_process_group(backend='nccl',init_method='env://')```但是,请注意,这个调用应该在所有进程中进行,并且通常是在设置了环境变量之后。另一种做法是使用`torch.nn.parallel.DistributedDataParallel`,它内部会检查进程组是否已经初始化,如果没有,它会尝试初始化。但是,有时候我们可能需要显式初始化。所以,解决方案是:确保在训练代码中正确初始化了进程组。具体步骤:a)在代码开始执行时(特别是在创建模型之前)调用`init_process_group`。b)设置本地进程的rank,通常通过环境变量获取,如`local_rank=int(os.environ['LOCAL_RANK'])`。例如,使用`torch.distributed.launch`启动训练时,它会设置环境变量RANK、WORLD_SIZE、LOCAL_RANK等。代码示例:```pythonimporttorchimporttorch.distributedasdistimportosdefsetup(backend='nccl'):dist.init_process_group(backend,init_method='env://')torch.cuda.set_device(int(os.environ['LOCAL_RANK']))setup()```注意:如果在调用`init_process_group`之前使用任何与分布式通信相关的函数,都会导致上述错误。因此,请检查训练代码,确保在调用任何分布式通信函数之前已经初始化了进程组。如果使用了`DistributedDataParallel`包装模型,则需要在包装之前初始化进程组。如果错误仍然存在,需要检查代码的流程,确保没有在初始化之前进行通信操作。另外,请确保启动训练的方式正确。例如,使用以下命令启动多进程训练:```bashpython-mtorch.distributed.launch--nproc_per_node=4train.py```或者版本的PyTorch推荐使用:```bashtorchrun--nproc_per_node=4train.py```综上所述,解决方案是正确初始化进程组,并确保启动命令正确。如果需要,可以在训练脚本中加初始化进程组的代码,并确保获取到正确的环境变量。注意:在初始化进程组之后,通常需要设置当前设备为`local_rank`对应的GPU,以避免多个进程使用同一块GPU导致冲突。现在,我们可以生成几个相关问题:§§相关问题§§1.如何设置PyTorch分布式训练环境?2.PyTorch分布式训练中有哪些常用的通信后端?3.除了使用`torch.distributed.launch`,还有哪些启动分布式训练的方式?4.在多节点分布式训练中,如何正确初始化进程组?5.在分布式训练中如何处理不同的数据类型(如CPU和GPU)?</think> ### 解决分布式训练中的 `ValueError: Default process group has not been initialized` 这个错误发生在分布式训练环境未正确初始化时,PyTorch 的 `torch.distributed` 模块要求在使用分布式通信功能前显式初始化进程组。以下是完整解决方案: #### 1. **初始化进程组的核心代码** 在训练脚本开头添加(以单机多卡为例): ```python import torch.distributed as dist def init_distributed(): dist.init_process_group( backend='nccl', # GPU 推荐 nccl,CPU 用 gloo init_method='env://', # 通过环境变量初始化 rank=int(os.environ['RANK']), world_size=int(os.environ['WORLD_SIZE']) ) torch.cuda.set_device(int(os.environ['LOCAL_RANK'])) if __name__ == "__main__": # 必须在训练开始前调用 init_distributed() ``` #### 2. **启动脚本的正确方式** 使用 PyTorch 的启动工具设置环境变量: ```bash python -m torch.distributed.launch \ --nproc_per_node=4 \ # 每台机器 GPU 数 --nnodes=1 \ # 机器数 --node_rank=0 \ your_train_script.py ``` #### 3. **关键注意事项** 1. **调用顺序** - 必须在 `DistributedDataParallel` 封装模型前初始化 - 必须在创建 DataLoader 前调用 `dist.barrier()` ``` model = DistributedDataParallel(model) # 在初始化后执行 ``` 2. **设备设置** ```python # 确保每个进程使用独立 GPU device = torch.device(f"cuda:{local_rank}") model.to(device) ``` 3. **数据分片** ```python train_sampler = DistributedSampler(dataset) dataloader = DataLoader(dataset, sampler=train_sampler) ``` #### 4. **完整工作流示例** ```python import os import torch import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel from torch.utils.data.distributed import DistributedSampler def main(): # 1. 初始化进程组 dist.init_process_group(backend='nccl', init_method='env://') local_rank = int(os.environ['LOCAL_RANK']) torch.cuda.set_device(local_rank) # 2. 构建模型 model = YourModel().cuda() model = DistributedDataParallel(model, device_ids=[local_rank]) # 3. 准备分布式数据加载 train_sampler = DistributedSampler(dataset) dataloader = DataLoader(dataset, sampler=train_sampler) # 4. 训练循环 for epoch in range(epochs): train_sampler.set_epoch(epoch) # 每个epoch重排数据 for batch in dataloader: ... loss.backward() optimizer.step() if __name__ == "__main__": main() ``` #### 5. **故障排查** - ✅ 检查环境变量:确保 `RANK`, `WORLD_SIZE`, `LOCAL_RANK` 被正确设置 - ✅ 验证 NCCL 安装:运行 `torch.cuda.nccl.version()` 确认 NCCL 可用 - ✅ 禁用 AMP:排除混合精度训练的影响 - ✅ 最小化测试:用官方分布式[示例](https://pytorch.org/tutorials/intermediate/ddp_tutorial.html)验证环境 > **根本原因**:DEIM 训练中涉及梯度同步操作时(如 `DistributedDataParallel`),PyTorch 需要预先建立进程间的通信组。若未初始化就调用同步操作(如梯度 all-reduce),会触发此错误。[^1][^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值