Skip to main content

Join an open source project to learn new things, meet amazing people and expand your horizons especially if you are a student

So a couple of years ago while I was in university I was really passionate about 3D graphics and making 3d models for games. But it was not enough to make 3D models, I wanted to get them into games. That's how I got into contact with open source project because the software used to get assets into games was an open source project.

And now that I think about it, it was totally worth it. I meet some really amazing people. For example, the project that I took over was developed initially by someone who eventually started working for Apple. I took a look at the code he wrote and figured out I can do the same without too much effort. So I continued his work. Now honestly it wasn't that complicated and I am not boasting here but at the same, it felt like something amazing for me. It was one of his first projects and later he moved on to much more complicated and serious stuff. The link for the project can be found here: https://github.com/Alecu100/maya_nif_plugin

I also got to learn some scripting languages that I didn't even know they existed. Most productivity software have these sort of scripting languages integrated into them.

By making contributions to that project I discovered that there were actually a series of projects closely related together. One of the major contributors to some of the most important projects actually worked for VMWare, you know the company that makes software for running virtual machines. I think he made some monitoring and statistics software for virtual machines in cloud judging by what he said. And he sure was smart. I mean he was smarter than me in almost every way. He always had a better idea prepared for me when I contradicted him and he just seemed like an endless source of knowledge. Despite working with web and cloud stuff, he had really good technical knowledge about games and how they worked. He actually wrote a game asset visualizer for Elder Scrolls and Fallout games which could also edit them in his free time. It is called NifSkope and it can be found here: https://github.com/niftools/nifskope

By then I also started interacting with people from a related project, a script extender for Fallout and Elder Scrolls games. Yes, these games actually have a built-in virtual machine into them that executes the scripts to make the game work. The scripting language is called Papyrus but it's not that complicated. It's a bit like plain C with functions and simple structures I think but also some events. Some of these functions are hooked directly to in-game methods to allow the scripts to edit the game state.

That's why these guys came up with a 3rd party program to add new functionalities to the scripting language. They used code injection techniques to add new code to the scripting engine. They connected existing methods in the game engine to the scripting engine to allow it to do more stuff. And they even extended the syntax of it to support arrays. They had a bit of work because they had to call some methods that were already compiled. You need to figure out the entry point for these methods to know the address where to call them and also the parameters that they require and how to pass them. It's actually a lot of x86 assembler stuff that I don't like that much. The program and source code can be found here: http://skse.silverlock.org/

And they were terrific programmers and developers in general. One guy actually worked for Facebook fulltime and he barely was in his third year of university back then. He was literally obsessed with performance and optimizations. I still think here he overdid it a bit focusing sometimes on things that really didn't matter and should not be optimized. But he just enjoyed it so much that he didn't care. He would constantly post on the group chat about the things he did eventually getting to the point that even I started learning the stuff he did. That why I know about method addresses and entry points. Now I didn't do much about that but someone more ambitious and smarter than me could have learned what he explained in the group chats and ask him for a recommendation maybe?
And in general just talking with this guy and other people about software engineering will help you a lot because you will learn a lot of new things without you even realizing it.

Another guy worked for Autodesk on CAD software if you know what that means. Autodesk is the biggest company that makes 3d software used in car industries and pretty much every modern movie. He was on the same team as the guy who worked at Facebook. But he was like 50 years old with years of experience and he worked on the same level as the guy from Facebook. He was smart but also really methodical and disciplined. He was also very fond of hypos for some reason which was quite funny. Also, he really didn't seem that old and would get our lame and offensive jokes pretty easily and reply back properly.

Another guy ran his own website with more than 12 million registered users. He started that website since he was just 12 or 13 years old by learning php and MySQL. He started it as a very simple website that hosted various small additions for games like Elder Scrolls Skyrim or Elder Scrolls Oblivion. He improved it incrementally in small steps and after a couple of years when the codebase was becoming too messy or new features became too hard to implement, he started a new cleaner version from scratch. Initially, he just accepted donations of just 1 dollar for the website to manage the hosting costs. This way he could run it without being a company and without needing any additional people to maintain it. Back then there weren't a lot of websites doing this and people were really looking for something like this. I think the years were between 2004 and 2007.

Once it reached a given threshold, he had so much revenue from the donations that he could actually start a company behind the website. He hired one or 2 people initially from the community behind the website. Yes, he also maintained a community for the website to help it flourish. That was one of his smartest moves. By having this community, it generated good content for the website which propelled its growth a lot. He was a pretty good community manager too. After more than 8 years it reached more than a couple of million users. But it took him 8 years of work. He also integrated several other projects started by other members of the community into the website like Oblivion Mod Manager or Fallout 3 Mod Manager: https://www.nexusmods.com/oblivion/mods/2097/

Now the website has more than 14 million registered users and generates a lot of revenue. The way he handled the website is a good idea to follow if you want to begin a startup. And as you have guessed the address is: https://www.nexusmods.com/

I only mentioned C++ projects but there were also python projects too in that community like a plugin for Blender 3D: https://github.com/niftools/blender_nif_plugin or another project: https://www.nexusmods.com/skyrim/mods/1840

Honestly speaking with these guys and working on projects with guys like this is the best way to prepare for interviews with specific big companies. And I haven't mentioned all the interesting people that I met working on these projects. There were a lot more.

These things are especially useful if you are a student and you really want to see the "world" of software engineering to figure out what you like and how things are out there. Honestly, in university, you are a bit cut off from the world. You get to work on some projects during university but nothing as fun and open-minded as open source projects. In these projects, you have no deadlines and nothing to lose so you can seriously experiment with all your crazy ideas that you have.

I learned a lot from these guys. They really knew how to come up with proper mechanics underneath their projects. They didn't necessarily think in algorithmic terms but rather came up with mechanics. I learned the mindset to come up with these mechanics and to think of every complicated piece of software as a system composed of various mechanics. They also were good at splitting their codebase into various components and then get them to work together. They were good designers of code which I also learned from them. In the end I learned that complicated software is made out of various small bits and the secret is to know how to combine these bits into something complicated or to split something complicated into various smaller bits. And not all the people involved in the projects were very technical which presented some new challenges for me. There had to be a way for technical and nontechnical people to collaborate between them. This is actually fairly important at a real job.

Also, I was pretty lucky because I already had a passion for 3D graphics which allowed me to easily find some easy projects to work on.

I general I suggest if you any other hobbies and passions besides programming that can benefit from programming, to use them. I know it's very hard in the beginning when you start working on a project to actually do anything. But even if you work for like 4 hours or 8 hours a week it will still make a difference. Initially, it will be really hard to start making any sort of meaningful changes to the project and it might take a while to get a grasp on the project. But eventually, you should understand the mechanics underneath.

Or if you have something that you do daily on the computer or phone and is a chore to you, you can find if there are any open source projects to help you do it faster. Or you can even start your own project.

If you want some web development you can look into some plugins for wordpress that happen to be open source projects. Or there are tons of javascript libraries that you could contribute to, things like javascript UI components such as calendars, dropdowns, treeviews and so on. Or you can learn node.js and look into some packages for it. Many of them should be open source projects. And node.js can be learned by a second-year student just by following tutorials on the internet by doing exactly what the presenter does.

Just look on GitHub for various open source projects. You can use tags when searching in GitHub to filter projects according to different technologies and platforms that you are interested in developing for. Here is a link to a LOT of GitHub node.js projects: https://github.com/topics/nodejs . I recommend to further filter that huge list by entering some keywords.

I don't recommend getting into big projects directly. You should look for smaller ones that have at most 200 commits. Any more than that and you will have a hard time figuring out the project. And then you will get demotivated and give up. 

This is also a great collection of open source projects: https://github.com/tjoen?tab=stars

Comments

Popular posts from this blog

Some software development common sense ideas

 I haven't really written here in a long time so it's time to write some new things. These are just some random common sense things that seemed to short to write about individually but seem really interesting and useful to me or other people 1. There is nothing fixed in software development, all things vary by circumstances and time Remember the documentation that didn't seem that important when you started the project, well after a couple of years one the application has grown and become really complicated, no one actually knows everything about the application anymore. So now you really need that documentation. What happens if you suddenly need much more people to develop the application because of some explosive growth? Without documentation, new developers will just look at the application like they look at a painting. This actually happened to me. Maybe in the beginning of a project, a technology really helped you a lot but as the project grew, it started making things

My thoughts as an experienced developer in this field.

To be honest, I would have never guessed that      I would end up saying these these things, especially jn the beginning of my career. As you become more experienced, you kind of get to see everything and you become less impressed by new things. Honestly there is some sort of repetitiveness in this field and we kind of like to reinvent the wheel quite often, because well, we become a bit too easily bored. Take for example how the web looks now, a lot of it has been borrowed from other places, mostly desktop development, especially the parts about making custom reusable components.  Or from older frameworks, like state management in the UI which actually was first properly implemented in Asp .Net Webforms, as far as I know, something like 20 years ago, where you used to have the dreaded view state.  But most likely something similar existed before that too. I was not that surprised when React adopted initially this idea. Or even less surprised when hooks where introduced that seemed a b

Some things which are often blindly applied and followed by developers which are not always good

This is probably one of the most controversial things that I have written so far but I am just tired of hearing about these things and discussing these things. Other developers that I know share part of my feelings. I would rather hear more about how people built things, overcame challenges or what new interesting ideas and concepts they implemented. Those things are really interesting and innovative, not hearing about the same theoretical things over and over again. I can just read and learn those things from 100 sources on the internet. Firstly, one of the most discussed and promoted things is agile/scrum development. I think I have been through 5-8 workshops about agile development methodology. And each time, some things differed. There is no 100% standard approach to this. Everyone uses their own version of this development methodology and seem to argue a lot that their approach is right and everyone else is doing it wrong. You go to an interview, this will be one of the first 10 t