我第一份工作是小公司,那又怎样?

一位程序员分享他在小公司的两年工作经验,从环境安装到开发代码、文档撰写,全程参与项目,快速提升技能,最终跳槽至大型外企。这段经历不仅锻炼了他的技术能力,还提升了沟通技巧。

作者 | 四猿外

本文经授权转载自四猿外(ID:si-yuanwai)

经常有刚毕业的新人问我,程序员的第一份工作该怎么选,应该去大公司,还是小公司?

年轻人真纠结,肯定是选给钱多的那个啊。

 好,不开玩笑了。大部分毕业生初次找工作,多个 offer 的薪资差别不大的情况下,选择公司确实比较纠结,大公司福利好、制度完善,小公司简单高效、锻炼人。

作为一个过来人,今天这篇文章说说我的第一份工作经历。

我的第一份工作是一个非常非常小的软件公司,呆了 2 年。

把时间调回 18 年前,2001 年,我升入大四,面临着大学毕业找工作。我大学学的机械专业,在浑浑噩噩的学了三年机械之后,我终于明白一个事情:机械专业和我八字不合,怪不得三年考试挂科那么多。 

大四第一学期,在几个同学的撺掇下,我参加了半年的 Java 培训。靠着那半年的培训,对 Java、Oracle 懂了一点皮毛。转眼到了 2002 年大四毕业找工作,我掂量了掂量自己的半斤八两,都没敢给大公司投简历。

最终在北京找了一份软件开发的工作,公司很小,一共 6、7 个人,算上我一共 3 个程序员,另外两个程序员大哥 3、4 年的经验。办公室 20 多平米,零食、咖啡这些统统都没有。环境还没下图这哥仨的地方宽敞。

我的工资每个月 800 块钱,没啥福利,正常计算机专业毕业生的工资 2000 元左右。

那个年头,露天大排档烤串还是 1 块钱三串,煎饼还不到 2 块,北京的房价也才几千块钱。所以,工资 800,够生活了,不嫌少!有地方收留我就够了,能入这个行就知足了。

经过大四半年的 Java 培训,我只会点简单的 SQL,只会用 JDBC 写写增删改查。刚去没几天,就来了个项目,做一个内容发布系统,经理把这个项目交给了我自己,准确的说是还有一个美术帮忙作图,那两位程序员大哥,多少能指导我一些。

小公司就这样,基本就是一个人负责一个小项目,后台开发是你,前端开发是你,测试也是你,写文档的还是你。如果有大项目的话,3 个人一起上……想太多了,一共 3 个人,对大项目免疫。

这个项目我干了 3 个月,提前交付了,做的非常辛苦。有点增删改查的底子,所以后端Java代码写能凑合写写,前端的 Html、JavaScript 真的是从头开始学。白天上班干活,下班之后自己泡 优快云、各种技术论坛,拼命的学东西,没少加班熬夜。有时候太晚没公交车了,就趴在桌子上凑合睡一宿。

这个项目做完之后,从环境的安装,到开发代码、到写各种文档,算是完整的经历了一次。

俗话说的好,小公司能够锻炼你的综合能力。 

第一个项目虽然很小,但是我学会了很多东西,以前培训班学的理论知识,经过这次动手干,感觉算是掌握了。

这个项目之后,又做了一个差不多的项目,这个时候心里就有底了。做完两个项目之后,工资涨到了 1200。攒了几个月工资,给自己买了第一部手机。

到了 2003 年,又接手了一个让我印象深刻的项目。印象深刻在哪呢?

第一、这个项目比之前的项目复杂的多,一个小型的 CRM 系统,自己吭哧吭哧的做了将近一年。客户对前端要求很高,所以逼着我在 JavaScript 这块进步明显。

第二、客户在外地,头一次体验工作出差,从前期调研到最后系统安装交付,自己一个人出差了很多次。我之前没去过几个城市,现在还记得第一次出差很兴奋,需求调研也比较顺利,在回来的火车上就开始着急的做设计了。

第三、03 年全国爆发非典疫情,非典期间一般人轻易不出门,我当时也不怕,还带着大厚口罩出差。到了外地出了火车站,如果出租司机看出来你像北京来的,都不敢拉。北京人被外地人歧视最惨的一次。

第四、这个项目我用了 Struts 和 Hibernate,和同行比起来,算是比较早接触这两个技术的。其实可以不用,但是为了学新东西,我建议老板用的。小公司有这点好处,没那么多限制,做决定也痛快。

这个项目做完之后不久,我就跳槽去了一家几千人的外企,跳槽的理由:一是为了个人更好的发展,感觉在小公司已经学不到太多东西了,希望能接触更大的项目、挑战,和更成熟的环境。二是因为工资,跳槽前工资 2000,跳槽后工资 5000。

在小公司的这两年里,最主要的收获有两方面:

第一、把自己锻炼的比较全面,不仅仅是在技术方面。以前我和陌生人说话紧张,负责项目之后,少不了和客户沟通需求,慢慢的沟通能力就长进了,说话也没那么紧张了。

第二、自己的快速成长,除了有项目逼得,还有同事的指点。公司小,同事关系融洽,无论是那两位程序员大哥,还是老板,经验、阅历都比我这个小白要丰富的多。现在想想还很感激他们对我的帮助。

我在小公司的经历讲完了。如果你们现在也有选择公司的纠结,我可以给几点建议

1. 不要道听途说,不要天真的以为大公司都有完善的人才培养、晋升,不要以为小公司都很高效、没有内斗。

2. 看业务,就算是大公司,如果你参与的是非核心业务,甚至是边缘业务,说不定哪天业务也就被砍了。

3. 看趋势,如果能接触到 AI、大数据业务,值得去试试。

4. 看跟的人,如果你的老板或者直属领导很厉害,是行业大牛,不要犹豫,这比公司规模更重要。

5. 看未来,如果是初创小公司,背景好,给你股份,可以趁年轻博一把,说不定你遇到了一个小独角兽。

6、去了大公司,不要以为公司厉害 = 个人厉害;去了小公司,也不要嫌弃。好好锻炼自己能力,让自己的价值不断提高,薪水是你的价格。价格低于价值只是偶然的,价值越高,价格越高。

彩蛋:我在第一家公司还一个非常重要的收获,认识了一个女朋友,现在是我媳妇、我闺女的妈。

<think>嗯,用户之前已经问过如何将三个Python文件合并成一个单文件,现在又回来继续询问具体的步骤,特别是关于如何复制代码、各部分代码的顺序以及具体操作步骤。看起来用户可能对之前提供的步骤还不够清楚,需要更详细的指导。 首先,我需要回顾之前的回答,确保这次回应与之前的一致,同时更详细地分解步骤。用户可能对代码合并的顺序不太确定,尤其是各个文件的依赖关系。他们可能担心复制代码的时候顺序搞错,导致类或函数未定义的错误。 用户的问题现在集中在具体的复制步骤上,比如最开始复制哪部分代码,第二步和第三部分分别是什么。需要明确说明每个文件的内容应该按什么顺序整合到新文件中。根据之前的分析,正确的顺序应该是先合并最底层的依赖,也就是base_trainer.py,然后是依赖它的trainer.py,最后是顶层的trainCV.py的主程序代码。 另外,用户可能对如何处理导入语句和依赖关系还有疑问,需要强调在合并时必须删除所有的from...import语句,并确保类定义的顺序正确。例如,BaseTrainer必须在Trainer类之前定义,否则会出现NameError。 还要考虑用户在实际操作中可能遇到的常见错误,比如类未找到、方法签名不匹配等,并提前给出解决方案,这样可以减少他们的困惑。例如,如果在整合后运行程序时出现NameError,可能是因为类的顺序不对,这时候需要检查代码顺序。 此外,用户可能希望有一个清晰的步骤列表,每一步具体要做什么,以及对应的代码示例,这样他们可以一步步跟着操作。需要将整合过程分解成明确的几个部分,每部分对应原文件的哪块内容,并给出合并后的代码结构示例。 最后,确保语言简洁明了,避免使用过于技术性的术语,让用户容易理解。可能还需要提醒用户在合并后测试代码,确保功能正常,如运行主函数并检查是否有导入错误或逻辑错误。</think>以下是**从多文件整合到单文件的具体操作步骤**,明确标注各部分代码的复制顺序和注意事项: --- ### 整合流程图解(按代码依赖顺序) ``` 整合后的 trainCV.py 结构: 1. BaseTrainer 类(原 base_trainer.py 内容) 2. Trainer 类(原 trainer.py 内容) 3. main 函数及执行代码(原 trainCV.py 内容) ``` --- ### **第一步:复制最底层依赖代码(base_trainer.py)** #### 操作步骤: 1. 新建 `trainCV_new.py`(整合后的单文件) 2. **将 `base_trainer.py` 中的全部代码原样复制到新文件开头** ```python # ========== 原 base_trainer.py 内容 ========== class BaseTrainer: def __init__(self, model, optimizer): self.model = model self.optimizer = optimizer def train(self): print("执行基础训练") ``` #### 关键要求: - 确保 `class BaseTrainer` 完整无遗漏 - 删除原文件中的第三方库导入语句(如 `import torch`),**仅在单文件中保留一份** --- ### **第二步:复制中间层依赖代码(trainer.py)** #### 操作步骤: 1. **紧接在 `BaseTrainer` 类下方,复制 `trainer.py` 中的代码** 2. **删除所有导入语句**(如 `from base import BaseTrainer`) ```python # ========== 原 trainer.py 内容(已删除导入语句) ========== class Trainer(BaseTrainer): def __init__(self, model, optimizer, scheduler): super().__init__(model, optimizer) self.scheduler = scheduler def cv_train(self): print("执行交叉验证训练") ``` #### 关键要求: - 检查 `class Trainer` 是否正确定义为 `BaseTrainer` 的子类 - 确保 `super().__init__` 参数与父类一致 --- ### **第三步:复制顶层主程序代码(trainCV.py)** #### 操作步骤: 1. **在 `Trainer` 类下方,复制 `trainCV.py` 中的主程序代码** 2. **删除所有导入语句**(如 `from trainer import Trainer`) ```python # ========== 原 trainCV.py 的主程序 ========== def main(): # 假设参数已定义 model = "YourModel" optimizer = "SGD" scheduler = "StepLR" trainer = Trainer(model, optimizer, scheduler) trainer.train() # 调用父类方法 trainer.cv_train() # 调用子类方法 if __name__ == "__main__": main() ``` #### 关键要求: - 确保 `Trainer` 类已在之前定义 - 测试参数传递是否正确(如 `scheduler` 是否在父类中存在) --- ### **完整整合后的代码示例** ```python # ========== 第一部分:BaseTrainer 类 ========== class BaseTrainer: def __init__(self, model, optimizer): self.model = model self.optimizer = optimizer def train(self): print("执行基础训练") # ========== 第二部分:Trainer 类 ========== class Trainer(BaseTrainer): def __init__(self, model, optimizer, scheduler): super().__init__(model, optimizer) self.scheduler = scheduler def cv_train(self): print("执行交叉验证训练") # ========== 第三部分:主程序 ========== def main(): model = "ResNet" optimizer = "Adam" scheduler = "CosineAnnealing" trainer = Trainer(model, optimizer, scheduler) trainer.train() # 来自 BaseTrainer trainer.cv_train() # 来自 Trainer if __name__ == "__main__": main() ``` --- ### **关键验证步骤** 1. **运行测试**: ```bash python trainCV_new.py ``` - 预期输出: ``` 执行基础训练 执行交叉验证训练 ``` 2. **检查依赖关系**: - 确认 `Trainer` 类的方法能正常调用父类方法 - 确保所有参数传递路径正确(如 `scheduler` 是否被子类正确处理) --- ### **常见问题修复** 1. **错误:`NameError: name 'BaseTrainer' is not defined`** - **原因**:`Trainer` 类定义在 `BaseTrainer` 类之前 - **解决**:调整代码顺序,确保父类在前 2. **错误:`TypeError: __init__() missing 1 required positional argument: 'scheduler'`** - **原因**:创建 `Trainer` 实例时未传递全部参数 - **解决**:检查 `trainer = Trainer(...)` 的参数是否完整 通过按顺序复制三部分代码并验证,即可实现单文件模式的平滑过渡。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值