自学成才的软件开发人员:为什么开源对我们很重要

这是一个关于我对开源的看法如何随时间变化以及如何对我的职业生涯产生帮助的故事。

开源简介

大约13年前(在高中时),一个朋友(Netcyrax)向我介绍了开源社区。 他向我介绍了有关开放源代码及其运行方式的所有内容。 然后,他给了我一张Ubuntu CD,并告诉我Ubuntu正在通过发送免费副本来推广其操作系统。

第二天,我使用56k连接访问了www.ubuntu.com,并订购了50份Ubuntu。 我的意图是将它们出售给其他人,而不是免费提供。 那是15岁的我,我不了解开放源代码的目的。

无法理解目的

然后我开始编程。 我已经知道了开源,但实际上我不明白为什么我必须共享我的宝贵代码行。 为什么免费共享我花了几个月时间开发的程序源代码? 如果有人偷了怎么办? 如果我的“竞争对手”使用我的源代码来改进他们的产品怎么办?

当时我不明白的是,我不是一名杰出的软件开发人员,我的程序可以由经验丰富的软件开发人员在几天之内(而不是几个月)从头开始开发。

使用开源库很方便

是2008年,我有了第一部iPhone(3G)。 苹果宣布推出iOS 2和iOS SDK。 我决定(在业余时间)成为一名iOS开发人员。 由于还没有人使用过iOS SDK,因此我不得不自己学习开发应用程序。 我使用WebView创建了一个简单的应用程序,并且业务逻辑在使用JavaScript构建的Web应用程序内部。

我对iOS SDK感到非常失望(菜鸟开发人员+ Objective-C +手动引用计数=灾难),因此我暂停了本机iOS开发两年。 同时,我正在试验混合的SDK,例如Titanium,Adobe Air-ActionScript。

当我回到iOS 5(回到本机)时,一切都不同了。 在大约一个月的时间里,我设法构建了第一个真实的应用程序并将其上传到App Store。 但是发生了什么变化(自动引用计数除外)?

:iOS开发的开源社区。 ASIHTTPRequest(用于网络请求)和SDWebImage(用于下载和缓存图像)帮助我构建了第一个应用程序。

版本控制和GitHub

大多数开源项目和库都托管在Github上。 所以我当时使用Github下载我的库,但是由于我是在业余时间编程的,并且没有商业环境的经验,所以我不能说Git和Github之间的区别。

在构建了一些iOS应用之后,我对自己的技能充满信心,因此我决定申请iOS机会。

在第一次面试中的某个时刻:

-访者:您使用什么版本控制?

我是什么意思版本控制?

-访者:我的意思是您如何保留代码库的版本? SVN? 吉特?

-Me:时间机器(OS X的备份软件)!

因此,在与访问者进行了交谈之后,我决定我想了解更多有关Git(以及一般而言的版本控制)的知识,并希望在自己的项目中使用它。

我阅读了很多有关Git的文章,以及如何在团队中使用它。 我学会了在BitBucket存储库中使用“提交”和“推送”。 我将其用作代码的备份和版本控制,但不用作协作工具。

首次拉取请求

有一天,我正在寻找一个后端库来帮助我管理iOS和Android上的推送通知。 我找到了一个简单的开源库,它几乎就是我想要的。 我对其进行了修改以满足自己的需求,并修复了一些错误。 然后,我向存储库的所有者发送了一条消息,让他了解我添加到项目中的错误和其他功能。 所有者回来要求我为他的存储库创建一个“拉取请求”。

我很确定在我阅读的有关Git的所有文章中都提到了“ Pull Request”,但是由于我没有使用它,所以我忘记了它。 长话短说,我对“请求请求”进行了一些研究,通过反复试验,我设法创建了第一个“请求请求”。

在我的第一个“拉取请求”获得批准后,我感到很兴奋,并且我为要添加新功能的每个库发送“拉取请求”。

如您所见,我们在这里实现了双赢。 我做出了贡献,并改进了一个开放源代码库,开放源代码社区帮助我理解并正确使用了“拉请求”之类的协作工具。 作为自学成才的独立软件开发人员,我将无法学习如何正确使用Git。 我读了很多关于它的文章,但这只是理论上的事,我很亲切。 当然,这段时间我搞砸了很多自己的存储库,但至少有我自己的宠物项目,而不是我正在工作的公司(后来)。

观察其他软件开发人员的工作方式

自学成才的软件开发人员最困难的部分是您没有导师。

在我职业生涯的早期,我曾担任系统工程师,我很幸运能拥有我所能拥有的两个最好的导师。 我认为谁是优秀的导师? 那些具有深厚的技术知识并通过给您提示(而不是解决方案)来帮助您的人,然后在您弄糟时对您进行纠正。

由于没有人可以指导我们,因此我们需要自我指导。 因此,对于我正在使用的每个开源项目,我都会观察源代码(尤其是小型项目)。 然后,我对一些我不了解的事情或引发好奇心的方法进行了小型研究。 当我做出贡献并且被迫使用这种新方法时,那就更好了。

感谢开源,我们可以访问一些大型项目,例如iOS的Mozilla Firefox或iOS的WordPress。 好奇并观察此类项目将帮助您发展为Software Developer。

创建开源库

在某个时候,我创建了一个自定义的UIAlertView,并将其用于项目,因此我决定将其开源。 因此,我对其进行了修改,使其更具动态性,并将其上传到GitHub。 我还写了我的第一个文档,向其他开发人员解释如何在他们的项目中使用它。

可能没有人使用它,因为它是一个简单的项目,但是我对自己的贡献感到很好。

有一天,我正在做一个名为IT Buddy的宠物项目,我需要添加一个新功能。 该功能将先扫描网络(连接移动设备),然后显示网络中所有可用的设备。 对于网络/系统工程师进行故障排除时,这是非常有用的工具。

因为要做很多工作,所以我搜索了一个开源库,但是不幸的是我没有找到任何像样的库。 我发现一个旧的解决了一部分问题(仅扫描/ 24网络,仅显示主机的IP)。 而且,它很慢并且阻塞了应用程序的主线程。 因此,我分叉了该库并对其进行了修改。

我添加了一些功能,例如:

  • 显示设备的MAC地址
  • 根据MAC地址显示设备品牌
  • 显示设备的主机名(如果有)
  • 扫描任何子网(不仅是/ 24)

然后,我在GitHub上创建了一个新的存储库,并为iOS创建了自己的网络扫描器,称为MMLanScan(我之所以没有创建回原始项目的拉取请求,是因为它被放弃了)。

几天后,该资料库开始崭露头角,有几个叉子,还有一些打开的问题。 这些反馈鼓励我不断维护自己的存储库。

MMLanScan V2.0

旧的存储库有了很大的改进,但是我仍然对性能不满意。 因此,到了使用MMLanScan V2.0的时候了。

我创建了一个新分支,并从头开始。 考虑到其他库的工作原理,我试图保留相同的API,因此当开发人员更新库时,他们不必更改代码。

为了提高性能,我必须使用后台线程进行操作(如果是/ 24网络的常见情况,请ping并从254个主机中检索MAC地址)。 自从我将GCD用于简单任务以来,我就对多线程很熟悉,但是对于该项目,NSOperation和NSOperationQueue似乎是理想的API。 我过去曾使用NSOperations进行过试验,但没有在实际项目中进行过试验。

为了对可用主机执行ping操作,我使用了Apple的SimplePing。 SimplePing在使用GCD和NSOperation时遇到问题,因此我报告了Apple的错误。 他们回来解释这不是错误,并给了我提示如何解决此问题(RunLoops)。

几天后,我重写了MMLanScan,性能得到了极大的提高(速度提高了500%),结构更好,当然结果也更加准确。

同样,我们在这里有一个双赢的局面。 我创建了一个开源库来扫描设备网络中的主机(我知道这不是下一个SDWebImage,但是有些人会发现它很有用),但是我学到了很多新东西。

我从这个项目中学到了什么:

  • 保持相同的API可使更新过程更容易。
  • 在Git中为库版本创建“标签”。
  • 使用高级和低级多线程工具。
  • 为该项目编写好的文档。
  • 与Apple的工程师互动。
  • 使Objective-C库与Swift兼容。
  • 试用Swift来创建演示项目。

总结

我相信开源社区使我们的生活更轻松。 来自世界各地的软件开发人员正在合作创建数百万人使用的任何类型的库。

我个人觉得开放源代码社区为我提供了很多东西,是时候回馈些东西了。

作为自学成才的软件开发人员,您还必须与来自世界各地的其他软件开发人员保持同步。 如果您在开放源代码社区中很活跃,那么您将能够与最优秀的软件开发人员甚至更好的人员保持联系,从而与他们进行项目合作。