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

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

程序员与工程师

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

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


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

替换或重写Tomcat内置的404页面

替换或重写Tomcat内置的404页面 准备一个Tomcat隐藏Tomcat的相关信息纯净版的Tomcat解决Tomcat启动乱码的问题 替换或重写Tomcat内置的404页面创建新的首页和错误页面页面代码如下所示:创建首页index.html创建error_404.html页面创建其他错误页面创建编写web.xml&am…

工业软件的分类与选择策略:针对中小企业的实际应用考量

工业软件是现代工业体系的“大脑”,已经渗透到几乎所有工业领域的核心环节,是现代产业之“魂”,是制造强国之重器。工业软件通过优化生产流程、实时监控设备状态、实现自动化控制等功能,可以帮助企业显著提升生产效率和质量&#…

让工厂像手机一样更“聪明”

手机,作为我们日常生活中不可或缺的一部分,以其智能、便捷、高效的特点,彻底改变了我们的沟通、娱乐和工作方式。那么,想象一下,如果工厂能像手机一样便捷,那么生产过程中的每一个环节都将变得触手可及。通…

jstack的火焰图使用说明

1、jstack的官方文档说明 How to use Flame Graph? - Fast thread 2、jstack的文件分析网站,可以关注cpu消耗比较高的线程和火焰图 GC log analysis error

[word] Word如何删除所有的空行? #职场发展#学习方法

Word如何删除所有的空行? 很多网友从网页复制文字粘贴到word文档后发现段落之间有空行,如果文字不多,手动删除这些空行也没有多少工作量,但是如果文字的字数达到成千上万,一个个手动删除这些空行还是很繁琐的。那么&a…

Linux-笔记 高级I/O操作

前言 I/O(Input/Output,输入/输出)是计算机系统中的一个重要组成部分,它是指计算机与 外部世界之间的信息交流过程。I/O 操作是计算机系统中的一种基本操作,用于向外部设备(如 硬盘、键盘、鼠标、网络等&am…

Spring Cloud - 开发环境搭建

1、JDK环境安装 1、下载jdk17:下载地址,在下图中红色框部分进行下载 2、双击安装,基本都是下一步直到完成。 3、设置系统环境变量:参考 4、设置JAVA_HOME环境变量 5、在PATH中添加%JAVA_HOME%/bin 6、在命令行中执行:j…

Python学习笔记17:进阶篇(六)代码测试

代码测试 代码测试是软件开发过程中的关键环节,旨在确保代码质量、功能正确性以及性能符合预期。 在开发过程中,进行代码测试有很多好处: 提高软件质量:通过发现并修复错误,测试有助于提升软件的功能性、可靠性和稳…

黑马程序员-瑞吉外卖-前六章

黑马程序员瑞吉外卖 文章目录 1、开发环境搭建1.1 数据库环境1.2 maven项目搭建1.2.1 新建项目1.2.2 整合MyBatisPlus1.2.3 整合Druid1.2.4 配置文件application.yml1.2.5 尝试启动项目1.2.6 将前端静态页面引入到项目中 2、 后台系统登录功能2.1 需求分析2.2 代码开发2.2.1 创…

解析网页数据并且处理网页正则表达式与re模块

目录 一、解析网页数据的技术 1.正则表达式 2.XPath 3.Beautiful Soup 4.JSONPath 二、正则表达式的语法 1.元字符 2.预定义字符集 三、 re 模块的使用 1.创建 Pattern 对象 2&#…

libreoffice报: error while loading shared libraries: libcups.so.2: cannot

切换到cd /opt/libreoffice7.1/programlibreoffice查看版本的时候报:/opt/libreoffice7.1/program/soffice.bin: error while loading shared libraries: libcups.so.2: cannot open shared object file: No such file or directory ./soffice --version解决办法: …

MySQL之复制(六)

复制 复制拓扑 拥有备库的主-主结构 另外一种相关的配置是为每个主库增加一个备库,如图所示。这种配置的优点是增加了冗余,对于不同地理位置的复制拓扑,能够消除站点单点失效的问题。你也可以像平常一样,将读查询分配到备库上。…

深入JVM:详解JIT即时编译器

文章目录 深入JVM:详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析(1)同步锁消除(…

从零开始学习Linux(10)----动静态库

目录 1.制作静态库 1.编写源代码 2.编译 3.打包库 4.使用库 2.制作动态库 1.编译 2.打包库 3.总结 3.理解动态库加载 1.站在系统角度理解 2.谈谈编址,可执行程序 1.制作静态库 1.编写源代码 假设你编写了两个源代码文件mymath.c和myprintf.c以及它们对应…

vuex的actions返回结果类型是promise及actions方法互相调用

this.$store.dispatch(‘logout’)返回的结果是Promise类型的 调用成功的情况下,返回状态为fulfilled,值为undefined。 所以可以直接进行.then操作: this.$store.dispatch(logout).then((result) > {console.log(result); });因为 Vuex …

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式(Regular Expression,常简写为regex、regexp或RE)是一种强大的文本处理工具,它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

草莓不是莓,西瓜才是莓——解读 Kubernetes 中被驱逐的 Pod

每天都有成千上万的 Pod 从节点中被驱逐。它们无家可归、困惑不已,不得不放弃之前的生活方式。其中一些甚至变成无节点状态。 在 Kubernetes 中 Pod 被驱逐意味着什么?我们常常能看到 Pod 因为资源不足被终止。但为什么会发生这种情况呢? 驱…

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

ElementUI组件库,分页组件靠右显示

ElementUI组件库,分页组件靠右显示 分页组件 ,el-pagination组件默认靠左显示,靠右显示的话只需给layout添加一个“->”属性值即可, 看图

AMEYA360代理品牌江苏润石:RS8661/2/4系列高压精密低噪声运算放大器

继RS8651/2/4系列高压精密低噪声运算放大器成功推向市场,润石科技再次成功量产RS8661/2/4系列高压精密低噪声运算放大器。 RS8661/2/4系列产品将工作电压提升到最高36V(18V)、失调电压进一步优化到5μV、在工业现场数据采集、各种仪器仪表测量设备\分析设备上有着广…