一个土木工程专业背景的开发者,讲述开源带给他的力量

news2024/11/13 4:15:48

在前段时间我们举办的“TDengine Open Day”第一季技术沙龙中,TDengine 应用研发高级工程师谭雪峰进行的“开源之路:程序员的成长与探索”主题分享获得了众多参会者的好评。谭雪峰从自身独特的职业发展经历出发,分享了自己在开源领域的种种收获以及在进行职业转换过程中面临的挑战及应对。本篇文章基于此次演讲整理而成,给到有需要的开发者参考。

从土木工程到软件开发,开源是我的“老师”

我并不是科班出身,大学学的是土木工程专业,最后转来转去,就成为了一名开发者,过程中所有的编程知识我都是自学的。从土木工程到软件开发,这一转变几句话可能就概括完了,但我在其中付出的精力和努力不是能简单用文字概括的,现在想想,幸好坚持了下来,最终也结出了一个不错的成果。

最开始就是因为对游戏的热爱,引发了我对游戏逆向工程的兴趣。我开始使用工具如金山游侠、Cheat Engine(CE)、OllyDbg(OD)、IDA 等,来探索游戏的内部工作原理。这一过程让我熟悉了汇编语言和伪 C 代码,进而激发了我对底层编程的兴趣。通过参与 Capture The Flag(CTF)比赛,我进一步锻炼了我的技术能力,并在解决复杂问题中找到了乐趣。

之后,我从逆向工程转向了更广泛的编程领域,开始自学 JavaScript、Python、PHP、Lua 和 Go 等语言。在刚开始工作时由于编程知识的基础不足,工作上还是非常困难的,我就边实践边学习。这一路上,我的知识几乎都是通过网络学习来的——通过百度和谷歌,我能够搜索到几乎任何我需要的学习资源;同时,技术社区如 CSDN 和 Stack Overflow 成为了我解决编程难题和学习新技能的宝贵平台。这些资源对我帮助巨大,让我能在编程的世界里越走越远。

还有一个很重要的学习途径就是参与开源项目。刚开始我就是在 GitHub 上学习别人写的开源代码,等有了成长之后就不单是学习了,我自己也开始贡献代码,成为了一名 Contributor。我参与的第一个开源项目是关于寻路算法的优化,在从 ActionScript 到 TypeScript 的转换过程中,我发现了一些算法的 Bug,并开始尝试修复,最终成功修正了源算法的狄洛尼三角网生成错误以及包围盒调用错误。这是我第一次向开源社区贡献代码,感觉自己真的是从使用工具到改进工具的一个转变。

之后我印象比较深刻的一个项目是关于 H265 视频流。在某次工作中,我在一个项目中需要处理 H265 格式的视频流,要优化延迟时间。我花了一些时间进行改进,后端取到 H265 裸流进行处理之后用 Websocket 实时推送 Web 端,然后在 Web 端我将 ffmpeg 编译成 webassembly,之后在浏览器里用 Worker 实现多线程软解,最终通过 Canvas 进行实时监控,并成功实现了毫秒级延迟。这个项目让我学到了很多关于视频处理和浏览器性能优化的知识。后来,我把这个前端解决方案开源了,希望能帮助到其他面临相同挑战的开发者。

最具戏剧化的一次开源经历就是参与 TDengine HiveMQ 挑战赛,这次经历也让我与 TDengine 真正连接在了一起。在这场比赛中,我最终以第一名的成绩获得了“优胜奖”,结果还是很不错的。这也是我第一次参与开源社区活动,感觉能展示自己还能回馈社区,这正是我想做的事情。接着我就收到了涛思数据抛出的“橄榄枝”,最后很幸运地成为其中一员,目前我主要负责 TDengine 的应用研发和一些周边生态建设。

其实在这之前我就在研究 TDengine 了,我之前所在领域是工业物联网,对各种时序数据库都需要了解一些,国产的时序数据库数量比较少,其中开源的就更少了,在这些开源数据库里面 TDengine 性能又是其中非常高的,当时要将TDengine 引入到平台里面,就认识了涛思数据的人。后来因为一些开发任务我开始研究 TDengine 的源码,为了能在 Windows 上应用便用 GCC 编译做了一些修改,这也是我首次参与大型开源项目。

通过这些经历,我从一个简单使用工具的程序员,变成了能够自己“造轮子”的开发者。现在,我不仅能解决问题,还能创造工具帮助他人解决问题。这就是开源给我的最大礼物—成长和自由。

开源让用户、项目、开发者多方共赢

发展至今,开源社区已经演变为一个日益壮大的全球性多元化舞台,开发者可以在社区中分享经验、解决问题、合作开发,共同推动项目的发展。越来越多的企业意识到开源的重要性,积极支持开源项目,并且在自己的产品和服务中采用开源技术。许多大型企业也积极参与到开源项目中,贡献代码、资源和经验,推动了开源社区的发展和创新。

上图是 GitHub 2023 年年度报告,从其中我们可以看到,2023 全年一共有 4.2 亿个项目、2.84 亿个公共仓库、6.5 万个公开的生成式 AI 项目、总共做出了 45 亿次贡献。可见开源项目数量不断增长,涵盖了各个领域,包括操作系统、编程语言、框架、工具、应用程序等。

开源产品无疑是当今技术发展的一大趋势。通过开源,产品可以吸收来自不同使用者的广泛反馈,不合理之处可以通过提交问题(issue)来指出,而社区的开发者则能贡献自己的代码改进。这种模式促使使用者、开发团队和社区三者之间形成协作,共同丰富和完善项目内容,确保了项目的持续健康发展,而不是闭门造车式地过早终结。

以 TDengine 为例,不同于许多时序数据库采用的是单机版免费而集群版收费的模式,TDengine 提供的集群版同样是开源的。这不仅使得开发者能够深入学习数据库集群的解决方案,还为使用者提供了更优质的集群版时序数据库选择,实现了多方共赢的局面。

当下的“开源盛景”无疑也为每个开发者提供了很大的机会。开源让开发者展现自己的同时还能帮助到其他人,分享越多得到的就越多,你可能觉得自己掌握的知识很简单,但也有很多人还不懂,他们得到了你的帮助也会诚心的去感谢你。以我自身参与开源的经历来说,我认为通过开源项目主要能让我们获得以下四个维度的能力提升:

  • 提升代码质量

我们可以选择一些优质的开源项目,多看多学习这些开源代码。但想要成长还需要多写,不光要写代码还要把优化的过程写出来,最简单的办法就是写完一段代码之后半个月再去看,如果觉得当时的写的非常 low 那就说明有成长了。最好就是自己写东西开源出来,帮助别人的同时与开源项目一起成长。

而且开源代码还会促使开发者保持高标准,因为知道自己的代码将被公开展示,我们便会更加注重代码的整洁和清晰。Linus's Law 曾说过一句经典名言“Given enough eyeballs, all bugs are shallow”,这句话的意思是如果有足够多的人检查代码,那么所有的 Bug 都将无处藏身。

  • 获得实战项目经验

参与开源项目为程序员提供了接触和探索各种规模代码库的机会,这些代码库的规模从几十行的小型脚本到多达数百万行的复杂系统不等。通过研究和实践这些现有的代码,程序员不仅可以学习到如何构建简洁、高效且易于维护的代码结构,还能深入理解多种设计模式和算法的实际应用。此外,参与这些项目还可以帮助他们在实际开发中更好地理解代码的性能优化、错误处理和用户体验改进等关键方面。

  • 技术视野拓展

当一项新技术开始引起关注时,开源项目往往是最早采用和实验这些技术的平台之一。参与这些项目不仅可以使程序员在早期阶段就接触并掌握这些前沿技术,还能深入了解其背后的原理和实际应用场景。这种直接的实践经验不仅能够提升个人的技术能力,还有助于帮助我们形成对未来技术趋势的敏锐洞察,在不断变化的职业市场中保持竞争优势。

  • 建立个人品牌

随着开源技术的深入和广泛应用,开源社区的影响力日益增强,越来越多的企业开始认识到开源项目中隐藏的人才价值。企业不仅在技术创新上依赖这些开源解决方案,同时也倾向于招募那些在开源社区中积极贡献的程序员。那些在开源社区中有所贡献的程序员,往往更容易获得企业的青睐,从而获得更好的职业发展机会。

但相应的,拥有“Contributor”的头衔不仅是一种荣誉,更是一种责任。作为开源社区的一员,我们需要从内心深处发挥回馈社区的责任感。开源项目的成功不仅仅依赖于代码的质量,更重要的是依赖于社区成员的积极参与和持续贡献。这包括对项目的负责,关注并推动项目的长期发展,维护社区的健康生态,以及确保软件的高质量和稳定性,为用户提供卓越的使用体验。通过这种全面的投入,我们不仅提升个人技术水平,还为整个开源生态系统的繁荣做出贡献。

程序员与工程师

在软件开发中,程序员和工程师虽共同致力于软件的创建与完善,但他们的角色和职责各有侧重。程序员主要专注于编写、测试和维护代码,解决特定的技术问题。他们是代码实现和逻辑的专家,通过精确的编程确保软件功能的实现。

而软件工程师的职责更为广泛,不仅包括编程,还涵盖项目的整体规划、设计、测试、部署与维护。工程师需要在整个软件开发周期中进行综合考虑和资源协调,以确保项目的顺利执行和质量标准的达成。因此,每位工程师都应具备扎实的编程能力,而成为一名合格的程序员仅是迈向全面软件工程师之路的起点。通过积极参与开源,程序员可以逐步扩展自身的技术和管理视野,最终成长为能够在更广泛领域内作出影响的软件工程师。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DM达梦数据库字符串函数整理

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

视觉理解与图片问答,学习如何使用 GPT-4o (GPT-4 Omni) 来理解图像

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、引言 OpenAI 最新发布的 GPT-4 Omni 模型,也被称为 GPT-4o,是一个多模态 AI 模型,旨在提供更加自然和全面的人机交互体验。 GPT-4o 与 GPT-4 Turbo 都具备视觉功…

3d中模型显示黑色给不了材质---模大狮模型网

如果3D模型显示黑色,而且无法给它添加材质,可能有以下几种原因: 一:模型没有UV贴图 UV贴图是3D模型表面纹理的一种方式,如果模型没有正确的UV贴图,渲染时可能会显示黑色。在大多数3D建模软件中&#xff0c…

Telnet远程登录(Cisco)

Telnet 基于TCP/IP协议族 远程终端协议 在Internet上远程登录 VTY(Virtual Teletype) 通过IP连接物理上的终端 实现在Internet上 登陆和配置远程目标终端 A Router>enable Router#config Router(config)#hostname A A(config)#interface gigabitEthernet 0/0 A(confi…

归并排序与快速排序总结-c++

一,归并排序 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法分治法(Divide and Conquer)的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法…

机器学习/pytorch笔记:time2vec

1 概念部分 对于给定的标量时间概念 t,Time2Vec 的表示 t2v(t)是一个大小为 k1的向量,定义如下: 其中,t2v(t)[i]是 t2v(t)的第 i 个元素,F是一个周期性激活函数,ω和 ϕ是可学习的参数。 以下是个人理解&am…

最热门的智能猫砂盆好不好用?这期统统告诉你!

身为上班族的我们,常常被工作和出差填满日程。忘记给猫咪铲屎也不是一次两次了。但我们必须意识到,不及时清理猫砂盆不仅会让猫咪感到不适,还可能引发泌尿系统感染、皮肤疾病等健康问题。为了解决这个问题,越来越多的铲屎官开始将…

JavaWeb——MySQL:navicate客户端工具简单使用

目录 1. 连接 2. 新建数据库 3. 使用数据库 4. 新建表 5.使用表 6. 导出数据库 我这里是英文版,没有进行汉化。 1. 连接 点击左上角Connection,选择MySQL,(我连接的是自己计算机上的数据库)连接名输入&#x…

Java面试题:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 将数据的存储和索引放在一块,索引结构的叶子节点保存了行数据 索引字段必须存在,且只能存在一个 非聚集索引(二级索引) 将数据和索引分开存储,索引结构的叶子节点关联的是对应的主键 索引字段可以存在多个 索引的选取规则 如果…

Unity2D - 碰撞检测及边界检测

1. 地面检测 1.1 地面检测的逻辑及代码 一般情况下,对于手人物进行事件处理或动作处理时,我们需要判定人物是否在地面上,这个时候最好的方式是设定地面碰撞器,只有角色在地面时才可以进行跳跃; 我们可以想象物体的重心向地面延伸…

Java的gui开发-Swing如何一键打包exe、dmg等

java的gui开发其实很方便,性能也不错,知名的idea开发工具也是java-swing开发,只是用的人少,看了我的例子3分钟就能学会,分分钟写桌面端,下面教你如何一键打包windows端exe Java-Swing-Template java的gui开…

解决SD卡被写保护问题

存储卡在使用过程中,有时会遇到写保护问题,导致无法写入或删除数据。这可能会对用户的正常使用造成困扰。MK米客方德将为您介绍几种常见的解决方法,帮助用户解除存储卡的写保护。 一、检查物理写保护开关 许多存储卡,如SD卡&…

深入剖析Tomcat(十二) 详解StandardContext

StandardContext是Context容器的一个标准实现,一般情况下,Tomcat都是使用StandardContext类来创建Context容器。前面讲过,Context容器代表了一个Web应用,Tomcat本身支持部署多个应用,相应的每个应用都会有一个Standard…

解锁小红书新玩法:中小企业出海营销的集成策略

随着全球数字化浪潮的推进,小红书作为生活方式分享平台的崛起,为中小企业提供了一个全新的营销舞台。NetFarmer,作为专注于企业数字化出海的服务商,深谙小红书的营销策略,并致力于通过HubSpot产品销售与实施&#xff0…

spring boot jar 启动报错 Zip64 archives are not supported

spring boot jar 启动报错 Zip64 archives are not supported 原因、解决方案问题为什么 spring boot 不支持 zip64zip、zip64 功能上的区别zip 的文件格式spring-boot-loader 是如何判断是否是 zip64 的? 参考 spring boot 版本是 2.1.8.RELEASE,引入以…

Chrome开发者工具学习

打开开发者工具: 可以通过在网页上点击右键并选择“检查”来打开。 或者使用快捷键Ctrl Shift I(在Windows/Linux上)或Command Option I(在Mac上)。 界面概览: 熟悉DevTools的基本面板,如“…

Mongo Express 未授权访问漏洞

【产品&&漏洞简述】 Mongo Express 是一个基于 Node.js 和 express 的开源的 MongoDB Web管理界面。Mongo Express存在未授权访问漏洞,攻击者可通过该漏洞获取用户信息或修改系统数据。 【资产测绘Query】 title"Home - Mongo Express" 【产品界…

期货交易中的几种常见心态管理

期货交易通常涉及到风险和收益的权衡,因此参与者的心态可以显著影响他们的决策和最终结果。以下是一些炒期货的常见心态: 1. 利润最大化心态:持有这种心态的投资者不关心风险,只考虑高利润。他们可能会盲目追求高回报&#xff0…

【D3.js in Action 3 精译】1.1.3 D3.js 的工作原理

译者注 上一节我们探讨了 D3.js 的适用场景——需要高度定制化、可以尽情释放想象力的复杂图表。这一节我们再跟随作者的视角,看看 D3.js 的工作原理究竟是怎样的。 1.1.3 D3.js 的工作原理 您可能已经体验过 D3 并且发现它不太容易上手。这也许是因为您把它当成了…

【Linux】使用信号进行进程间通信

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ ​ 实现原理&a…