从1.5k到18k, 一个程序员的5年成长之路

一名程序员回顾过去五年的学习与工作经历,从初学者成长为技术骨干,分享了在编程技能、团队协作和个人品质等方面的积累。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天收到了心仪企业的口头offer, 回首当初什么都不会开始学编程, 到现在恰好五年. 整天在社区晃悠, 看了不少的总结, 在这个时间点, 我也写一份自己的总结吧.

我一直在社区分享, 所以, 这篇总结也是本着一种分享的态度, 希望相比我还年轻的同学们, 可以从中找到一些让自己成长更快的文字.


先介绍下背景:
1. 2008年3月开始学习编程, 目前2013年3月;
2. 2009年6月计算机专业本科毕业;
3. 大学期间, 基本稳拿班级倒数第一, 高考英语49分, 大学英语除了补考没及格过.


接着, 是一份总结:
1. 5年间60%以上的时间, 每天凌晨2-4点睡觉;
2. 为学习编程花费的总时间超过6000小时;
3. 手写了超过50万行代码;
4. 记录了超过100万字学习笔记;
5. 录制了两份视频教程;
6. 翻译了小型技术文档5份以上, 5个php扩展的官方文档, jqueryui官方文档一份, 书籍<php扩展和嵌入式>
7. 供职过4家公司;
8. 获得两次优秀员工;


下面是这几年的流水, 本人没有过硬的文采, 只是以流水的方式记录, 希望可以激励到别人, 仅此而已:

2008年03月 -- 2008年10月, 一个偶然的机会, 看到了北京尚学堂的java视频教程, 以此为起点, 我开始了自己的编程学习之路. 5月份汶川地震, 我在甘肃, 学校给通宵电, 在这段时间, 我就基本很少去学校上课了, 每天晚上学习到凌晨5-6点, 接着睡到10-11点, 每天两袋1.3元的方便面, 其余所有的时间都用来学习. 这段时间, 我学会了基本的程序设计, 更重要的是, 视频中, 马士兵老是给我灌输了影响我后来最重要的两个观念: 1) 不要怕英文, 出错信息, 文档, 都是学习英文的机会; 2) 不要怕出错, 出错就是学习的机会. 在后来的5年中, 我一直坚持, 我是从基本每个英文单词都要查翻译软件, 到现在能翻译一些东西的. 同样, 我在碰到问题的时候, 都是自己跟踪源代码去解决. 这两个观念直接决定了我今天可以进入自己心仪的企业.


2008年10月 -- 2009年1月, 这段时间, 宿舍搬到了校本部, 没有通宵电了. 学校一位老师找我们帮他做项目, 他为我们提供了他的宿舍, 很烂, 但我依然搬进去了, 就为了通宵电, 我住进了这个阴森森的宿舍, 恐惧缠绕着我, 但我依旧坚持. 白天帮老师做项目, 晚上继续自己的学习. 同样, 我也很感谢这位老师, 虽然他只给了我们很少的报酬, 但是, 我知道, 我得到的远远不是这些报酬可以比拟的. 这里这种很容易满足的心里也是很重要的, 我奉劝各位职场新人, 刚开始不要期望什么, 放低身段, 去做自己的积累就好了. (想起从社区里看到的一句话: 现在的你, 凭什么翘着二郎腿, 你应该放下你的腿, 身体前倾, 时刻保持战斗姿态)


2009年02月, 一个小插曲, 我独自一人来到北京, 开始了第一次真正意义的独立, 我来找工作. 我开始在网上投了10多份简历, 没有回信. 接着我就急了, 直接从网上找招聘的公司, 查地图, 直接去公司面试, 一般都还是会给面试机会的. 最好的成绩是一家表示能给到3000左右, 但后来也没信了. 这段时间, 我有两个收获: 1) 我打印了一整本的<Java数据结构与算法>, 20天的时间, 把基础的数据结构与算法读了一遍; 2) 在一个完全陌生的城市, 我独自一人, 查招聘信息, 查地图, 找公司, 厚颜无耻的霸王面, 这一切都是对我处世能力的极大提升.


2009年03月 -- 2009年06月, 回到学校, 仍然没有工作. 我继续在老师的小黑屋, 实现了所有我找工作时学习的数据结构与算法. 接着, 就进入了毕业季, 每天都泡在酒精中, 浑浑噩噩. 这段时间, 老婆把工作签到了山东淄博, 我也联系了一家淄博的公司, 准备毕业后去面试. 这段时间, 和高中的毕业季一样, 是值得怀念的, 放松, 惬意.


2009年06月 -- 2010年03月, 我来到了淄博, 找到了之前联系的公司, 面试没有通过. 淄博是一个小城市, 做软件开发的没有几家, 还好, 山东人好, 虽然没有面试通过, 但我依然可以借宿在公司宿舍找工作, 就这样, 我放下了所有的尊严, 在别人的宿舍借住, 15天后, 我找到了我的第一家公司. 公司有30人左右, 做国家电网的项目, 老板人很好, 我还得到了一台笔记本电脑, 并且可以带回家. 我每天加班到9点, 然后回家继续学习大凌晨2点左右. 公司的工作相对轻松, 当然, 工资也很少, 只有1.5k. 老婆每周末都过来, 我们虽然没有钱, 经常要靠吃方便面度日, 但我们很幸福. 这段时间, 我学习了python, javascript, 翻译了jqueryui的文档, 录制了一套python的视频教程, 录制了一份fullcalendar的视频教程, 我的生活非常的充实, 当然, 我还有另一个收获: 我学会了吃苦. 冬天, 我住的小屋窗户基本起不到保暖作用, 买个小电暖也起不了多少作用, 屋里水龙头都已经结冰, 我很长时间每天需要吃两包方便面, 但我依然坚持学习, 因为我知道有一天我将不再这样.


2010年03月 -- 2011年03月, 从后来很多次建议来看, 不得不说老婆很有眼光. 她建议我去北京找工作, 我请了3天假, 再一次来到了北京, 不同于上一次, 我现在有大半年经验, 我翻译过文档, 录制过视频教程, 有一定资本了. 然而, 事情并不是那么顺利, 当时期望的用友并没有通过, 在用友面试完后, 我就觉得自己一无是处. 无奈, 只能退而求其次, 来到一家刚创业的游戏公司. 跟这家公司谈完薪水后, 我先给妈妈打了电话, 5.5k, 已经到了妈妈不能相信的地步. 就这样, 我正式的踏入了北京的土地. 一年中, 我更多的是为公司付出, 自己以javascript研发进入, 后来页面制作也的我搞, php后来我也要做, 服务器我还要搞, 不得不说, 非常锻炼人. 还是前面的态度, 我觉得这种锻炼就是我最大的收获, 从这里开始, 我正式的转向php开发.到2011年3月的时候, 已经觉得公司很不行了, 又碰巧老婆怀孕, 不得不考虑结婚的事情, 因此, 我就辞职, 回家结婚.


2011年04月 -- 2012年03月, 婚后的生活很好, 我又找到了一份工作, 这家公司相对比较大, 2000+的规模. 不过有一些体制内的特质, 我进入的薪资是6k, 全年能拿到18薪以上, 公司的福利待遇都很完善, 工作也相对轻松, 我的领导人也很好, 技术也很好, 就这样, 在这家公司, 我又开始了自己的学习之路. 我继续每天凌晨2-3点睡觉, 完成了这几年最重要的积累: unix环境高级编程, unix网络编程, php内核和扩展, shell/awk/sed等等最基础的东西. 同样, 在大公司中, 我也学会了更多的团队协作, 同事关系方面的东西. 2012年03月, 公司一位副总跳槽, 就这样, 我们小组集体来到了下一家公司.


2012年03月 -- 2013年03月, 新的公司, 项目还没有上线, 已有的东西问题诸多, 我们被委以重任, 6.1日上线. 旧的团队存在诸多问题, 士气不振, 技术水平不足. 我们在6.1之前完成了很重要的几件事: 1) 提升团队士气; 2) 整理旧的框架不好的东西; 3) 修改大量的bug; 4) 规范工作流程; 5) 规划未来的技术框架. 虽然后来看做的东西一般, 但在这么短的时间完成这一切, 我觉得实在难得. 虽然我一直自我感觉对自己更多的提升是自己业余时间的学习, 但不可否认, 在这家公司的一年中, 我在团队建设, 团队管理, 团队协作方面也有了质的变化. 在这家公司, 我的薪资得到了很大的提升, 达到了18K, 这是我从来都没有想过的事情. 所以, 我想给诸位职场新人说, 你不要一开始就想要这要那, 只要你做的够好, 终有一天, 你会发现你得到的远比失去的要多.
后面这两家公司中, 我觉得更重要的是我学会了一种处世方式, 首先学会听别人说话, 然后自己做感悟, 做提升.


流水的结束, 就是在昨天, 我收到了自己心仪公司的口头offer, 并且也已经给现在的公司提出了离职. 和leader聊了一会儿, 大家都还挺开心.


在前5年中, 我用的网名是selfimpr, 是self-improvement简写而来, 含义是: 自强不息. 5年中, 我从所有可能激励我的地方去激励自己, 让自己可以一直坚持走到今天. 这几天, 我在考虑, 用一个词总结我的前5年. 我想, 这个词就是"积累".
这也正是我想给这个行业的后来者说的, "积累", 并且要是不计回报的积累, 因为你一旦太过计较回报, 你的心就很难平静, 往往就会半途而废.
此外, 还有一点要说的是, 比我基础更差的同学估计也很难找了, 所以, 能不能学有所成, 关键不在你是否有基础, 而在于你付出了多少.


接下来, 我已经更换了自己的网名goosman, 是从swan goose演化而来, 我不知道"鸿鹄"用英语怎么说, 就用了这个单词, 希望我可以像书中所说, 利用自己前5年的积累, 一展鸿鹄之志.
<think>我们正在解决紫光FPGA仿真中出现的“Module GTP_DRM18K_E1 is not defined”错误。根据用户提供的引用和之前的问题,我们知道类似错误(如GTP_GRS未定义)的解决方法是显式实例化该模块。同样,GTP_DRM18K_E1模块未定义的问题也可以采用类似的思路解决。 错误分析: 1. 错误信息“Module GTP_DRM18K_E1 is not defined”表明在仿真过程中,仿真器(如ModelSim)找不到名为GTP_DRM18K_E1的模块定义。 2. GTP_DRM18K_E1是紫光FPGA中用于分布式RAM(DRM)的硬件原语模块,通常在PDS安装目录下的Verilog文件中定义(例如:GTP_DRM18K.v)。 3. 在仿真时,如果设计使用了该模块,但仿真环境没有正确包含其定义文件或没有在测试平台(testbench)中实例化,就会报错。 解决方案: 步骤1:确认设计是否使用了分布式RAM(DRM) - 如果设计中没有使用分布式RAM,则可能是PDS工具在生成仿真模型时错误添加了该模块的引用,需要检查工程设置。 - 如果设计中使用了分布式RAM,则必须确保仿真环境包含该模块的定义。 步骤2:在测试平台(testbench)中显式实例化GTP_DRM18K_E1模块 - 类似于之前解决GTP_GRS的方法,我们可以在测试平台的顶层模块中显式实例化GTP_DRM18K_E1模块。但注意,这个模块通常不需要像GRS那样全局连接,而是需要根据实际设计中的例化情况来连接。 - 然而,由于GTP_DRM18K_E1是设计内部使用的模块,我们通常不需要在testbench中实例化它。因此,更可能的原因是仿真库没有正确编译。 步骤3:检查并添加仿真库 - 打开ModelSim,检查当前工程是否添加了紫光FPGA的仿真库。通常,PDS工具会生成一个仿真库,包含所有必要的原语模块(包括GTP_DRM18K_E1)。 - 如果未添加,可以手动添加: 1. 找到PDS安装目录下的仿真库文件,路径通常为:`<PDS安装目录>/arch/vendor/pango/verilog/simulation`(例如:D:/PDS/PDS_2021.1-SP7.1-ads/arch/vendor/pango/verilog/simulation)。 2. 将该目录下的所有.v文件(特别是包含GTP_DRM18K_E1定义的文件,如GTP_DRM18K.v)添加到仿真工程中。 步骤4:重新编译仿真库 - 在ModelSim中,将添加的.v文件重新编译(Compile->Compile All)。 步骤5:如果问题仍然存在,尝试在测试平台中添加一个伪模块(dummy module)定义(临时解决方案) - 如果因为某些原因无法正确编译库文件,可以临时在测试平台中添加一个空的GTP_DRM18K_E1模块定义,以避免仿真器报错(不推荐,因为会影响仿真准确性): ```verilog // 在测试平台文件(如tb_top.v)的末尾添加以下代码 module GTP_DRM18K_E1 (/* 端口列表 */); // 空模块,仅用于通过编译 endmodule ``` 注意:这只是一个临时绕过方法,正确的做法是确保仿真库正确设置。 步骤6:检查PDS工程设置 - 在PDS中,确保生成仿真模型时包含了所有必要的库文件。可以尝试重新生成仿真文件(在PDS中,选择Tools->Simulation->Generate Simulation Files)。 注意事项: 1. 紫光FPGA的仿真库路径可能因版本不同而有所变化,请根据实际安装路径调整。 2. 如果设计中使用多个DRM模块,可能需要确保每个实例都有正确的连接。但通常,只要库文件正确包含,仿真器就能自动解析。 引用说明: 根据用户提供的引用[2],错误信息指向了GTP_DRM18K.v文件中的一行,说明该文件确实存在,但仿真器无法解析GRS_INST(之前的问题)。现在的问题类似,但模块名不同,因此同样需要确保该文件被正确编译到仿真库中[^2]。 如果以上步骤仍不能解决问题,建议检查: - 仿真工具是否使用了正确的库映射(Library Mapping)。 - 是否有多个版本的仿真库文件冲突。 相关问题: 1. 紫光FPGA仿真中如何正确添加仿真库? 2. 如何避免紫光FPGA仿真中其他原语模块未定义的错误? 3. 紫光PDS联合Modelsim仿真时,如何设置仿真库路径?</think>### 紫光FPGA仿真报错 "Module GTP_DRM18K_E1 is not defined" 解决方案 当紫光FPGA仿真中出现 **"Module GTP_DRM18K_E1 is not defined"** 错误时,这表明仿真环境缺少对紫光专用分布式RAM模块的定义。该模块是紫光FPGA架构中实现18Kb分布式RAM的关键硬件原语。以下是系统化的解决方案: --- ### 错误原因分析 1. **核心问题**: - `GTP_DRM18K_E1` 是紫光FPGA的专用RAM原语模块 - 仿真时未正确加载其定义文件(通常位于PDS安装目录的`verilog/simulation/`下) - 错误提示示例: ``` Error: (vsim-3043) ... Unresolved reference to 'GTP_DRM18K_E1' ``` 2. **根本原因**: - 设计代码中调用了分布式RAM(如通过`$readmemh`或RAM模板) - PDS生成的仿真模型未包含原语库文件 - Modelsim工程未正确添加紫光器件库[^1][^2] --- ### 完整解决步骤 #### 步骤1:添加原语库到仿真工程 1. 定位库文件: - 打开PDS安装目录:`<PDS安装路径>/arch/vendor/pango/verilog/simulation/` - 找到以下关键文件: - `GTP_DRM18K.v`(包含`GTP_DRM18K_E1`定义) - `GTP_GRS.v`(通常需同时添加) - `gtp_cells_sim.v`(其他原语定义) 2. 在Modelsim中添加文件: ```mermaid graph LR A[Modelsim] --> B[右键点击Project] B --> C[Add to Project > Existing File] C --> D[选择GTP_DRM18K.v等文件] D --> E[Compile All] ``` #### 步骤2:修改测试平台(Testbench) 在测试文件顶部添加显式模块声明(临时解决方案): ```verilog // 添加在测试平台文件顶部 (tb_top.sv) `ifdef SIMULATION // 仅在仿真时生效 module GTP_DRM18K_E1( output [17:0] DOUT, input CLK, input [13:0] ADDR, input [17:0] DIN, input EN, input WE ); // 简化的RAM行为模型 reg [17:0] mem [0:16383]; always @(posedge CLK) begin if (EN) begin if (WE) mem[ADDR] <= DIN; DOUT <= mem[ADDR]; end end endmodule `endif ``` #### 步骤3:检查PDS仿真设置 1. 在PDS中重新生成仿真模型: - 打开PDS工程 - 进入 **Tools → Simulation → Generate Simulation Files** - 勾选 **"Include Primitive Libraries"** 2. 验证生成文件: - 检查生成的`<project>.sim/sim_1/behav/pango/`目录 - 确认包含`GTP_DRM18K.v`等文件 #### 步骤4:设置Modelsim库映射 在Modelsim启动脚本中添加库映射: ```tcl # modelsim_init.tcl vlib pango_lib vmap pango_lib ./pango_lib vlog -work pango_lib "D:/PDS/PDS_2021.1-SP7.1-ads/arch/vendor/pango/verilog/simulation/*.v" ``` --- ### 验证与调试 1. **编译顺序**: - 先编译原语库(`GTP_DRM18K.v`) - 再编译设计文件和测试平台 2. **常见错误排查**: - 若仍报错,检查模块名拼写:`GTP_DRM18K_E1`(区分大小写) - 确认RAM端口连接正确: ```verilog GTP_DRM18K_E1 u_ram ( .DOUT(ram_out), // [17:0] .CLK (clk), // 注意时钟相位 .ADDR(addr), // [13:0] .DIN (din), // [17:0] .EN (1'b1), // 使能信号 .WE (wr_en) // 写使能 ); ``` 3. **版本兼容性**: - 紫光PDS 2021.1+:使用`GTP_DRM18K_E1` - 旧版本(如2020.3):可能命名为`PG_DRM18K` --- ### 预防措施 1. **标准化仿真流程**: ```mermaid graph TB S[启动仿真] --> A[执行库映射脚本] A --> B[编译原语库] B --> C[编译设计文件] C --> D[运行仿真] ``` 2. **工程模板化**: - 创建包含以下文件的仿真模板工程: - `/libs/pango_sim.v`(所有原语文件合集) - `/scripts/sim_setup.tcl`(自动映射库) 3. **RAM初始化检查**: - 使用`$readmemh`时确认文件路径: ```verilog initial begin $readmemh("../../mem/ram_init.hex", u_ram.mem); end ``` > **关键提示**:当设计中使用紫光专用IP(如RAM、DSP)时,必须在仿真前显式添加对应原语库,这是紫光FPGA与Xilinx/Altera仿真流程的主要差异点[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值